Yanıtlar:
Bu $1
alıntılar boş olsa da, alıntı yapılmalı (özdeş [ -z "$1" ]
). Çok eski bazı kabukları, boş dizeleri düzgün bir şekilde idare edemedi, bu yüzden taşınabilir senaryo yazarları bu kontrol tarzını benimsediler. Onlarca yıldır gerekmemişti, ancak insanlar hala bu şekilde yapıyor çünkü insanlar hala bu şekilde yapıyor.
[ x$1 = x ]
hâlâ yanlışsa, fakat [ "x$1" = x ]
bir sorun var kabukları olurdu $1
olduğu !
veya (
ya -n
.... [ "" = "$1" ]
ve case $1 in "")
ayrıca Tamam olsa olurdu.
[ -z "$1" ]
ve [ "$1" = "" ]
hala Solaris 10 / bin / sh ile çalışmıyor, eski tire-0.5.4.
[ "$1" = "" ]
hala onunla çalışmaz /bin/sh
(orada kullanmak istemesen /usr/xpg4/bin/sh
de /bin/sh
). çizgi bu konuda Ocak 2009'da düzeltildi.
Köşeli parantezler bir testi gösterir , bu yüzden sözdizimsel olarak tamam olsa da , [ x$1 = x]
onsuz if
veya benzer bir şey anlamsızdır.
x$1
Genişlerse x
ve yanlışsa, doğru olup olmadığını değerlendirmek istenmiştir , ancak alıntı $1
yapılmayacağından (örneğin) "hey x" ise kabuk görecektir x = x
, bu yüzden bu yapı hala güvenli değildir.
x = x
Kontrolün amacı bir değişkenin boş olup olmadığını belirlemektir. Bunu yapmanın daha yaygın bir yolu sadece tırnak kullanmak olacaktır:
if [ "$1" = "" ]; then
Bash test operatörleri -z
ve -n
ayrıca kullanılabilir, ancak bunlar diğer kabuk tiplerine daha az taşınabilir. 1
Alıntıların ya da x$1
, bunun nedeni, sol tarafın hiçbir şeye genişlememesidir, ki bu sözdizimsel bir hata olacaktır:
if [ = x ] # No good!
if [ "" = "" ] # Okay.
if [ x = x ] # Also okay.
1. Aslında, test
bağımsız bir yardımcı program olabilir , ancak çoğu kabuk onu yerleşik olarak uygular; which test
ve arasındaki farkı kontrol edin type test
. GNU / Linux üzerinde man test
iddialar başvurmak için dahili, ancak ararsanız (örneğin) /usr/bin/test
, o yarar dahil sayfasında açıklandığı özellikleri uygulamak gibi görünüyor -z
ve -n
.
[ x$1 = x ]
$1
Örneğin, true olup olmadığını da değerlendirecektir " -o x"
. Dene sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
. [ x$1 = x ]
yanlış ve mantıklı değil.
if
kullanmana gerek yok test
, daha önce kullanabilirsin &&
, ||
ya while
da sonucunu kullanabilirsin ya da kullanarak sonucu inceleyebilirsin$?
[ x$1 = x ]
Sadece mantıklı geliyor zsh
. Bu x
betiğin ilk argümanı ile birleştirme ile karşılaştırır x
. Bu nedenle, [
komut $1
boş veya sağlanmamışsa true olarak döner .
[ $1 = "" ]
İşe yaramaz, çünkü zsh
boş bir değişken liste bağlamlarında belirtilmediğinde, boş bir argüman yerine hiçbir argümana genişlemez, bu nedenle $1
ayarlanmamış veya boş [
olsaydı , komut yalnızca argümanlar olarak alır [
, =
boş dize ve ]
bunun mantıklı olamadığı. [ -z "$1" ]
veya [ "$1" = "" ]
POSIX kabukları gibi olsa tamam olurdu.
Bourne benzeri / POSIX mermilerinde, bir [ x$1 = x ]
anlam ifade etmiyor. Split + glob operatörü bir şekilde x
sonucun ve =
ve x
, ve komut ]
için geçerli bir test ifadesi oluşturduğunu ümit ederek komut dosyasının ilk argümanına ve ilk argümanına uygulanır [
.
Senaryo biri geçti Örneğin, eğer " = x -o x ="
argüman, [
bu argümanları alacağı: [
, x
, =
, x
, -o
, x
, =
, x
, ]
, hangi [
karşılaştırma olarak anlayacak x
ile x
ve x
ile x
ve gerçek dönün.
Eğer $1
vardı "* *"
, sonra kabuk için geçerdi [
Adını başlar ile geçerli dizinde komuta dosyaların listesini x
(bir glob genişlemesi x*
) olmayan gizli dosyaları (genişleme birleştirdikten sonra liste *
) ... [
edebilmek pek mümkün değildir mantıklı olmak için. Mantıklı bir şey yapabileceği tek durum $1
, joker veya boş karakterler içermemesidir.
Şimdi, bazen bulduğunuz şey şuna benzer:
[ "x$1" = x ]
$1
Boş olup olmadığını test etmek için kullanılır .
Boş veya ayarlanmamış bir değişkeni test etmenin normal yolu şudur:
[ -z "$1" ]
Ancak bu, bazı değerler için başarısız $1
gibi =
bazı (POSIX olmayan) 'de [
bulunmuştur Bourne kabukta yerleşik gibi uygulamalarda /bin/sh
Solaris 10 önce ya da bazı eski sürüm dash
(0.5.4 kadar) ya da sh
bir BSD türevi.
Bunun nedeni olduğunu [
görür [
, -z
, =
, ]
ve argümanlar eksik şikâyet =
ikili operatör yerine olarak anlaşılması -z
tekli operatör uygulanan =
dize.
Benzer şekilde, [ "$1" = "" ]
bazı uygulamalar için başarısız [
olursa $1
bir !
ya da (
.
Bu kabukta / [
uygulamalarda:
[ "x$1" = x ]
değeri ne olursa olsun, her zaman geçerli bir testtir $1
;
[ "" = "$1" ]
ve:
[ -z "${1:+x}" ]
ve
case $1 in "") ...; esac
Tabii ki, hiçbir argüman sağlanmadığını kontrol etmek istiyorsanız, şunları yapmalısınız:
[ "$#" -eq 0 ]
Diğer bir deyişle, komut dosyasına iletilen bağımsız değişkenlerin sayısını kontrol edersiniz.
Günümüzde, Not [ -z "$var" ]
açıkça POSIX tarafından belirlenir ve uygun olan başarısız olamaz [
uygulamaları (ve bash
'ın [
ve yıllardır olmuştur). Bu yüzden POSIX sh veya bash
scriptlerinde buna güvenebilmelisiniz .
x$1
İki dizesinin edilir x
ve $1
$ ve 1 boşsa, $ 1 x x eşittir ve [x $ 1 = x] sonuç olarak geçerli olacak. x = y
dize sh karşılaştırmak için kullanılır
x$1
, alıntı yapılmaz, bu yüzden ayrılma ve toplanma bunlara uygulanır.
[ x$1 = x ]
$1
unset / null / empty veya değil ise doğrudur .
Kendinizi deneyin:
TEST= ;[ x$TEST = x] && echo "TEST is unset"
ve
TEST=lolz ;[ x$TEST = x ] && echo "TEST is unset"
[ x$1 = x ]
$1
Mesela mümkünse de geçerlidir " -o x"
. Dene sh -xc '[ x$1 = x ] && echo yes' sh ' -o x'
. [ x$1 = x ]
yanlış ve mantıklı değil.