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最初のケースでは、コマンドの呼び出しの終了ステータスを取得しています(生成したサブシェル$()は最後の終了ステータスを保持します)。

[[ ]]2 番目のケースでは、 Bash ビルトインへの呼び出しの終了ステータスを取得しています。ただし、これは実際にはコマンドの出力をテストしているため、まったく異なる操作です。tailその出力はemptyであるため、テストは失敗します。

検討 :

$ [[ "" ]]           # 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 に答える