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


225

私はbashスクリプトを実行していて、次のようにsource1 つの変数呼び出しと1つの配列を取得していますsamples

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しませんでした。何が悪いのですか?


2
どのように機能しないのですか?実行すると、エラーが発生するか、「再試行してください」などと表示されますか?
邪悪なオットー2012年

2
はい、あなたは「質問は非常に簡単です」と思うかもしれません。しかし、あなたはしばらくこれについて考えてきました。必要な出力と表示されるエラーメッセージを含めるように質問を編集することを検討してください。実際に何かを試してみて、質問の書式を整えるための+1。幸運を。
シェルター2012年

なぜこのコードは提案され承認されたソリューションと同じですか?それは混乱しています...最初の質問には、if文の開始ブラケットの直後と終了ブラケットの前にスペースがなかったと思いますか?
Stef 2016

6
あなたが密接に見れば、@Stef $1="country"$1 = "country"
ウィル

回答:


413

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

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

121
私はこれに3時間を費やすとは信じられず、スペースの問題だけでした!!!! ... THANKS @Alex
Alejandro

1
samples="US Canada Mexico..."以前にアレイ作成を導入した後、なぜ使用するのsamples=(US Canada Mexico...)ですか?
ユーザー不明

10
左側の変数が空の文字列の場合、これに問題が発生しました。修正はでしたif [ "$1" = "country" ]; then
andrewb 2015年

8
わかりました。Bashが公式に私の最も古い、まだ使用されているコマンド言語を支持する投票を取得します。構文は直感的ではないので、痛いです。2016年以降は、そのための場所は本当にありません。@Systemdの作者:次のプロジェクトを「苦労しないLinuxシェルの構築」にしてください。私はあなたにお金を投げます。
masi

3
@masi時々私はunixの本来の意図が「あいまいさによる仕事の安全」だったと思うことがあります。ツールが暗号化されていて、理解が難しく、一般にマスターからパドワンに伝えられた内部の知識なしに大いに洗われていないものの手が届かない場合、それは常に「知識のある人」のための作業があることを保証します。この哲学は、「RFC」構成全体とmanドキュメントで使用されている花言葉で明白です。ツールの使用方法を技術的に説明しながら、ツールをドキュメント化するという要件を満たすために実際に存在しました。少し変わった。
同期されていない2016年

184

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).

お役に立てば幸いです。


12

コマンドライン引数を解析してbashスクリプトに変換しようとしているようです。私は最近これを自分で検索しました。私はあなたが議論を解析するのを助けると思う次のものに出くわしました:

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

以下のスニペットをtl; drとして追加しました

#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 test -r server -p password -v

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.