我经常在网上看到用不同符号连接各种命令的教程。例如:
command1 | command2
command1 & command2
command1 || command2
command1 && command2
Run Code Online (Sandbox Code Playgroud)
其他人似乎将命令连接到文件:
command1 > file1
command1 >> file1
Run Code Online (Sandbox Code Playgroud)
这些是什么?他们叫什么?他们在做什么?还有更多吗?
我曾经相信打破列表中线条的适当方法是
command1 && \
command2
Run Code Online (Sandbox Code Playgroud)
原来不是这样,一个不需要 \
$ [ $(id -u) -eq 1000 ] &&
> echo yes
yes
Run Code Online (Sandbox Code Playgroud)
|以同样的方式处理管道。
关于流水线和列表的 bash 手册页部分没有对此进行任何说明。因此,我的问题是:\打破长行的正确用法是什么?
我已经习惯了 while 循环中bash的内置read函数,例如:
echo "0 1
1 1
1 2
2 3" |\
while read A B; do
echo $A + $B | bc;
done
Run Code Online (Sandbox Code Playgroud)
我一直在做一些make项目,拆分文件和存储中间结果变得谨慎。因此,我经常最终将单行分解为变量。虽然下面的例子效果很好,
head -n1 somefile | while read A B C D E FOO; do [... use vars here ...]; done
Run Code Online (Sandbox Code Playgroud)
这有点愚蠢,因为 while 循环永远不会运行超过一次。但没有while,
head -n1 somefile | read A B C D E FOO; [... use vars here ...]
Run Code Online (Sandbox Code Playgroud)
当我使用它们时,读取变量总是空的。我从未注意到 的这种行为read,因为通常我会使用 while 循环来处理许多类似的行。如何在没有 while 循环的情况下使用 …
我在命令替换中有一个很长的 bash 命令,如下所示:
$( comaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaand )
Run Code Online (Sandbox Code Playgroud)
我想知道是否有办法将此命令分成较短的行以提高可读性,如下所示:
$( com
aaaaaaaaaaaaaa
aaaaaaaaaaaaaa
nd )
Run Code Online (Sandbox Code Playgroud) 假设我有以下(毫无意义的)Bash 函数:
myfunc() {
ls
failfailfail
uptime
}
Run Code Online (Sandbox Code Playgroud)
我按如下方式运行它:
myfunc || echo "Something is wrong."
Run Code Online (Sandbox Code Playgroud)
我想要发生的是ls运行(因为它应该),failfailfail不起作用(因为它不存在),并且uptime不运行。该函数的返回值将是非零的,并且将显示错误消息。返回值不必是失败命令的确切退出状态,它不应该为零。
而实际上,我得到的输出ls,其次是“-bash:failfailfail:未找到命令”,然后输出uptime。错误消息未显示,因为失败的退出状态正在被吃掉。
set -e无论是在函数内还是在调用函数的作用域内,都没有任何有用的效果。我可以让它按照我想要的方式工作的唯一方法是:
myfunc() {
ls || return $?
failfailfail || return $?
uptime || return $?
}
Run Code Online (Sandbox Code Playgroud)
但这似乎非常重复和丑陋。有没有另一种方法来清理它?
我有一个while这种形式的循环:
while :; do
performTask1 || break
performTask2 || break
performTask3 || break
...
performTaskX || break
done
Run Code Online (Sandbox Code Playgroud)
基本上,只要其中一项任务出错,我就想跳出循环。有更好的方法来实现这一目标吗?
我想另一种方法是:
while :; do
performTask1 && performTask2 ... && performTaskX || break
done
Run Code Online (Sandbox Code Playgroud)
然而,这对我来说仍然很难看。
替代文字:
失败通常不会造成任何伤害,如果它安装了多个版本,则会增加其中一个是正确的机会。(注意:'yes' 命令和 '2>/dev/null' 是推荐的添加。)
使用这样一个尝试各种可能的安装方法直到找到一个可行的安装方法的脚本是一个好主意吗?
额外问题:您能想到应该添加到此脚本中的任何其他安装方法吗?
bash ×6
shell-script ×6
control-flow ×1
exit ×1
function ×1
pipe ×1
read ×1
shell ×1
subshell ×1