bash scripting: jika argumen sama dengan string ini, tentukan variabel seperti string ini

225

Saya sedang melakukan beberapa script bash dan sekarang saya mendapat satu panggilan variabel sourcedan satu array dipanggil samples, seperti ini:

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

karena saya ingin memperluas jumlah sumber (dan masing-masing sumber memiliki sampel sendiri) saya mencoba menambahkan beberapa argumen untuk melakukan ini. Saya mencoba ini:

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

tetapi ketika saya menjalankan skrip saya source countries.sh countryitu tidak berfungsi. Apa yang saya lakukan salah?

Alejandro
sumber
2
bagaimana cara kerjanya? Ketika Anda menjalankannya Anda mendapatkan kesalahan, atau mengatakan "coba lagi", atau yang lain?
evil otto
2
ya, Anda mungkin berpikir 'pertanyaannya sangat mudah'. tetapi Anda sudah memikirkan hal ini sebentar. Silakan pertimbangkan untuk mengedit pertanyaan Anda untuk memasukkan output yang diperlukan dan pesan kesalahan yang Anda dapatkan. +1 untuk benar-benar mencoba sesuatu dan pemformatan pertanyaan yang bagus. semoga berhasil.
shellter
Mengapa kode ini sama dengan solusi yang diajukan dan diterima? Itu membingungkan ... Saya menduga pertanyaan awal tidak memiliki spasi tepat setelah tanda kurung buka dan sebelum tanda kurung tutup kalimat if?
Stef
6
@Stef jika Anda melihat dari dekat, $1="country"vs.$1 = "country"
Will

Jawaban:

413

Jangan lupakan spasi:

source=""
samples=("")
if [ $1 = "country" ]; then
   source="country"
   samples="US Canada Mexico..."
else
  echo "try again"
fi
Alex L
sumber
121
Saya tidak percaya bahwa saya menghabiskan tiga jam untuk hal ini, dan hanya masalah ruang !!!! ... Terima kasih @Alex
Alejandro
1
Mengapa Anda menggunakan samples="US Canada Mexico..."setelah memperkenalkan pembuatan array sebelumnya samples=(US Canada Mexico...)?
pengguna tidak diketahui
10
Saya mengalami masalah dengan ini ketika variabel di sebelah kiri adalah string kosong. Memperbaiki itu if [ "$1" = "country" ]; then.
andrewb
8
Oke itu saja. Bash secara resmi mendapatkan suara saya untuk menjadi bahasa perintah yang paling usang namun masih digunakan. Sintaksnya sangat tidak intuitif sehingga menyakitkan. Benar-benar tidak ada tempat untuk itu di 2016+. @Systemd penulis: dapatkah Anda membuat "membangun shell Linux yang tidak menyedot" proyek Anda berikutnya? Saya akan memberikan uang kepada Anda.
masi
3
@masi kadang-kadang saya pikir maksud asli unix adalah "keamanan kerja melalui ketidakjelasan". jika alat itu samar untuk digunakan, sulit untuk dipahami, dan umumnya di luar jangkauan yang tidak dicuci besar tanpa pengetahuan dalam diturunkan dari master ke padwan, itu akan memastikan bahwa akan selalu ada pekerjaan untuk mereka yang "tahu". filosofi ini terbukti dalam keseluruhan konstruksi "RFC", dan bahasa berbunga-bunga yang digunakan dalam dokumen manusia, yang sementara secara teknis memberi tahu Anda bagaimana menggunakan alat, benar-benar ada di sana untuk memenuhi persyaratan telah mendokumentasikan alat. sedikit yang berubah.
tidak disinkronkan
184

Anda dapat menggunakan operator "=" atau "==" untuk perbandingan string dalam bash. Faktor penting adalah jarak dalam kurung. Metode yang tepat adalah agar tanda kurung mengandung spasi di dalam, dan operator mengandung spasi di sekitar. Dalam beberapa kasus kombinasi yang berbeda berfungsi; namun, yang berikut ini dimaksudkan sebagai contoh universal.

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

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

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

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

Juga, perhatikan kurung ganda ditangani sedikit berbeda dibandingkan dengan kurung tunggal ...

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

Saya harap itu membantu!

Vyke
sumber
12

Tampaknya Anda ingin mengurai argumen baris perintah ke skrip bash Anda. Saya sendiri telah mencari ini. Saya menemukan hal-hal berikut yang menurut saya akan membantu Anda dalam menguraikan argumen:

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

Saya menambahkan cuplikan di bawah ini sebagai 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

ioneyed
sumber