
ユーザーにコメントを残すように依頼します。
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" ]
この特別な場合は$COMMENT
null でないかどうかをテストします。かっこ内には2つのシェル語しかないので、これはショートカットです。通常、文字列が空でないかどうかをテストする方法は、文字列が空であるかどうかをテストする-n
演算子を使用することです。-z
if [ -z "$COMMENT" ]
[[ … ]]
ksh / bash / zshでは、コマンドの代わりに設定を使用できます[ … ]
。単一の括弧は一般的なシェル構文規則が適用される一般的なコマンドですが、二重括弧は独自の規則を持つ特殊なシェル構文です。二重括弧内には噴射がないので、次のように書くことができます。
if [[ -z $COMMENT ]]
二重引用符は問題ありません。
または、if [ ! $1 ]
必要がある場合にも同様に適用されます。if [ -z "$1" ]
if [[ -z $1 ]]
もう一つの奇妙なことは、COMMENT
コメントが関数に引数として渡されると変数を環境にエクスポートしますが、組み込みread
関数を使用して読み取るときはそうではありません。外部プログラムに渡す必要がない場合は、COMMENT
単語を削除してくださいexport
。
答え2
[
Bashはこれをコマンドとして解釈しますtest
(引数の周りにスペースが必要です)。バラよりテストと条件に関するGregのwiki...