パラメータが1つだけ設定されている場合のbashパラメータの変更

パラメータが1つだけ設定されている場合のbashパラメータの変更

スクリプト標準としてgetopt魔法、スクリプトを呼び出すことができます。

batman-connect -c ffki

ダッシュなしで単一のオプションでこのスクリプトを呼び出すオプションを追加するにはどうすればよいですか?

batman-connect ffki

-cしたがって、この唯一のオプションを?の2番目の引数として解釈します。

~によるとこの回答私は試した:

if [ $@ = "ffki" ]; then
  set -- "-c $@"
fi

しかし、これは私の行のためにエラーが発生すると思います。スクリプト次に、もう一度変更してください。

# Execute getopt on the arguments passed to this program, identified by the special character $@
PARSED_OPTIONS=$(getopt -n "$0"  -o hsrvVi:c: --long "help,start,restart,stop,verbose,vv,version,interface:,community:"  -- "$@")

スクリプト全体を並べ替えるのが好きではありません。最初のパラメータを「-c」に設定し、2番目のパラメータを「ffki」に設定する簡単な1行はありますか?

答え1

次のようなことができます

if [ $# = 1 ]; then
    # do whatever you'd do when there is only one argument
else
    # do the getopt bits
fi
# do what you'd do in either case

-cがサポートする唯一のスイッチである場合は、getoptは必要ありません。次のように実行できます。

#!/bin/bash

usage() {
    echo "Usage: $0 [ -c ] arg" >&2
    exit 1
}

if [ $# = 2 ]; then
    if [ $1 = "-c" ]; then
        shift
        c_switch_value="$1"
    else
        usage
    fi
elif [ $# = 1 ]; then
    c_switch_value="$1"
else
    usage
fi

これがより読みやすいかどうかは議論の余地があります。

答え2

このスクリプトの冒頭に以下を追加しました。

if [ $# = 1 ]; then
  # If there is only one argument, replace the current process with the new invocation of the script
  # the only option will be used as -c option
  exec "$0" -c "$@"
fi

これは元の質問に対する答えではありませんが、私の特別なケースに適した解決策です。

答え3

if [ $@ = "ffki" ]; then

句のコマンドは、位置引数を構成する単語のワイルドカード拡張リストにif展開され、その後に単語が続きます。通常、二重引用符の外側にある場合は、「値」を意味するのではなく、「値を別の単語に分割してワイルドカードとして解釈する」ことを意味します。バラより[= ffki ]$VARVARVARスペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?

特別な場合もあります"$@"。個々の単語(引用符にもかかわらず)ではなく、位置引数のリスト(追加の拡張なし)に展開されます。スペースで区切られた位置引数で構成される単一の単語に展開されるを使用できます"$*"(より正確には、値の最初の文字で区切られますIFS)。したがって、値を持つ単一の位置パラメーターがあるかどうかをテストするには、ffki次のようにします。

if [ "$*" = "ffki" ]; then

または、位置パラメータの数を計算し、その値を個別にテストすることもできます。たとえば、値にスペースを含めるには、この操作が必要です。

if [ $# -eq 1 ] && [ "$1" = "ffki" ]; then

位置パラメータを変更するにはすでに完了しています。set組み込み関数を使用して、新しい位置パラメータセットを別の引数として渡します。最初の引数がSomethingで始まるリスクがある場合は、オプションとして解釈されないように-使用してください。set -- …

if [ "$*" = "ffki" ]; then
  set -- -c "ffki"
fi

答え4

おそらく次のようなものが欲しいでしょう。

# getopt code that sets "$c_value" goes here ...
# ... then
if [[ -z $c_value ]] && (( $# > 0 )); then
    c_value=$1
    shift
fi

関連情報