bash scripting: argümanlar bu dizeye eşitse, bu dizeye benzer bir değişken tanımlayın


225

Bazı bash betiği yapıyorum ve şimdi bir değişken çağrı sourceve böyle bir dizi var samples, şöyle:

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

kaynak sayısını genişletmek istiyorum (ve her kaynağın kendi örnekleri vardır) Bunu yapmak için bazı argümanlar eklemeye çalıştım. Bunu denedim:

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

ama senaryomu çalıştırdığımda source countries.sh countryişe yaramadı. Neyi yanlış yapıyorum?


2
nasıl çalışmıyor? Çalıştırdığınızda bir hata alıyorsunuz, ya da "tekrar deneyin" ya da başka bir şey mi diyor?
kötü otto

2
evet, 'soru çok basit' diye düşünebilirsiniz. ama bir süredir bunu düşünüyorsun. Lütfen sorunuzu, gerekli çıktıları ve aldığınız hata mesajlarını içerecek şekilde düzenlemeyi düşünün. Bir şeyi denemek ve sorunun iyi biçimlendirilmesi için +1. iyi şanslar.
shellter

Bu kod neden önerilen ve kabul edilen çözümle aynı? Bu kafa karıştırıcı ... Sanırım ilk soru açılış parantezinden hemen sonra ve if cümlesinin kapanış parantezinden önce boşluk bırakmadı mı?
Stef

6
Eğer yakından bakarsanız @Stef $1="country"vs$1 = "country"
Will

Yanıtlar:


413

Boşlukları unutmayın:

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

121
Bu konuda üç saat harcadığına inanamıyorum ve sadece bir mekan sorunu oldu !!!! ... TEŞEKKÜRLER @Alex
Alejandro

1
Daha samples="US Canada Mexico..."önce dizi oluşturmayı tanıttıktan sonra neden kullanıyorsunuz samples=(US Canada Mexico...)?
kullanıcı bilinmiyor

10
Soldaki değişken boş bir dize olduğunda bununla ilgili sorunlar yaşadım. Fix oldu if [ "$1" = "country" ]; then.
andrewb

8
Tamam bu kadar. Bash, en eski ama hala kullanılan komut dilini arılamak için resmen oyumu aldı. Sözdizimi o kadar sezgisel değil ki acıtıyor. 2016 + için gerçekten hiçbir yer. @Systemd yazarları: Lütfen bir sonraki projenizi "emmeyen bir Linux kabuğu oluşturma" yapabilir misiniz? Sana para atacağım.
masi

3
@masi bazen unix'in asıl amacının "müstehcenlik yoluyla iş güvenliği" olduğunu düşünüyorum. eğer araçlar kullanmak için şifreli, anlaşılması zor ve genellikle ustadan padwan'a teslim edilen iç bilgi olmadan yıkanmamış olanların büyük kısmının erişemeyeceği yerlerde, "bilenler" için her zaman iş olmasını sağlayacaktır. bu felsefe tüm "RFC" yapısında ve insan belgelerinde kullanılan çiçekli dilde belirgindir, bu da teknik olarak araçları nasıl kullanacağınızı anlatırken, araçları belgeleme gereksinimini karşılamak için oradaydı. çok az şey değişti.
senkronize olmayan

184

Bash'de dize karşılaştırması için "=" veya "==" operatörlerinden birini kullanabilirsiniz. Önemli faktör parantez içindeki boşluktur. Uygun yöntem, parantezlerin içinde boşluk bırakması ve operatörlerin etrafında boşluk bırakmasıdır. Bazı durumlarda farklı kombinasyonlar çalışır; ancak, 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, çift parantezlerin tek parantezlere göre biraz farklı ele alındığını unutmayın ...

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

Umarım bu yardımcı olur!


12

Komut satırı bağımsız değişkenlerini bash komut dosyanızda ayrıştırmak istediğiniz anlaşılıyor. Bunu son zamanlarda kendim aradım. Tartışmaları çözümlemede size yardımcı olacağını düşündüğüm aşağıdakilerle karşılaştım:

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

Aşağıdaki pasajı tl olarak ekledim; 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 sunucu -p parola -v

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.