web-dev-qa-db-ja.com

bashスクリプト:引数がこの文字列と等しい場合は、この文字列のような変数を定義します。

私はいくつかのbashスクリプトをやっています、そして今私は次のようにsourceと呼ばれる1つの変数呼び出しとsamplesと呼ばれる1つの配列を得ました:

source='country'
samples=(US Canada Mexico...)

私はソースの数を増やしたい(そして各ソースはそれ自身のサンプルを持っている)ので、私はこれを行うためにいくつかの引数を追加しようとしました。私はこれを試しました:

source=""
samples=("")
if [ $1="country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
   echo "try again"
fi

しかし、スクリプトsource countries.sh countryを実行したときにはうまくいきませんでした。何がおかしいのですか?

185
Alejandro

スペースを忘れないでください。

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi
342
Alex L

Bashの文字列比較には、 "="または "=="演算子を使用できます。重要な要素は括弧内の間隔です。適切な方法は、大括弧が中にスペースを含み、演算子が周りにスペースを含むことです。場合によっては、さまざまな組み合わせが機能します。ただし、次の例は一般的な例です。

if [ "$1" == "something" ]; then     ## GOOD

if [ "$1" = "something" ]; then      ## GOOD

if [ "$1"="something" ]; then        ## BAD (operator spacing)

if ["$1" == "something"]; then       ## BAD (bracket spacing)

また、二重括弧は一重括弧と比べて若干異なる扱いをします。

if [[ $a == z* ]]; then   # True if $a starts with a "z" (pattern matching).
if [[ $a == "z*" ]]; then # True if $a is equal to z* (literal matching).

if [ $a == z* ]; then     # File globbing and Word splitting take place.
if [ "$a" == "z*" ]; then # True if $a is equal to z* (literal matching).

私はそれが役立つことを願っています!

151
Vyke

あなたはコマンドライン引数をあなたのbashスクリプトにパースしようとしているようです。私は最近自分でこれを探しました。私は以下のことに遭遇しました。私はあなたが議論を解析するのを助けると思います:

http://rsalveti.wordpress.com/2007/04/03/bash-parsing-arguments-with-getopts/

以下のスニペットをTlとして追加しました。

#using : after a switch variable means it requires some input (ie, t: requires something after t to validate while h requires nothing.
while getopts “ht:r:p:v” OPTION
do
     case $OPTION in
         h)
             usage
             exit 1
             ;;
         t)
             TEST=$OPTARG
             ;;
         r)
             SERVER=$OPTARG
             ;;
         p)
             PASSWD=$OPTARG
             ;;
         v)
             VERBOSE=1
             ;;
         ?)
             usage
             exit
             ;;
     esac
done

if [[ -z $TEST ]] || [[ -z $SERVER ]] || [[ -z $PASSWD ]]
then
     usage
     exit 1
fi

./script.sh -tテスト-rサーバー-pパスワード-v

10
ioneyed

一見すると、あなたはifステートメントの中でcompare =の代わりに==という代入をしているのです。基本的にあなたはする必要があります:

mysource=""
samples=("")


if [ "$1" == "country" ]; then
   mysource="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi

IE:

~$ source /tmp/foo.sh country
~$ echo $samples 
US Canada Mexico...

それはあなたが欲しいものですか?

4
hmontoliu