web-dev-qa-db-ja.com

tputコマンドがifステートメントで機能しない

Bashスクリプトのifステートメントでtputコマンドを使用しようとしていますが、何らかの理由で予期しない動作をしています。コマンドを実行してからifステートメントでのみ終了コードをチェックすると正しく機能しますが、ifステートメントでコマンドを直接実行すると機能しなくなります。これが私の問題を説明するための簡単なスクリプトです:

#!/bin/bash

tput setaf 1
if [ $? ]
then
  echo "first if works"
fi

if tput setaf 1
then
  echo "second if works"
fi

このスクリプトを実行すると、「最初に機能する場合」のみが出力されます。これらのifステートメントは同等であるため、両方とも機能するべきではありませんか?私は何かが足りないのですか?ところで、これは重要な場合に備えてFreeBSDで実行されています。

1
Harry Muscle

これらのステートメントは同等ではありません。

最初の $?が空でない文字列であるかどうかをチェックしています ;常にそうなるので、最初のifの本体は常に実行されます。 [string]

文字列stringがnull文字列でない場合はTrue。それ以外の場合はfalse。

2番目の tput setaf 1が成功したかどうか、またはその終了ステータス(したがって$?)がゼロかどうかをチェックしています 。 2番目のifの本体は、tputコマンドが成功した場合にのみ実行されます。ほぼ同等です

tput setaf 1
if [ $? -eq 0 ]
...

説明している結果は、tput setaf 1がゼロ以外のコード(たとえば、1)で終了していることを示しています。 「1」は空ではない文字列ですが、ゼロではありません。 tput setaf 1 ; echo $?は、実際のコードが何であるかを示し、さらに調査することができます。

8
Michael Homer