パラメータに基づいて分岐したいスクリプトがあります。
デフォルトでは、このパラメータはブール値と同じです。しかし、私はユーザーがシェル実行コマンドにゴミを入力し、それをtrueと解釈したくありません。
または、大文字と小文字の区別の問題などを考慮する必要がある文字列がいくつかありません。
私が望む最終結果は次のとおりです。
some_script.sh arg1 arg2 arg3 --remove
する:
PARAM1="$1"
PARAM2="$2"
PARAM3="$3"
REMOVE=?--> what here
if [ $REMOVE ]; then
# remove some files
fi
答え1
文字列が--remove
スクリプトの位置パラメータにあることを確認するだけです。正規表現一致演算子を使用したbashバージョン=~
:
#!/bin/bash
if [[ $@ =~ --remove ]]; then
echo "removing files"
fi
exit
POSIXバージョン:
#!/bin/sh
for arg in "$@"; do
if [ "$arg" = "--remove" ]; then
echo "removing files"
fi
done
exit
答え2
$1
友達は固定パラメータセットを持つスクリプトでは比較的うまく機能しますが、動的パラメータを持つスクリプトでは実際にはうまく機能しません。これを行うには、ループとケース構成を使用する必要があります。
REMOVE=
for arg in "$@"; do
case "$arg" in
--remove)
REMOVE=1
;;
*)
if [ ! -z "$REMOVE" ]; then
# whatever you need to do to remove
else
# whatever you need to do if you do not want to remove
fi
;;
esac
done
--remove がその後の引数にのみ適用されると記録するとうまくいきます。これにより、削除は一部の引数にのみ適用され、他の引数には適用されないハイブリッドコマンドラインを持つことができます。
script.sh arg1 arg2 --remove arg3
上記の例では、--remove
arg3では機能しますが、arg1またはarg2では機能しません。--noremove
ケース構造にコマンドラインオプションのサポートを追加することもできます。
case "$arg" in
--noremove)
REMOVE=
;;
--remove)
# ... rest of the case remains as is from before
esac
これにより、次のことが可能になります。
script.sh --remove arg1 --noremove arg2 --remove arg3
この例では、--remove
オプションはarg1とarg3には適用されますが、arg2には適用されません。
--remove
最後に、コマンドラインに表示される場所に関係なく、すべての引数に適用したい場合は、おそらく最も簡単な方法は次のようにしますgetopt(1)
。
# reorder the command line so that option arguments come first
# and non-option arguments come second, separated by "--"
PARSED=$(getopt -o '' --long remove -n scriptname.sh -- "$@")
# overwrite $@ with the contents of the newly created $PARSED
# Note the quotes; they are essential
eval set -- "$PARSED"
REMOVE=
while true; do
case "$1" in
--remove)
REMOVE=1
shift
;;
--)
shift; break;
esac
done
for arg in "$@"; do
if [ ! -z "$REMOVE" ]; then
# whatever you need to do to remove
else
# the other thing
fi
done
引数は-o
短いオプションを取るので、必要に応じてそのオプションを代わりにgetopt
使用できます-r
。--remove
Getoptには、オプション(オプション)にパラメータなどが含まれることを望むいくつかの追加オプションがあり、ユーザーがスクリプトが認識しないオプションを提供するときに無料のデフォルトの使用法出力を許可します。 GNU getoptには、Debian(およびその派生物)のすべての可能性を示す例があります。/usr/share/doc/util-linux/getopt-parse.bash