it-swarm-tr.com

$ VAR vs $ {VAR} ve teklif vermek veya teklif etmemek

Yazabilirim

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

benim için sonuç hep aynı görünüyor. Neden birini veya diğerini yazmalıyım? Taşınabilir/POSIX değil mi?

150
xenoterracide

VAR=$VAR1, VAR=${VAR1} 'Un basitleştirilmiş bir sürümüdür. İkincisinin, bir dizi dizinine (taşınabilir değil) başvuramadığı veya bir alt dizeyi (POSIX taşınabilir) kaldıramayacağı şeyler yapabilir. Yeni Başlayanlar için Bash Rehberinin Değişkenler hakkında daha fazla bilgi bölümüne ve POSIX spesifikasyonundaki Parametre Genişletme bölümüne bakın.

rm -- "$VAR1" Veya rm -- "${VAR}" Gibi bir değişkenin çevresinde tırnak işareti kullanmak iyi bir fikirdir. Bu, değişkenin içeriğini bir atom birimi haline getirir. Değişken değeri boşluklar (iyi, $IFS Özel değişkenindeki karakterler, varsayılan olarak boşluklar) veya globbing karakterleri içeriyorsa ve tırnak işaretleri içermiyorsa, her Word, genişletme işlemi yapan dosya adı oluşturma (globbing) için dikkate alınır ne yaptığınıza dair birçok argüman.

$ 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

Taşınabilirlik hakkında: POSIX.1-2008 bölüm 2.6.2 'a göre, kıvırcık ayraçlar isteğe bağlıdır.

108
Shawn J. Goff

${VAR} ve $VAR tam olarak eşdeğerdir. Düz değişken genişletme için, ${VAR}, ayrıştırma, aksi takdirde ${VAR1}_$VAR2 (parantez olmadan ${VAR1_}$VAR2). En çok süslenen açılımlar (${VAR:=default}, ${VAR#prefix},…) Diş telleri gerektirir.

Değişken atamada alan bölme (yani değerdeki boşlukta bölme) ve yol adı genişletme (yani globbing) kapalıdır, bu nedenle VAR=$VAR1 tam olarak VAR="$VAR1", tüm POSIX mermilerinde ve duyduğum tüm POSIX öncesi m (POSIX ref: basit komutlar ). Aynı sebepten, VAR=*VAR değişkenini *; elbette VAR=a bVAR değerini a olarak ayarlar çünkü b ayrı bir Worddür. Genel olarak konuşursak, Kabuk sözdiziminin tek bir Sözcük beklediği durumlarda çift tırnak işareti gerekmez, örneğin case … in (ancak kalıpta değil), ancak orada bile dikkatli olmanız gerekir: örneğin POSIX, yönlendirme hedefleri (>$filename) komut dosyalarında tırnak işareti gerektirmez, ancak bash dahil birkaç kabuk komut dosyalarında bile çift tırnak işareti gerektirir. Daha ayrıntılı bir analiz için bakınız Çift tırnak ne zaman gereklidir? .

Diğer durumlarda, özellikle export VAR="${VAR1}" (aynı anda yazılabilir export "VAR=${VAR1}") birçok mermide (POSIX bu durumu açık bırakır). Bu davanın basit ödevlerle benzerliği ve çift tırnaklara ihtiyaç duymadığınız durumlar listesinin dağınık doğası, bölmek ve glob yapmak istemediğiniz sürece sadece çift tırnak kullanmanızı öneririm.

Alıntı

Değişken genişleme için çift tırnak kullanıldığını ve güçlü tırnak için yani tek tırnak genişleme için tek tırnak kullanıldığını düşünün.

Genişleme:

this='foo'
that='bar'
these="$this"
those='$that'

Çıktı:

for item in "$this" "$that" "$these" "$those"; do echo "$item"; done
foo
bar
foo
$that

Teklifi mümkün olan her yerde birkaç nedenden dolayı kullanmanız gerektiğini belirtmek faydalı olabilir, bunların en iyileri arasında en iyi uygulama ve okunabilirlik olarak düşünülebilir. Ayrıca Bash zaman zaman ve çoğu zaman mantıksız veya mantıksız/beklenmedik yollarla ilginç olduğu ve tırnak, dolaylı beklentileri açıkça değiştirdiğinden, bu hata yüzeyini (veya bunun potansiyelini) azaltır.

Ve değil alıntı yapmak tamamen yasal olsa da ve çoğu durumda çalışacak olsa da, bu işlevsellik kolaylık sağlamak için sağlanmıştır ve muhtemelen daha az taşınabilirdir. niyet ve beklentiyi yansıtmayı garanti altına alan tam resmi uygulama alıntı yapmaktır.

Ikame

Şimdi "${somevar}" oyuncu değiştirme işlemleri için kullanılır. Değiştirme ve diziler gibi çeşitli kullanım durumları.

Değiştirme (sıyırma):

thisfile='foobar.txt.bak'
foo="${thisfile%.*}"   # removes shortest part of value in $thisfile matching after '%' from righthand side
bar="${thisfile%%.*}"  # removes longest matching

for item in "$foo" "$bar"; do echo "$item"; done
foobar.txt
foobar

Değiştirme (değiştirme):

foobar='Simplest, least effective, least powerful'
# ${var/find/replace_with}
foo="${foobar/least/most}"   #single occurrence
bar="${foobar//least/most}"  #global occurrence (all)

for item in "$foobar" "$foo" "$bar"; do echo "$item"; done
Simplest, least effective, least powerful
Simplest, most effective, least powerful
Simplest, most effective, most powerful

Diziler:

mkdir temp
# create files foo.txt, bar.txt, foobar.txt in temp folder
touch temp/{foo,bar,foobar}.txt
# alpha is array of output from ls  
alpha=($(ls temp/*))

echo "$alpha"         #  temp/foo.txt
echo "${alpha}"       #  temp/foo.txt
echo "${alpha[@]}"    #  temp/bar.txt  temp/foobar.txt  temp/foo.txt
echo "${#alpha}"      #  12 # length of first element (implicit index [0])
echo "${#alpha[@]}"   #  3  # number of elements
echo "${alpha[1]}"    #  temp/foobar.txt # second element
echo "${#alpha[1])"   #  15 # length of second element

for item in "${alpha[@]}"; do echo "$item"; done
temp/bar.txt
temp/foobar.txt
temp/foo.txt

Bütün bunlar, "${var}" ikame yapısı. Bash Shell komut dosyası için kesin referans, libre çevrimiçi referansı TLDP Linux Dokümantasyon Projesi https://www.tldp.org/LDP/abs/html/parameter-substitution.html

9
SYANiDE
ls -la

lrwxrwxrwx.  1 root root      31 Nov 17 13:13 prodhostname
lrwxrwxrwx.  1 root root      33 Nov 17 13:13 testhostname
lrwxrwxrwx.  1 root root      32 Nov 17 13:13 justname

bitir o zaman:

env=$1
    if [ ! -f /dirname/${env}hostname ]

bukleler kullanmanın daha açık bir örneği olarak bahsetmeye değer

0
ninjabber