1

以下のようtestShell.shに使用するシェルスクリプトがあります。getopts

#!/bin/bash
while getopts ":j:e:" option; do
    case "$option" in
        j) MYHOSTNAME=$OPTARG ;;
        e) SCRIPT_PATH=$OPTARG ;;
        *) ;;
    esac
done

echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"

テスト実行すると、次のようになります。

$ testShell.sh  -jvalue1 -evalue4 -Djvalue3  -pvalue2

私が得る出力は次のとおりです。

j=value3
e=2
remaining=

しかし、私は次のように出力したいと思います:

j=value1
e=value4
remaining=-Djvalue3 -pvalue2

getopts 最初の文字のポスト - シンボルのみを確認することは可能ですか? ととして解釈-Djvalue3されないようにします。-jvalue3-pvalue2-e2

4

3 に答える 3

1

後に休憩を追加できますj)

#!/bin/bash
while getopts ":j:e:" option; do
    case "$option" in
        j) MYHOSTNAME=$OPTARG ; break ;;
        e) SCRIPT_PATH=$OPTARG ;;
        *) ;;
    esac
done

echo "j=$MYHOSTNAME"
echo "e=$SCRIPT_PATH"
shift $((OPTIND - 1))
echo "remaining=$@"

出力:

$ bash test.sh -jvalue1 -Djvalue3 -pvalue2
j=value1
e=
remaining=-Djvalue3 -pvalue2

オプション/引数の間にスペースを入れて出力:

$ bash test.sh  -jvalue1 -evalue4 -D jvalue3  -p value2
j=value1
e=value4
remaining=jvalue3 -p value2
于 2012-08-01T07:33:55.950 に答える
1

オプション処理は手動で行うことができます。

set -- -jvalue1 -evalue4 -Djvalue3 -pvalue2

remaining=()
for arg; do
    case $arg in
        -j*) j=${arg#-j} ;;
        -e*) e=${arg#-e} ;;
        *)   remaining+=($arg) ;;
    esac
done
printf "%s='%s'\n" j "$j" e "$e" remaining "${remaining[*]}"

どの出力

j='value1'
e='value4'
remaining='-Djvalue3 -pvalue2'

このように、ユーザーが特定の方法で引数を入力することに依存する必要はありません。たとえば--、途中で追加したり、強制-j-eて最初に来るようにしたりします。

于 2012-08-01T11:19:50.010 に答える
1

3つのフォーラムに投稿し、どこでも検索した後...最終的に次のことを試してみましたが、うまくいきました...

testShell.sh  -jvalue1 -evalue4 -- -Djvalue3  -pvalue2

知らせ

--  

-evalue4

そして出力は

j=value1
e=value4
remaining=-Djvalue3 -pvalue2

オプションの処理を停止する--よう求めていると思います。getopts

編集: これがどのように機能するかを説明するリンクです。

于 2012-08-01T10:11:36.740 に答える