我正在编写一个需要执行一堆命令的 shell 脚本,并且每个命令都依赖于之前的每个命令。如果任何命令失败,整个脚本都应该失败,我会调用退出函数。我可以检查每个命令的退出代码,但我想知道是否有我可以启用的模式或让 bash 自动执行此操作的方法。
例如,执行以下命令:
cd foo || myfunc
rm a || myfunc
cd bar || myfunc
rm b || myfunc
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以让我在执行这些命令之前以某种方式向 shell 发出信号,如果其中任何一个失败,它应该调用 myfunc,这样我就可以写一些更简洁的东西,例如:
cd foo
rm a
cd bar
rm b
Run Code Online (Sandbox Code Playgroud) 我在这里读了一个很棒的问题,叫做“理解 IFS”。我很惊讶,因为答案和评论引用了 POSIX,它指出 IFS= 与取消 IFS 不同。如果您取消设置 IFS,显然会使用默认值。如果您将 IFS 设为 null,则没有拆分器。我知道我看到了不同的看法,我在我的书签中找到了这个:
$IFS
脚本中的第一条语句应该是
IFS=
它将输入字段分隔符重置为其默认值。否则,您将从用户那里继承 $IFS,用户可能将它设置为一些奇怪的值,以使 sh 解析字符串的方式与您期望的方式不同,并导致奇怪的行为。
那么前一段时间是真的还是作者错了?
是否有任何标准涵盖在同一行上的变量赋值后运行命令的可移植性?
APPLE="cider" echo hi
Run Code Online (Sandbox Code Playgroud)
这样的东西有多便携?它会在哪里工作,在哪里不会?
另外:如果这有什么不同,我的 shell 脚本以 #!/bin/sh 开头。
我正在尝试获取某些程序的输出并将它们分配给变量。我正在使用反引号来做到这一点,但如有必要,我可以切换到不同的方法。我注意到的是,我经常没有在变量中得到预期的输出。下面是一个简单的案例。我的实际例子更复杂。无论我在反引号中运行的程序的输出是什么,我都希望它在变量中。那可能吗?
test=`echo [asdf]`
Run Code Online (Sandbox Code Playgroud)
如果我echo $test只显示一个。