Bash if / else在运行命令时存在状态

时间:2016-07-01 13:00:32

标签: bash

bash编程新手。希望通过捕获命令的退出状态并将响应打印到屏幕来编程if / else。

例如,其中一个命令可能是创建交换文件。

printf ("Creating swap file...", %)
fallocate -l 4G swapfile

if [ $? ]
  echo "ok"
else
  echo "failed"
fi

屏幕输出应如下所示:

Creating swap file...                 ok

问题:

printf是否是正确的命令,如果是,我将如何使用%?

如何比较通过/失败的现有状态?

如果使用了多个命令,它只会使用上次存在的状态,还是会导致任何一个命令失败并报告失败'?

5 个答案:

答案 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