web-dev-qa-db-ja.com

bashスクリプトのいずれかのパラメーターがストリングと一致するかどうかを確認してください。

Bashスクリプトに渡されたパラメータのいずれかが文字列と一致するかどうかを確認したいスクリプトを作成しようとしています。今セットアップする方法は

if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]

しかし、パラメータが多数ある可能性があるので、これを行うより良い方法があるかどうか私は思っていませんでしたか?

ありがとう

編集:私はこのコードの塊を試してみて、オプション-disableVenusBldを付けてスクリプトを呼び出したが、それでも「Starting build」が表示されます。私は何か悪いことをしていますか?前もって感謝します!

while [ $# -ne 0 ]
do
    arg="$1"
    case "$arg" in
        -disableVenusBld)
            disableVenusBld=true
            ;;
        -disableCopperBld)
            disableCopperBld=true
            ;;
        -disableTest)
            disableTest=true
            ;;
        -disableUpdate)
            disableUpdate=true
            ;;
        *)
            nothing="true"
            ;;
    esac
    shift
done

if [ "$disableVenusBld" != true ]; then
    echo "Starting build"
fi
58
iman453

シェルスクリプトでオプション処理をしているようです。これがその慣用句です。

#! /bin/sh -

# idiomatic parameter and option handling in sh
while test $# -gt 0
do
    case "$1" in
        --opt1) echo "option 1"
            ;;
        --opt2) echo "option 2"
            ;;
        --*) echo "bad option $1"
            ;;
        *) echo "argument $1"
            ;;
    esac
    shift
done

exit 0

;;をインデントするには2つの規約があります。また、いくつかのシェルでは、ブレースのマッチングに役立つように、オプションを(--opt1)として指定することができますが、これが基本的な考え方です)

56
Norman Gray

これは私のために働きました。それはあなたが頼んだことを正確に行い、それ以上は何もしません(オプション処理なし)。それが良いか悪いかどうかはポスターのための演習です:)

if [[ "$*" == *YOURSTRING* ]]
then
    echo "YES"
else
    echo "NO"
fi

これは$*とbashスーパーテストの[[]]の括弧の特別な取り扱いを利用します。

22
Rich Homolka

パラメータスペース全体を(ワイルドカードで)検索するのはどうでしょうか。

if [[ $@ == *'-disableVenusBld'* ]]
then

編集:わかりました、わかりました、それでそれは普及した答えではありませんでした。これはどうですか、それは完璧です!

if [[ "${@#-disableVenusBld}" = "$@" ]]
then
    echo "Did not find disableVenusBld"
else
    echo "Found disableVenusBld"
fi

編集2:わかりました、わかりました、多分これは完璧ではありません... -paramがリストの先頭にあり、-paramXZYまたは-paramABCと一致する場合にのみ機能すると考えてください。私はまだ元の問題がbash文字列の操作で非常にうまく解決できると思います、しかし私はここでそれをかなり割れていません… - あなたはできますか?

8
Rich
disCopperBld=
for x; do
  if [ "$x" = "-disCopperBld" ]; then disCopperBld=1; break; fi
done
if [ -n "$disCopperBld" ]; then
  ...
fi

$3で始まるパラメーターのみをテストする必要がある場合は、関数で検索を行います。

## Usage: search_trailing_parameters NEEDLE NUM "$@"
## Search NEEDLE amongst the parameters, skipping $1 through ${$NUM}.
search_trailing_parameters () {
  needle=$1
  shift $(($2 + 2))
  for x; do
    if [ "$x" = "$needle" ]; then return 0; fi
  done
  return 1
}
if search_trailing_parameters -disCopperBld 2 "$@"; then
  ...
fi

しかし、そもそもなぜこれをやろうとしているのでしょうか。それは一般的な必要性ではありません。通常、オプションを順番に処理します。{ 前の質問に対するDennisの回答のように

2
Gilles