bash编程新手。希望通过捕获命令的退出状态并将响应打印到屏幕来编程if / else。
例如,其中一个命令可能是创建交换文件。
printf ("Creating swap file...", %)
fallocate -l 4G swapfile
if [ $? ]
echo "ok"
else
echo "failed"
fi
屏幕输出应如下所示:
Creating swap file... ok
问题:
printf是否是正确的命令,如果是,我将如何使用%?
如何比较通过/失败的现有状态?
如果使用了多个命令,它只会使用上次存在的状态,还是会导致任何一个命令失败并报告失败'?
答案 0 :(得分:3)
你可以这样做:
printf "Creating swap file..."
if fallocate -l 4G swapfile; then
echo " ok"
else
echo " failed"
fi
if
之后的“条件”是一个任意命令。如果成功(退出状态0
),则执行then
块,否则执行else
块。满足您要求的最简单方法是将您的命令放在if
。
答案 1 :(得分:3)
if
语句的目的是检查命令的退出代码。
if fallocate -l 4G swapfile; then
echo "Success."
else
echo "Failure."
fi
如果您输入复合命令或管道,则结果是最后一个命令的状态。这就是shell的工作方式,并不是if
特有的。
if false; true; then
echo "Always true"
fi
命令[
检查其论点;如果它是非空的,它将返回true,因为当你检查的值是$?
时,它总是会返回。你可以说[ $? -eq 0 ]
但这显然只是一种不必要的并发症。事实上,直接检查$?
几乎是不必要的;它是一个常见的反模式(虽然你看到了很多,因为大多数shell脚本是由从未正确学习过该语言的初学者编写的。)
printf
命令通常优先于echo
,但语法不正确。尝试
printf "Creating swap file...\n"
如果您不想换行,请忽略\n
。
答案 2 :(得分:1)
这是你的代码:
printf ("Creating swap file...", %)
fallocate -l 4G swapfile
if [ $? ]
echo "ok"
else
echo "failed"
fi
您奇怪地使用printf
。这是一个普通的shell命令,因此不需要括号。此外,尾随%
看起来不合适。在这种情况下,在代码中的那一点上,除了静态字符串之外,您没有其他输出,因此不需要格式说明符。所以,是,printf
是在这里使用的正确命令,因为它不会在输出结束时输出换行符,除非你告诉它。
如果您只想对fallocate
的退出状态采取行动,那么您可以直接将命令放在if
- 语句中,如下所示:
printf "Creating swap file...\t"
if fallocate -l 4G swapfile; then
echo "ok"
else
echo "failed"
fi
如果您有管道,管道的退出状态将是管道中 last 命令的退出状态:
if cmd1 | cmd2 | cmd3; then
# ...
fi
对于cmd;cmd
,{cmd;cmd}
,(cmd;cmd)
等复合命令也是如此。
要让管道在bash
中的管道 中返回 last命令的退出状态,您需要设置pipefail
选项:
set -o pipefail
要获得bash
中的中间管道命令的退出状态,您可以在执行管道后检查PIPESTATUS
数组:
$ false | true | true | false
$ echo ${PIPESTATUS[@]}
1 0 0 1
答案 3 :(得分:0)
您需要在if语句中使用表达式http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html:
#!/bin/bash
# ...
if [ $? -eq 0 ]; then
echo "ok"
else
echo "failed"
fi
exit 0
最佳, 儒略
答案 4 :(得分:0)
这应该做你需要的。打印Creating....
后,它将省略换行符。然后它将检查输出并在同一行上打印“ok”或“error”。
echo -n "Creating swap file ... "
fallocate -l 4G swapfile
local status=$?
if [ $status -ne 0 ]; then
echo "error"
else
echo "ok"
fi
return $status