6

ディレクトリのリストが存在するかどうかをチェックするスクリプトを使用したいと同時に、送信しているカスタム メッセージを出力する必要があります。

例えば:

ディレクトリが存在するかどうかを検証するスクリプトがあります。

**check.sh**

for i in $*
   if [ -d "$i" ]; then
      echo Found <msg-i> directory.
   else
       echo <msg-i> directory not found.

このスクリプトを次のように呼び出したいと思います。

./check.sh $DIR1 msg1 $Dir2 msg2 $Dir3 msg3

したがって、DIR1 が存在しない場合は、「msg1 ディレクトリが見つかりません」というメッセージを表示したいと思います。同様に、DIR2 についても「msg2 ディレクトリが見つかりません」と表示したいと思います。ここで msg1 と msg2 は、文字列として渡したいものです。これを達成する方法は?私はbashシェルを使用しています。

4

3 に答える 3

7

これを試して:

while [ -n "$1" ]
do
    dir="$1"
    msg="$2"
    if [ -d "$dir" ]; then
        echo "$msg dir FOUND"
    else
        echo "$msg dir NOT FOUND"
    fi
    shift 2
done

shift <n>コマンドは、n 位置のスクリプトに渡された定位置パラメーターを左にシフトするだけです。たとえば、次のようにスクリプトを呼び出す場合:

./myscript 1 2 3 4

$1は「1」と$2「2」

shift 2しかし、あなた$1が「3」で$2「4」の場合。

このようにして、ループ$1は、パラメーターが空の文字列 ( -n "$1") になるまで、サイクルごとに 2 つのパラメーターを消費します。

while条件は次のようによりエレガントに記述できます。

while (( $# ))

同じ結果が得られます。

2 番目のパラメーター ( while [ -n "$2" ]) を確認することもできますが、これにより、ユーザーが奇数のパラメーターを指定した場合の動作が変わります。

  • 最初のケースでは最後のディレクトリがチェックされますが、$msg空であるため奇妙なメッセージが表示されます
  • 2番目のケースでは、奇妙なメッセージは表示されませんが、最後のディレクトリは黙ってチェックされません

最初のテスト パラメータの改善:

if (( $# % 2 ))
then
    echo "Provide an even number of parameters"
    exit 1
fi
于 2013-05-24T12:29:31.897 に答える
4

チェプナーは次のように述べています。

while 条件は、単純に(( $# ))(位置パラメーターの数がゼロでないかどうかをテストする) にすることができます。

チャイタンヤ 言います:

こんにちは Chepner、別の解決策を提供してくれてありがとう。 $# を使用するために while 条件が実際にどのように見えるか教えてください。さまざまな方法を試しましたが、うまくいきません。

簡単なサンプルを次に示します。

while (( $# ))
do
   dir=$1
   msg=$2
   shift 2
   [...]
done

while (( $# ))コマンドライン引数がある限り、これは真です。2shift回実行すると、リストから引数が削除されます。引数がなくなると、while ループが終了します。

于 2013-05-24T13:56:57.947 に答える