私スクリプト標準として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
]
$VAR
VAR
VAR
スペースやその他の特殊文字が原因でシェルスクリプトが停止するのはなぜですか?
特別な場合もあります"$@"
。個々の単語(引用符にもかかわらず)ではなく、位置引数のリスト(追加の拡張なし)に展開されます。スペースで区切られた位置引数で構成される単一の単語に展開されるを使用できます"$*"
(より正確には、値の最初の文字で区切られます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