1

getopts を使用して引数を受け入れる Bash シェル スクリプト ライブラリに関数があります。これらの引数のいずれかに Bash コマンドを指定したいと考えています。次に関数は、この保存されたコマンドを何らかの目的で使用します (たとえば、ランチャーの実行として指定されたこの保存されたコマンドを使用して、自動化された方法で GNOME デスクトップ ランチャーを生成します)。ユーザーフレンドリーな方法でコマンド内の特殊文字を保持するにはどうすればよいですか (つまり、ユーザーが指定されたコマンド内の特殊文字をエスケープしたり、異常に困難なことをしたりする必要がないという意味です)。

そのため、関数の冒頭には、次のような特徴があります。

OPTIND=1; while getopts ":i:o:" options; do
    case "${options}" in
        i)
            command_1="${OPTARG}"
            ;;
        o)
            fileName_1="${OPTARG}"
            ;;
        \?)
            echo "invalid option -"${OPTARG}""
            return
            ;;
        :)
            echo "option -"${OPTARG}" requires an argument"
            return
            ;;
    esac

関数の引数として指定するコマンドは、次のようなものです。

echo "hello" | festival --tts
4

2 に答える 2

0

私の解釈は、ユーザーが次のようなものを書けるようにしたいということです:

my_script -i echo "hello" | festival --tts

パイプ文字を含む -i の後のシーケンス全体を引数として受け入れます。

残念ながら、それは本当に不可能です。スクリプトが呼び出される前にコマンドライン全体が解析されているため、呼び出されたスクリプトが実行できる魔法はありません。

もちろん、ユーザーは次のように書くこともできます:

my_script -i 'echo "hello" | festival --tts'

ただし、目的のコマンド ラインにアポストロフィが含まれている場合は、英雄的な努力が必要になります。

「通常の」アプローチ (たとえば、findユーティリティのオプションで使用される) は、 aが見つかる-execまでコマンド ライン引数を受け入れることです。;もちろん、;パイプやその他のシェル メタ文字と同様に、 をエスケープする必要があります。

-Iできることの 1 つは、おそらくから 1 行を読み取り、それをstdinコマンドとして使用する別のオプションを提供することです。これは、引用するのが難しい複雑なコマンド ラインの場合に便利ですが、ユーティリティがstdin他の目的にも使用する場合は少し厄介です。これを使用すると、ユーザーは次のように入力できます。

my_script -I file <<"EOF"
very_complicated_command 'with$x' "$all kinds of punctuation" 2> logfile | even_pipes
EOF
于 2013-09-25T17:42:10.217 に答える
0

一般的な引数の解析と getopts を組み合わせることができます。

OPTIND=1
while :; do
    case "${!OPTIND}" in
    --tts)
        TTS=true
        (( ++OPTIND ))
        ;;
    --another-with-arg)
        (( ++OPTIND ))
        # Perhaps add a check as well if optarg is valid.
        ANOTHER=${!OPTIND}
        (( ++OPTIND ))
        ;;
    *)
        if getopts ":ai:o:" options; then
            case "${options}" in
            i)
                command_1="${OPTARG}"
                ;;
            o)
                fileName_1="${OPTARG}"
                ;;
            \?)
                echo "invalid option -"${OPTARG}""
                return
                ;;
            :)
                echo "option -"${OPTARG}" requires an argument"
                return
                ;;
            esac
        else
            return
        fi
        ;;
    esac
done

私だったら、getopts をまったく使用しません

于 2013-09-25T17:05:35.843 に答える