0

ワイルドカードを使用して、Bashスクリプトに1つ以上のディレクトリが存在するかどうかを確認したいと思います。

私はこれを試しました。

if [ -d app/*management ]
then
    for mscript in `ls -d app/*management`
    do
        ...
    done
fi

これは、一致が1つある場合に機能しますが、「二項演算子が必要です」というエラーをスローします。

これを行うための良い方法について何か提案はありますか?

4

3 に答える 3

4

式に&&(and)がないと、-dを使用して複数のディレクトリを同時にチェックすることはできません。私はこれを使用します:

for dir in app/*management; do
   if [[ -d $dir ]]; then
      ...
   fi
done

lsの出力を解析する代わりにグロブを使用する必要があります。詳細については、次のリンクを参照してください:http: //mywiki.wooledge.org/ParsingLs

于 2012-05-18T13:16:19.227 に答える
2

globが管理ディレクトリのリストに展開されると、ifステートメントは次のようになります。

if [ -d app/1management app/2management ]

-d引数を取るのは1つだけなので、bashは残りのディレクトリをどう処理するかを知りません。bashするには、二項演算子を含めるのを忘れたようです。

次のことを行うことができます。

for mscript in app/*management; do
    if [ ! -d $mscript ]; then
        continue
    fi
    ...
done

nullglob編集:ヨルダンがコメントしたように、以下はおそらく必要ではありませんが、知っておくとよいので、参考のためにここに残しておきます。

1つの警告。app / * managementが何にも展開されない可能性がある場合は、nullglobループの前にシェルオプションを設定する必要があります。そうしないと、「app /*management」はシェルグロブではなくリテラル文字列として扱われます。

if ! shopt nullglob; then
   setting_nullglob=1
   shopt -qs nullglob
fi
for mscript in app/*management; do
...
done
if [ ${setting_nullglob:-0} = 1 ]; then
    unset setting_nullglob
    shopt -qu nullglob
fi
于 2012-05-18T13:25:24.797 に答える
2

次のようにしてみませんか。

for mscript in app/*management ; do
  if [ -d "$myscript" ] ; then
    ...
  fi
done
于 2012-05-18T13:14:37.243 に答える