GNU/Linux >> Belajar Linux >  >> Linux

$var Vs ${var} Dan Mengutip Atau Tidak Mengutip?

Saya bisa menulis

VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"

hasil akhirnya bagi saya semua tampak hampir sama. Mengapa saya harus menulis satu atau yang lain? apakah ada yang tidak portabel/POSIX?

Jawaban yang Diterima:

VAR=$VAR1 adalah versi sederhana dari VAR=${VAR1} . Ada hal-hal yang dapat dilakukan oleh yang kedua yang tidak dapat dilakukan oleh yang pertama, misalnya mereferensikan indeks array (tidak portabel) atau menghapus substring (POSIX-portabel). Lihat bagian Selengkapnya tentang variabel dari Panduan Bash untuk Pemula dan Ekspansi Parameter dalam spesifikasi POSIX.

Menggunakan tanda kutip di sekitar variabel seperti dalam rm -- "$VAR1" atau rm -- "${VAR}" adalah ide yang bagus. Hal ini membuat isi dari variabel unit atom. Jika nilai variabel berisi kosong (baik, karakter dalam $IFS variabel khusus, kosong secara default) atau karakter globbing dan Anda tidak mengutipnya, maka setiap kata dipertimbangkan untuk pembuatan nama file (globbing) yang perluasannya membuat banyak argumen untuk apa pun yang Anda lakukan.

$ find .
.
./*r*
./-rf
./another
./filename
./spaced filename
./another spaced filename
./another spaced filename/x
$ var='spaced filename'
# usually, 'spaced filename' would come from the output of some command and you weren't expecting it
$ rm $var
rm: cannot remove 'spaced': No such file or directory
# oops! I just ran 'rm spaced filename'
$ var='*r*'
$ rm $var
# expands to: 'rm' '-rf' '*r*' 'another spaced filename'

$ find .
.
./another
./spaced filename
./another spaced filename
$ var='another spaced filename'
$ rm -- "$var"
$ find .
.
./another
./spaced filename

Tentang portabilitas:
Menurut POSIX.1-2008 bagian 2.6.2, kurung kurawal adalah opsional.


Linux
  1. Perbedaan Antara Perintah Bawaan Dan Yang Tidak?

  2. Linux – Mengapa Kami Menggunakan Su – Dan Bukan Hanya Su?

  3. Mengapa Rm -rf Dan Bukan Rmdir -rf?

  1. 7 Contoh Operator Linux Grep OR, Grep AND, Grep NOT

  2. Cara menjalankan perintah "find" hanya pada direktori saat ini dan bukan pada sub-direktori

  3. sed e dan g flag tidak bekerja bersama

  1. “nohup Sudo …” Tidak Meminta Passwd Dan Tidak Melakukan Apa-apa?

  2. readlink -f dan -e opsi deskripsi tidak jelas

  3. Mengapa crontab saya tidak berfungsi, dan bagaimana cara mengatasinya?