Bashスクリプトの空のパラメータテスト

Bashスクリプトの空のパラメータテスト

次のロジックを使用して簡単なスクリプトを作成しようとしています。最初の引数が有効な汎用ファイルの場合はforループを実行し、引数が指定されていない場合は「code2」を実行し、それ以外の場合は「code3」を実行します。以下のスクリプトは私がうまくいくようですが、引数なしで実行すると中断されます。

#!/bin/bash

if [ -f $1 ]; then
  for i in `cat $1`
  do
    <something>
  done
elif [ $# -eq 0 ]; then
  "code2"
else
  "code3"
fi

これはデバッグ出力で、最後に停止しました。

bash -x myscript
+ '[' -f ']'
++ cat

パラメータを提供していませんが、なぜ最初のif-thenフローに到達するのですか?私は初めてbashスクリプトに触れました。どんな助けでも大変感謝します。

ベストアンサー1

変数を参照しないと、"$1"何もなく消えます。その後、実行されるコードは次のとおりです(-xシェルオプションで報告されています)。

[ -f ]

ここでは、-f長さがゼロ以外の文字列のため、実際のテストはそのセクションを実行しますthen

(少なくとも)次のように書く必要があります。

[ -f "$1" ]

空の引数がある場合は、次のようになります。

[ -f "" ]

ファイル一致の失敗を報告します""

別の選択肢は、パラメータ拡張を使用することです(外部参照は必要ありません)。

[ -f ${1:-""} ]

""値が$1nullまたは空の場合はに展開されます。

そして、ファイル行を繰り返すためにforループを実行しないでください。while readループの使用を考慮する必要があります

#!/bin/sh

if [ -f ${1:-""} ]; then
  while read -r line; do
      echo '<something>'
  done <"$1"
elif [ "$#" -eq 0 ]; then
  echo "code2"
else
  echo "code3"
fi

おすすめ記事