0

在下面的代码中,我试图检查if条件内的命令是否成功完成以及数据是否已推送到目标文件 temp.txt。

考虑:

#!/usr/bin/ksh

A=4
B=1

$(tail -n $(( $A - $B )) sample.txt > temp.txt)
echo "1. Exit status:"$?

if [[ $( tail -n $(( $A - $B )) sample.txt > temp.txt ) ]]; then
    echo "2. Exit status:"$?
    echo "Command completed successfully"
else
    echo "3. Exit status:"$?
    echo "Command was unsuccessfully"
fi  

输出:

$ sh sample.sh
1. Exit status:0
3. Exit status:1

现在我不明白为什么上面的退出状态会发生变化..当尾命令的两个实例的输出相同时。我在哪里错了..?

4

1 回答 1

1

在第一种情况下,您将获得对tail命令的调用的退出状态(您生成的子shell$()保留了最后的退出状态)

在第二种情况下,您将获得对[[ ]]Bash 内置调用的退出状态。但这实际上是在测试你的命令的输出tail,这是一个完全不同的操作。并且由于该输出为,因此测试失败。

考虑 :

$ [[ "" ]]           # Testing an empty string
$ echo $?            # exit status 1, because empty strings are considered equivalent to FALSE
1
$ echo               # Empty output

$ echo $?            # exit status 0, the echo command executed without errors
0
$ [[ $(echo) ]]      # Testing the output of the echo command
$ echo $?            # exit status 1, just like the first example.
1
$ echo foo
foo
$ echo $?            # No errors here either
0
$ [[ $(echo foo) ]]
$ echo $?            # Exit status 0, but this is **NOT** the exit status of the echo command.
0
于 2013-04-17T11:53:37.423 回答