2012-03-15 14 views
122

böyle, bazı bash komut dosyası yapıyorum ve şimdi source ve bir dizi samples denilen bir değişken çağrı var bu dize gibi bir değişken tanımlamak kaynak sayısını genişletmek istediğimde (ve her kaynağın kendi örnekleri vardır) bunu yapmak için bazı argümanlar eklemeyi denedim. Bu çalıştı:bash komut dosyası:</p> <pre><code>source='country' samples=(US Canada Mexico...) </code></pre> <p>: argümanlar bu dizeye eşitse,

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

ama benim senaryoyu source countries.sh country ran zaman çalışmadı. Neyi yanlış yapıyorum? İlk bakışta

+2

nasıl çalışır? Çalıştırdığınızda bir hata alırsınız, ya da "tekrar deneyin" mi, yoksa başka bir şey mi var? –

+2

evet, 'sorunun çok basit olduğunu' düşünebilirsiniz. ama bir süredir bunun hakkında düşünüyordun. Lütfen gerekli çıktıları ve aldığınız hata mesajlarını eklemek için sorunuzu düzenlemeyi düşünün. Aslında bir şey denemek ve soruya iyi biçimlendirme yapmak için +1. iyi şanslar. – shellter

+0

Bu kod neden önerilen ve kabul edilen çözümle aynı? Bu kafa karıştırıcı ... Tahmin ediyorum ki ilk soru, açılış parantezinden hemen sonra ve cümlenin kapanış parantezinden önce boşluklara sahip olmadı mı? – Stef

cevap

234

:

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

Bu konuda üç saatimi harcadığımı ve sadece bir boşluk sorunu olduğuna inanamıyorum !!!! ... THANKS @Alex – Alejandro

+1

Niçin "samples =" ABD Kanada Meksika ... "' dizisini tanıttıktan sonra önce örnekleri oluşturuluyor = (ABD Kanada Meksika ...) '? –

+1

ve == yerine == yerine = – Filippos

4

Bir == karşılaştırmak yerine eğer açıklamada bir assignation = yapıyoruz Temelde yapmanız gerekir:

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

mı ne istemek?

+4

Hayır, içinde []' tek bir '=' dize karşılaştırmasıdır, atama değildir. –

+0

@hmontoliu: '==' gerekli değil. '=' Kullandığınız dizeleri karşılaştırmak için.[["A" = "A"]] ve & echo "equal" || 'ı deneyin. echo "farklı" ' – sgibb

+0

Cool! Öğrenmek için bir şey :-) – hmontoliu

7

Komut satırı argümanlarını bash komut dosyasına ayrıştırmak istediğiniz görünüyor. Son zamanlarda kendim için arama yaptım. ; 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 testi aşağıda bir tl olarak pasajı eklendi

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

: Ben argümanlar ayrıştırma size yardımcı olacağını düşünüyorum aşağıdakilerden geldi -r sunucu -p parola -v alanlarda unutmayın

105

Bash'da dize karşılaştırması için ya "=" ya da "==" operatörlerini kullanabilirsiniz. Önemli faktör parantez içindeki boşluktur. Uygun yöntem, parantezlerin içinde boşluk bırakması ve operatörlerin etrafındaki boşlukları içermesidir. Bazı durumlarda farklı kombinasyonlar çalışır; bununla birlikte, aşağıdakilerin evrensel bir örnek olması amaçlanmıştır.

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

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

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

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

Ayrıca

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

Bunu umut olur ... çift parantez biraz farklı tek parantez kıyasla işlenir dikkat!