スクリプトのシェル・パラメーターに特定のパラメーター「java8」があることを確認している場合は、それらを削除する必要があります。また、他の変数に保存したいのですが、$ *では削除したいと思います。
argが存在するかどうかを確認するためにgetoptsを使用してみましたが、引数を削除する方法がわかりません。
注 - 「java8」位置の引数の確認は不明です。どこにいても構いません。
while getopts "f:" flag
do
case $flag in
f)
echo $OPTARG
;;
esac
done
echo $*
~
だから基本的に私が電話したとき -
./test.sh arg1 arg2 -f java8 arg3
getoptsブロックを実行した後、残りのパラメータは次のようになります。
パラメータ1、パラメータ2、パラメータ3
答え1
POSIXシェル(一時配列を使用しない)の場合:削除されたオプションの数を計算しながら、位置引数リストの後に-f
あるか、または位置引数リストからすべてのインスタンスを削除しますjava8
。引数は変数に含まれます。-fjava8
found
skip=0 found=0
for arg do
case $1 in
-f)
if [ "$2" = java8 ]; then
skip=2
found=$(( found + 1 ))
fi
;;
-f*)
if [ "$1" = -fjava8 ]; then
skip=1
found=$(( found + 1 ))
fi
esac
if [ "$skip" -eq 0 ]; then
set -- "$@" "$1"
else
skip=$(( skip - 1 ))
fi
shift
done
if [ "$skip" -eq 1 ]; then
set -- "$@" -f
found=$(( found - 1 ))
fi
printf 'Args: %s\n' "$*"
printf 'Found = %d\n' "$found"
上記のループには、位置パラメータの初期数と同じ繰り返しがあります。
最初の位置引数がある場合は、-f
2番目の位置引数があるかどうかをテストしますjava8
。テストが次の場合本物、これら2つのパラメータをスキップする必要があるため、カウンタはskip
2に設定されます。また、found
他のインスタンスが見つかったことを示すために増加します-f java8
。
最初の位置引数がある場合、-fjava8
この単一引数はスキップする必要があるため、カウンタはskip
1に設定されます。また、found
他のインスタンスが見つかったことを示すために増加します-fjava8
(findと同じ-f java8
)。
このステートメントの後にcase
カウンタを減らし、ゼロ以外の場合、最初の位置引数を閉じる以外は何もしません。 0の場合、呼び出し前に最初の位置引数をリストの最後に移動して、保持している引数がリストをループバックするのを効果的に許可し、不要な引数を削除します。skip
shift
skip
skip
shift
ループは位置引数リストを使用しているため、最後の引数が最初の引数である場合は、-f
最後の引数が失われますjava8
。これが最後のif
ステートメントを防止する意図です。
答え2
たぶんこんなことはありませんか?削除したいようですが-f java8
…
#!/bin/bash
while (( $# )); do
if [[ $1 = "-f" ]] && [[ $2 = "java8" ]]; then
shift 2
continue
fi
args+=( "$1" )
shift
done
echo "${args[*]}"
使用例:
$ ./argtest.sh one two three
one two three
$ ./argtest.sh one two -f java8 three four
one two three four
$ ./argtest.sh -f java8 -f foo -f bar
-f foo -f bar