if文でtputコマンドが機能しません。

if文でtputコマンドが機能しません。

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

このスクリプトを実行すると、「first if Works」のみが印刷されます。これら2つのifステートメントは同じなので、うまくいきませんか?私は何を逃したことがありませんか?ところで、重要な場合はFreeBSDで実行されています。

ベストアンサー1

この声明は同じではありません。

最初$?空でない文字列を確認しています;常にそうするので、最初の体はif永遠に走るでしょう。[string]はい

文字列が真の場合ひも空の文字列ではありません。それ以外の場合は false です。

第二tput setaf 1成功したか終了ステータスが(したがって$?)ゼロであることを確認しています。。 2番目の関数の本文は、コマンドが成功した場合ifにのみ実行されます。tputおおよそ次のようになります。

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

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

おすすめ記事