渡されたパラメータを繰り返す必要があるスクリプトがあります。パラメータがで始まる場合は、-
それを文字列に入れてopts
からインポートする必要があります$@
。
opts=""
for arg in "$@"
do
if [[ "$arg" == -* ]]; then
opts="${opts} ${arg}"
# remove arg from $@ ??
fi
done
echo $@
echo $args
arg
渡されたパラメータ配列から削除するには$@
?
答え1
never で始まるオプションが-
引数を取らない場合は、次のようにします。opts
大量に:
for a; do
shift
case $a in
-*) opts+=("$a");;
*) set -- "$@" "$a";;
esac
done
(文字列にしたい場合は、にopts+=("$a")
変更してください。スニペットは標準シェルで機能します。)opts="$opts$a "
opts
答え2
bash、ksh、zshから拡張すると、次から始まるすべてのパラメータがクリアされます-
。
echo "${@##-*}"
そうではありません。削除するパラメータを空にしておくだけです。
-
ただし、空白と改行を処理できる一方で開始しないパラメータのリストを取得するのはかなり困難です。
単純なループを使用する方が良いです。
unset args opts;
for a; do
if [[ $a == [-]* ]]; then
opts+=("$a");
else
args+=("$a");
fi;
done;
printf '<%s> ' "${args[@]}"; echo;
printf '<%s> ' "${opts[@]}"; echo;