Saya tidak dapat menggunakan -
variabel dalam shell. Apakah ada cara untuk dapat menggunakannya, karena saya punya satu skrip yang tergantung pada variabel bernama:
$export a-b=c
-bash: export: `a-b=c': not a valid identifier
$export a_b=c
Pertama melempar kesalahan yang diberikan dan kedua bekerja dengan baik.
Jawaban:
Saya belum pernah bertemu shell Bourne-style yang diizinkan
-
dalam nama variabel. Hanya huruf ASCII (dari kedua kasus),_
dan digit yang didukung, dan karakter pertama tidak boleh digit.Jika Anda memiliki program yang memerlukan variabel lingkungan yang tidak cocok dengan pembatasan shell, jalankan dengan
env
program.Perhatikan bahwa beberapa shell (mis. Dash modern , mksh, zsh) menghapus variabel yang namanya tidak mereka sukai dari lingkungan. ( Shellshock telah membuat orang lebih berhati-hati tentang nama-nama variabel lingkungan, sehingga pembatasan cenderung menjadi lebih ketat dari waktu ke waktu, tidak lebih permisif.) Jadi, jika Anda perlu meneruskan variabel yang namanya berisi karakter khusus untuk suatu program, berikan secara langsung, tanpa shell di antaranya (
env 'strange-name=some value' sh -c'…; myprogram'
mungkin atau mungkin tidak berfungsi).sumber
env
Anda gunakan pada sistem operasi apa.)env
daricoreutils
,sh
daridash
:env 'with-dashes=value' bash -c 'env | fgrep dashes'
berfungsi tetapienv 'with-dashes=value' sh -c 'env | fgrep dashes'
tidak mencetak apa pun. Artinya,env
itu sendiri baik-baik saja, tetapi Dash tampaknya secara khusus memblokir variabel-variabel ini. Jadi, jika program tersebut diluncurkan melalui pembungkus shell dengan#!/bin/sh
header yang khas , tidak ada cara yang jelas untuk meneruskan variabel tersebut. Contoh solusienv
lebih dekat ke situs panggilan program yang membutuhkan nama variabel ini, tanpa shell di antaranya. Dash tidak sendirian dalam menghapus variabel yang namanya tidak disukai.Itu tidak mungkin di Bash.
Dari bagian Definisi di halaman manual
bash
:Dari bagian Parameter di halaman manual
bash
:sumber
Anda dapat mengakses variabel ditulis dgn tanda penghubung menggunakan referensi tidak langsung.
sumber
Jika skrip Anda bergantung pada nama variabel yang memiliki tanda hubung, itu adalah kesalahan pemrograman. Jika nyaman bagi Anda karena alat yang Anda gunakan secara teratur untuk membuat nama variabel berisi tanda hubung, Anda mungkin harus mempelajari lebih banyak dan alat yang berbeda.
Sudahkah Anda mencoba menggunakan tr untuk mengubah tanda hubung menjadi garis bawah?
Bash mengizinkan '-' muncul dalam nama fungsi. Saya melakukan ini sepanjang waktu. Sebagai contoh:
sumber
Karakter tanda hubung (
-
) adalah karakter hentian dan tidak diizinkan sebagai bagian dari nama variabel. Ada beberapa cara untuk meretas ini dengan variabel yang dikutip, tetapi penguraiannya benar-benar bermasalah. Ada juga karakter lain dengan makna khusus dalam konteks nama variabel dalam bash, terutama tanda kurung, tanda kurung, karakter operator dan tanda kutip. (mis.{}()=+-&'"
dan lebih banyak)Saya menyarankan agar secara praktis Anda perlu menemukan paradigma lain untuk membangun skrip Anda. Anda mungkin memiliki gagasan hang over dari bahasa lain tentang "nama variabel variabel". Ini umumnya bukan ide yang baik dalam skrip shell.
Jika Anda mengedit ini atau mengajukan pertanyaan baru dengan detail konteks Anda dan apa yang ingin Anda capai, kami mungkin dapat menyarankan cara yang baik untuk membuat skrip.
sumber
Manual Bash mendefinisikan "nama" sebagai:
Jadi, Anda tidak dapat menggunakan tanda hubung dalam nama.
sumber
Kebanyakan shell hanya mendukung az, AZ, 0-9 dan _ untuk variablenames. Baca item kedua di halaman ini .
sumber
Anda dapat bermain dengan env dan sed.
Sebagai contoh, saya perlu membaca variabel ini 'ELASTICSEARCH_CLUSTER-NODES'.
Perintah env menampilkan ini:
Jadi untuk mengekstrak variabel:
sumber
Saya percaya bahwa hanya huruf, angka, dan garis bawah yang diizinkan untuk variabel bash. Ini adalah kasus di banyak bahasa pemrograman (javascript menjadi pengecualian).
Saya sarankan agar skrip Anda tidak bergantung pada jenis nama variabel tersebut.
Bahkan, Anda harus mencoba memprogram sedemikian rupa sehingga Anda dapat mengganti nama variabel dengan nama lain dan itu tidak membuat perbedaan. Secara umum, nama variabel harus menjelaskan apa yang berisi variabel. Ini membuatnya lebih mudah untuk di-debug; jika bukan untuk Anda, maka untuk pengembang berikutnya yang mencoba mencari tahu kodenya.
sumber
Anda dapat menggunakan
env
perintah untuk mengatur dan menghapus variabel lingkungan dengan hiphens "-".Untuk membuat Anda harus menggunakan env untuk menjalankan perintah Anda:
env command
. Anda melewati variabel dengan cara ini:Lihat itu bekerja dengan:
atau untuk membuatnya lebih jelas:
sumber