シェル引数内の特定の引数の存在と削除を識別します。

シェル引数内の特定の引数の存在と削除を識別します。

スクリプトのシェル・パラメーターに特定のパラメーター「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。引数は変数に含まれます。-fjava8found

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"

上記のループには、位置パラメータの初期数と同じ繰り返しがあります。

最初の位置引数がある場合は、-f2番目の位置引数があるかどうかをテストしますjava8。テストが次の場合本物、これら2つのパラメータをスキップする必要があるため、カウンタはskip2に設定されます。また、found他のインスタンスが見つかったことを示すために増加します-f java8

最初の位置引数がある場合、-fjava8この単一引数はスキップする必要があるため、カウンタはskip1に設定されます。また、found他のインスタンスが見つかったことを示すために増加します-fjava8(findと同じ-f java8)。

このステートメントの後にcaseカウンタを減らし、ゼロ以外の場合、最初の位置引数を閉じる以外は何もしません。 0の場合、呼び出し前に最初の位置引数をリストの最後に移動して、保持している引数がリストをループバックするのを効果的に許可し、不要な引数を削除します。skipshiftskipskipshift

ループは位置引数リストを使用しているため、最後の引数が最初の引数である場合は、-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

関連情報