Unix read -pコマンドでbashエラーが発生するのにどのように解決しますか?

Unix read -pコマンドでbashエラーが発生するのにどのように解決しますか?

ユーザーにコメントを残すように依頼します。

function comment {
  if [ ! $1 ]
  then
   read -p "enter checkin comment < " COMMENT;     
  else
   export COMMENT="$1"
  fi 

  if [ ! $COMMENT ]
  then
    echo 'no comment!'
  else
    echo "$COMMENT";
  fi  
}

修正する プロンプトに複数の単語を入力すると、これが発生します。たとえば、「update」と入力するとエラーメッセージは表示されませんが...複数の単語を入力すると

enter checkin comment >> sun mars venus

これによりエラーが発生します(常に2番目の単語で)。

-bash: [: mars: binary operator expected

ベストアンサー1

if [ ! $COMMENT ]

空でないことを確認したいと思いますが、$COMMENTこのコマンドが実行する操作ではありません。引用符のない変数置換は、ファイル名の生成(ワイルドカード)とトークン化を受けます。ここでsun mars venusコメント()に数語を入力すると、[コマンドが! sun mars venus有効な構文ではなく(4つのパラメータ)を見ることができます。変数置換は常に二重引用符で囲みます。

if [ ! "$COMMENT" ]

この特別な場合は$COMMENTnull でないかどうかをテストします。かっこ内には2つのシェル語しかないので、これはショートカットです。通常、文字列が空でないかどうかをテストする方法は、文字列が空であるかどうかをテストする-n演算子を使用することです。-z

if [ -z "$COMMENT" ]

[[ … ]]ksh / bash / zshでは、コマンドの代わりに設定を使用できます[ … ]。単一の括弧は一般的なシェル構文規則が適用される一般的なコマンドですが、二重括弧は独自の規則を持つ特殊なシェル構文です。二重括弧内には噴射がないので、次のように書くことができます。

if [[ -z $COMMENT ]]

二重引用符は問題ありません。

または、if [ ! $1 ]必要がある場合にも同様に適用されます。if [ -z "$1" ]if [[ -z $1 ]]

もう一つの奇妙なことは、COMMENTコメントが関数に引数として渡されると変数を環境にエクスポートしますが、組み込みread関数を使用して読み取るときはそうではありません。外部プログラムに渡す必要がない場合は、COMMENT単語を削除してくださいexport

おすすめ記事