25

開発ワークフローを効率化するためにシェル スクリプトを作成しています。

どのテーマ フォルダで作業するかについての引数を取り、grunt watchそのディレクトリから開始します。

必要な引数を指定せずにスクリプトを呼び出すと、コマンド ライン引数としてテーマを指定する必要があるという警告が表示されます。

テーマディレクトリなど、利用可能なオプションのリストを印刷したい

これは私がこれまでに持っているものです...

THEME=$1

if [ $THEME == '' ]
then
    echo 'Need to specify theme'
else
    cd 'workspace/aws/ghost/'$THEME'/'
    grunt watch
fi

理想的には、echo行の出力を次のlsようにテーマの親ディレクトリに置き換えます

THEME=$1

if [ $THEME == '' ]
then
    echo 'Need to specify theme from the following'
    ls workspace/aws/ghost
else
    cd 'workspace/aws/ghost/'$THEME'/'
    grunt watch
fi

ただし、これにより次のエラーが発生します

./ghost_dev.sh: line 3: [: ==: unary operator expected
4

3 に答える 3

57

ここで引用符が必要$THEMEです:

if [ $THEME == '' ]

それ以外の場合、テーマを指定し$THEMEないと何も展開されず、シェルに次の構文エラーが表示されます。

if [ == '' ]

引用符を追加すると、次のようになります。

if [ "$THEME" == '' ]

空の展開は、$THEME代わりに次の有効な比較を生成します。

if [ "" == '' ]

実行時の構文エラーに対するこの容量は、より伝統的なプログラミング言語のバックグラウンドを持っている人にとっては驚くかもしれませんが、コマンド シェル (少なくとも Bourne の伝統にあるもの) はコードを多少異なる方法で解析します。多くのコンテキストでは、シェル パラメーターは変数よりもマクロのように動作します。この動作は柔軟性を提供しますが、不注意な人の罠も作成します。

この質問にbashというタグを付けたので、bash (および ksh/zsh) で利用可能な「新しい」テスト構文、つまり[[...内のパラメーター展開の結果に対して単語分割が実行されないことに注意してください]]。したがって、これを行うこともできます:

if [[ $THEME == '' ]]

引用なしで逃げることができる場所はここにリストされています. ただし、明示的に単語分割が必要な場合を除いて、とにかく常にパラメーター展開を引用するのは良い習慣です (その場合でも、代わりに配列が問題を解決するかどうかを確認してください)。

-z空の文字列との同等性ではなく、テスト演算子を使用する方が慣用的です。

if [ -z "$THEME" ]

この単純なケースでは、技術的には引用符は必要ありません。[ -z ]true と評価されます。ただし、より複雑な式を使用すると、パーサーが混乱するため、常に引用符を使用することをお勧めします。もちろん、[[...]]ここでも必要ありません。

if [[ -z $THEME ]]

しかし[[...]]は POSIX 標準の一部ではありません。さらに言えば、どちらでもありません==。そのため、他の POSIX シェルとの厳密な互換性を気にする場合は、クォート ソリューションに固執し、いずれか-zまたは単一の=.

于 2013-10-30T18:33:59.730 に答える
4

[ "$THEME" ]$THEMEが未定義または空の文字列の場合は false と評価され、それ以外の場合は true と評価されます。http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html#Bash-Conditional-Expressionsを参照してください。if ステートメントを再配置して、この動作を利用し、さらに単純な条件を設定できます。

[ "$テーマ" ]; それから
    cd 'workspace/aws/ghost/'$THEME'/'
    いなり時計
そうしないと
    echo '以下からテーマを指定する必要があります'
    ls ワークスペース/aws/ゴースト
フィ

"$THEME"値に空白が含まれている場合は、二重引用符で囲む必要があります。

于 2013-10-30T20:04:24.783 に答える
-1

二重引用符で構文を修正してください。

 if [ "$THEME" == "" ]; then
     echo 'Need to specify theme from the following'
     ls workspace/aws/ghost
 fi
于 2013-10-30T18:41:10.393 に答える