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
シェルスクリプトでオプション処理をしているようです。これがその慣用句です。
#! /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)
として指定することができますが、これが基本的な考え方です)
これは私のために働きました。それはあなたが頼んだことを正確に行い、それ以上は何もしません(オプション処理なし)。それが良いか悪いかどうかはポスターのための演習です:)
if [[ "$*" == *YOURSTRING* ]]
then
echo "YES"
else
echo "NO"
fi
これは$*
とbashスーパーテストの[[
…]]
の括弧の特別な取り扱いを利用します。
パラメータスペース全体を(ワイルドカードで)検索するのはどうでしょうか。
if [[ $@ == *'-disableVenusBld'* ]]
then
編集:わかりました、わかりました、それでそれは普及した答えではありませんでした。これはどうですか、それは完璧です!
if [[ "${@#-disableVenusBld}" = "$@" ]]
then
echo "Did not find disableVenusBld"
else
echo "Found disableVenusBld"
fi
編集2:わかりました、わかりました、多分これは完璧ではありません... -paramがリストの先頭にあり、-paramXZYまたは-paramABCと一致する場合にのみ機能すると考えてください。私はまだ元の問題がbash文字列の操作で非常にうまく解決できると思います、しかし私はここでそれをかなり割れていません… - あなたはできますか?
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の回答のように 。