Interpolasi variabel di shell

103

Saya memiliki variabel yang disebut filepath=/tmp/name.

Untuk mengakses variabel, saya tahu bahwa saya bisa melakukan ini: $filepath

Dalam skrip shell saya, saya mencoba melakukan sesuatu seperti ini (backticks dimaksudkan)

`tail -1 $filepath_newstap.sh`

Baris ini gagal, duuh !, karena variabel tidak dipanggil $filepath_newstap.sh

Bagaimana cara menambahkan _newstap.shnama variabel?

Harap dicatat bahwa backticks dimaksudkan untuk evaluasi ekspresi.

tauhid
sumber

Jawaban:

187

Menggunakan

"$filepath"_newstap.sh

atau

${filepath}_newstap.sh

atau

$filepath\_newstap.sh

_adalah karakter yang valid dalam pengenal. Dot tidak, jadi cangkang mencoba menginterpolasi $filepath_newstap.

Anda dapat menggunakan set -uuntuk membuat keluar shell dengan kesalahan saat Anda mereferensikan variabel yang tidak ditentukan.

choroba
sumber
7
Mungkin juga menyebutkan set -uyang menyebabkan skrip dibatalkan jika Anda mereferensikan variabel yang tidak ditentukan.
tripleee
1
Apa perbedaan antara penggunaan ${}dan tanda kutip ganda? Haruskah saya memilih salah satu dari yang lain?
pengguna31389
3
@ user31389: Perbedaannya adalah jika variabel berisi spasi, maka hanya tanda kutip ganda yang berfungsi.
choroba
@choroba Variabel nama atau variabel nilai ?
Joshua Pinter
15

Gunakan tanda kurung kurawal di sekitar nama variabel:

`tail -1 ${filepath}_newstap.sh`

sumber
1
Apakah Anda tidak membutuhkan tanda kutip ganda?
michaelsnowden
@ MichaelSnowden Belum tentu. Untuk amannya, ya, tetapi pertanyaan tersebut secara eksplisit menyatakan jalan tanpa spasi dan selanjutnya menyarankan bahwa masalah itu $filepath_newstap.shditafsirkan sebagai ${filepath_newstap}.shdaripada dimaksudkan ${filepath}_newstap.sh, yang akan menyelesaikan masalah.
@ michaelsnowden Itu memberi tahu saya apa pun yang belum saya sadari. Menurut Anda, mengapa tanda kutip ganda diperlukan?
Karena Anda mencoba melakukan interpolasi string, dan Anda memerlukan tanda kutip ganda untuk itu
michaelsnowden
@michaelsnowden Perluasan parameter terjadi baik dalam tanda kutip ganda atau di luar tanda kutip seluruhnya. Tanda kutip tunggal atau karakter pemisah dengan tanda kutip atau karakter lain yang tidak valid dalam pengenal adalah satu-satunya cara untuk mencegah perluasan parameter. Misalnya, "$filepath"_foodan ${filepath}_fooakan diperluas menjadi /tmp/name_foo. Namun, '$filepath'_foo, "$"filepath_foo, dan $"filepath"_foosemua akan ekspansi menghindari sepenuhnya. Inilah sebabnya mengapa export PATH=$PATH:$addpathberfungsi untuk menambahkan :$addpath(yang akan tunduk pada perluasan parameter) ke PATHvariabel lingkungan.
3

Di Bash:

tail -1 ${filepath}_newstap.sh
vyom
sumber