2011-02-03 18 views
8
$myscript.sh -host blah -user blah -pass blah 

引数を渡したいと思います。シェルスクリプト引数の解析

Iは、SHに引数を解析する方法はたくさんあります$1$2$3を行うために使用される....しかし、私は彼らに

+2

オプションをパースするのではなく、環境から値を渡すことを検討してください。例: "host = hostname user = me myscript.sh" –

+0

http://stackoverflow.com/questions/192249/how-do-i-parse-commandの重複pure-bash 'switch'、' getopts'(POSIXシェル組み込み)、 'getopt'(util-linuxバージョンでなければお勧めしません。空の引数の問題を避けるための非POSIX機能など)。 –

答えて

13

を命名開始したいんです。 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} 
... 
+2

'eval'の代わりに' declare'を使う方がより安全です。 –

+0

@DennisWilliamsonの提案に加えて、 '| tr -d '\ 012''を指定する必要はありません。コマンド置換は、後続の改行を自動的にトリムします。 – mklement0

+0

@ mklement0私は、内部的な改行について意識的に考えていたと思います。それは、それに対処しようとすると馬鹿げた考えに頑健性を追加しようとしていることを考えると奇妙です。これは非常に多くの方法が壊れやすいです、それはあまりにも面白いです。 –

9
+0

@Zac良いキャッチ、ありがとう。 –

+1

'getopts'はBashビルトインですが、' getopt'は外部ユーティリティです。前者は短いオプション(例えば '-e')で動作し、後者は長いもの(例えば' -foo')でも動作します。後者には対処しなければならない([getopt]の後のバージョンではより少ない問題がある)[issue](http://mywiki.wooledge.org/BashFAQ/035)があることに注意してください。 –

6

ロングとショートの両方のオプションを処理するための簡単な方法です:

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

+1;ただし、 '-v -f 'を表す' -vf'のような_compressed_オプションは扱いません。 – mklement0

0

から私は、この形式のパラメータのために(デニス・ウィリアムソンのアドバイスで)ウィリアム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 

あなたはそのようにそれを呼び出しますか?

関連する問題