$myscript.sh -host blah -user blah -pass blah
引数を渡したいと思います。シェルスクリプト引数の解析
Iは、SHに引数を解析する方法はたくさんあります$1
、$2
、$3
を行うために使用される....しかし、私は彼らに
$myscript.sh -host blah -user blah -pass blah
引数を渡したいと思います。シェルスクリプト引数の解析
Iは、SHに引数を解析する方法はたくさんあります$1
、$2
、$3
を行うために使用される....しかし、私は彼らに
を命名開始したいんです。 Getoptは良いです。ここでは、手で物事を解析し、簡単なスクリプトは次のとおりです。これは、スクリプトのevalのA以来 穴をしてもリモートで堅牢かつセキュリティへの大規模開いていないことを
$ ./a.sh -host foo -user me -pass secret some args
host = foo
user = me
pass = secret
args = some args
注:
#!/bin/sh
while echo $1 | grep -q ^-; do
eval $(echo $1 | sed 's/^-//')=$2
shift
shift
done
echo host = $host
echo user = $user
echo pass = $pass
echo args = [email protected]
サンプル実行は次のようになりますユーザーが作成した文字列。可能な方法を実行するための例として役立つことを意味するのは、単に です。より簡単な方法は、ユーザーが環境内のデータを渡すように要求することです。 Bourneシェル(cshの家族ではありませんつまり、何でも)では:うまく動作
$ host=blah user=blah pass=blah myscript.sh
、および変数
$host
、
$user
、
$pass
は、スクリプトで利用できるようになります。ここで
#!/bin/sh
echo host = ${host:?host empty or unset}
echo user = ${user?user not set}
...
'eval'の代わりに' declare'を使う方がより安全です。 –
@DennisWilliamsonの提案に加えて、 '| tr -d '\ 012''を指定する必要はありません。コマンド置換は、後続の改行を自動的にトリムします。 – mklement0
@ mklement0私は、内部的な改行について意識的に考えていたと思います。それは、それに対処しようとすると馬鹿げた考えに頑健性を追加しようとしていることを考えると奇妙です。これは非常に多くの方法が壊れやすいです、それはあまりにも面白いです。 –
@Zac良いキャッチ、ありがとう。 –
'getopts'はBashビルトインですが、' getopt'は外部ユーティリティです。前者は短いオプション(例えば '-e')で動作し、後者は長いもの(例えば' -foo')でも動作します。後者には対処しなければならない([getopt]の後のバージョンではより少ない問題がある)[issue](http://mywiki.wooledge.org/BashFAQ/035)があることに注意してください。 –
ロングとショートの両方のオプションを処理するための簡単な方法です:
while [[ $1 == -* ]]; do
case "$1" in
-h|--help|-\?) show_help; exit 0;;
-v|--verbose) verbose=1; shift;;
-f) if (($# > 1)); then
output_file=$2; shift 2
else
echo "-f requires an argument" 1>&2
exit 1
fi ;;
--) shift; break;;
-*) echo "invalid option: $1" 1>&2; show_help; exit 1;;
esac
done
How can I handle command-line arguments (options) to my script easily?
+1;ただし、 '-v -f 'を表す' -vf'のような_compressed_オプションは扱いません。 – mklement0
から私は、この形式のパラメータのために(デニス・ウィリアムソンのアドバイスで)ウィリアムPursell例の上に採用: スクリプト-param1 = value1 -param2 = value2 ...
ここには、1行引数のパーサー(ファイル 'script'に保存)のコードがあります。 :
script -host=aaa -user=bbb -pass=ccc
と結果が
host = aaa
user = bbb
pass = ccc
誰かがこの上記以外の引数を解析する短いコードを知っている:
#!/bin/bash
while echo $1 | grep ^- > /dev/null; do declare $(echo $1 | sed 's/-//g' | sed 's/=.*//g' | tr -d '\012')=$(echo $1 | sed 's/.*=//g' | tr -d '\012'); shift; done
echo host = $host
echo user = $user
echo pass = $pass
あなたはそのようにそれを呼び出しますか?
オプションをパースするのではなく、環境から値を渡すことを検討してください。例: "host = hostname user = me myscript.sh" –
http://stackoverflow.com/questions/192249/how-do-i-parse-commandの重複pure-bash 'switch'、' getopts'(POSIXシェル組み込み)、 'getopt'(util-linuxバージョンでなければお勧めしません。空の引数の問題を避けるための非POSIX機能など)。 –