Saya menulis skrip bash untuk menggunakan rsync dan memperbarui file di sekitar 20 server yang berbeda.
Saya memiliki bagian rsync yang tahu. Apa yang saya mengalami masalah adalah melalui daftar variabel.
Skrip saya sejauh ini terlihat seperti ini:
#!/bin/bash
SERVER1="192.xxx.xxx.2"
SERVER2="192.xxx.xxx.3"
SERVER3="192.xxx.xxx.4"
SERVER4="192.xxx.xxx.5"
SERVER5="192.xxx.xxx.6"
SERVER6="192.xxx.xxx.7"
for ((i=1; i<7; i++))
do
echo [Server IP Address]
done
Di mana [Server IP Address]
seharusnya nilai dari variabel terkait. Jadi ketika saya = 1 saya harus mengulangi nilai $ SERVER1.
Saya sudah mencoba beberapa iterasi termasuk ini
echo "$SERVER$i" # printed the value of i
echo "SERVER$i" # printer "SERVER" plus the value of i ex: SERVER 1 where i = 1
echo $("SERVER$i") # produced an error SERVER1: command not found where i = 1
echo $$SERVER$i # printed a four digit number followed by "SERVER" plus the value of i
echo \$$SERVER$i # printed "$" plus the value of i
Sudah lama sejak saya menulis sehingga saya tahu saya kehilangan sesuatu. Plus, saya yakin saya mencampur apa yang bisa saya lakukan menggunakan C #, yang telah saya gunakan selama 11 tahun terakhir.
Apakah yang saya coba lakukan bahkan mungkin? Atau haruskah saya meletakkan nilai-nilai ini dalam array dan perulangan melalui array? Saya perlu hal yang sama untuk alamat IP produksi serta nama lokasi.
Ini semua dalam upaya untuk tidak mengulangi blok kode yang akan saya gunakan untuk menyinkronkan file di server jauh.
sumber
Jawaban:
Gunakan array.
sumber
Seperti jawaban lain tunjukkan, array adalah cara yang paling nyaman untuk melakukan ini. Namun, untuk kelengkapan, hal yang persis Anda minta adalah ekspansi tidak langsung . Ditulis ulang sebagai berikut, sampel Anda juga akan berfungsi menggunakan metode ini:
Jika Anda setuju dengan hanya meletakkan daftar alamat IP dalam
for
loop, maka Anda mungkin juga mempertimbangkan untuk menggunakan beberapa ekspansi brace untuk beralih pada apa pun yang Anda butuhkan:Tetapi jika Anda perlu menggunakan kembali daftar (mungkin diperluas), kemudian menggunakan daftar untuk menginisialisasi array akan menjadi cara untuk pergi:
sumber
Sementara saya mungkin akan pergi dengan salah satu jawaban array sendiri, saya ingin menunjukkan bahwa adalah mungkin untuk mengulang nama secara langsung. Anda dapat melakukan
atau, dalam 4.3 dan lebih tinggi, Anda dapat menggunakan
nameref
:Hat hat ilkkachu untuk solusi <4.3.
sumber
${!var}
) juga berfungsi dengan versi Bash yang lebih lama:foo1=aa; foo2=bbb; foox=cccc; for p in "${!foo@}"; do echo "$p = ${!p}"; done
Setiap orang yang mengatakan Anda harus menggunakan array benar, tetapi - sebagai latihan akademis - jika Anda bertekad untuk melakukannya dengan variabel terpisah yang diakhiri dengan angka (SERVER1, SERVER2, dll.), Ini adalah bagaimana Anda akan melakukannya Itu:
sumber
eval
sulit digunakan dengan aman. Ya ini bisa bekerja, tetapi bash ekspansi tidak langsung adalah cara yang lebih baik secara umum.eval
selesai, Anda harusecho $SERVER1
, tidakecho "$SERVER1"
. Ya mungkin untuk menggunakan dengan aman, tetapi sangat mudah digunakan dengan tidak aman atau tidak seperti yang Anda inginkan!