bashスクリプトに渡されたパラメータが文字列にマッチするかどうかをチェックするスクリプトを書こうとしています。現在の設定は以下のようになっています
if [ "$3" != "-disCopperBld" -a "$4" != "-disCopperBld" -a "$5" != "-disCopperBld" -a "$6" != "-disCopperBld"]
が、パラメータの数が多いかもしれないので、何か良い方法はないかな?
Thanks
EDIT: このコードの塊を試してみましたが、-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
85 None 2010-09-08
シェルスクリプトでオプション処理をしているようですね。そのための慣用句がここにあります
#! /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
(;;
のインデントにはいくつかの規則があり、シェルによっては中括弧のマッチングを助けるためにオプションを (--opt1)
として指定できるものもありますが、これが基本的な考え方です)
71 Norman Gray 2010-09-08
これは私には効きました。これはあなたが尋ねたことを正確に行い、それ以上のことは何もしません(オプション処理はしません)。それが良いか悪いかは、ポスターのための練習です 🙂
if [[ "$*" == *YOURSTRING* ]]
then
echo "YES"
else
echo "NO"
fi
これは、$*
とbashのスーパーテスト[[
…]]
の括弧の特別な処理を利用しています
45 Rich Homolka 2010-09-08
パラメータ空間全体を(ワイルドカードを使って)検索してみてはどうでしょうか
if [[ $@ == *'-disableVenusBld'* ]]
then
編集: OK, OK, OK, だから人気のある答えではありませんでした。これはどうですか、それは完璧です!
if [[ "${@#-disableVenusBld}" = "$@" ]]
then
echo "Did not find disableVenusBld"
else
echo "Found disableVenusBld"
fi
編集2: OK、OK、これは完璧ではないかもしれません…これは、-paramがリストの先頭にある場合にのみ動作し、-paramXZYや-paramABCにもマッチすると思います。私はまだ元の問題はbashの文字列操作で非常にうまく解決できると思っていますが、ここではまだ完全には解けていません…-使えるのかな?
9 Rich 2015-11-19
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
しかし、私はあなたがそもそもなぜこれをしようとしているのか疑問に思います、それは一般的な必要性ではありません。通常は、以前の質問に対するデニスさんの回答のように、順にオプションを処理するでしょう
4 Gilles ‘SO- stop being evil’ 2010-09-08
[[ "$@" =~ '-disableVenusBld' ]] && disableVenusBld=true
[[ "$@" =~ '-disCopperBld' ]] && disCopperBld=true
[[ "$@" =~ '-disableTest' ]] && disableTest=true
[[ "$@" =~ '-disableUpdate' ]] && disableUpdate=true
もっと言えば
[[ "$@" =~ 'your-string' ]] && ( doSomething )
-1 user1016765 2020-10-24