7

bash に次のコードがあるとします。

#!/bin/bash

bad_fruit=( apple banana kiwi )
for fname in `ls`
do
  # want to check if fname contains one of the bad_fruit
  is_bad_fruit=??? # <------- fix this line
  if [ is_bad_fruit ]
  then
    echo "$fname contains bad fruit in its name"
  else
    echo "$fname is ok"
  fi
done

fname に bad_fruit 文字列の 1 つが含まれている場合に true になるように is_bad_fruit を修正するにはどうすればよいですか?

4

2 に答える 2

7

次のコードを試してください:

#!/bin/bash

bad_fruit=( apple banana kiwi )
re="$(printf '%s\n' "${bad_fruit[@]}" | paste -sd '|')"

for fname in *; do
  # want to check if fname contains one of the bad_fruit
  if [[ $fname =~ $re ]]; then
    echo "$fname contains bad fruit in its name"
  else
    echo "$fname is ok"
  fi
done

ls の無用な使用に注意する

lsファイル情報をインタラクティブに見るためのツールです。その出力は人間用にフォーマットされており、スクリプトでバグを引き起こします。グロブを使用するか、代わりに検索してください。理由を理解してください: http://mywiki.wooledge.org/ParsingLs

于 2012-10-07T11:15:03.360 に答える
2

別のオプション (grep内部ループを使用して終了コードを評価する):

#!/bin/bash

bad_fruit=( apple banana kiwi )
for fname in *; do
  for fruit in "${bad_fruit[@]}"; do
    echo "$fruit"
  done | grep "$fname"
  if [ $? -eq 0 ]; then
    echo "$fname contains bad fruit in its name"
  else
    echo "$fname is ok"
  fi
done
于 2012-10-07T11:50:22.070 に答える