@slm zaten çok faydalı olan POSIX belgelerini zaten içeriyor, ancak bu parametrelerin birbirlerini etkilemek için nasıl bir araya getirilebileceğini gerçekten genişletmiyorlar. Bu formdan henüz bahsedilmedi:
${var?if unset parent shell dies and this message is output to stderr}
Bu benim başka bir cevabımdan bir alıntı , ve bence bu işlerin nasıl yürüdüğünü çok iyi gösteriyor:
sh <<-\CMD
_input_fn() { set -- "$@" #redundant
echo ${*?WHERES MY DATA?}
#echo is not necessary though
shift #sure hope we have more than $1 parameter
: ${*?WHERES MY DATA?} #: do nothing, gracefully
}
_input_fn heres some stuff
_input_fn one #here
# shell dies - third try doesnt run
_input_fn you there?
# END
CMD
heres some stuff
one
sh: line :5 *: WHERES MY DATA?
Aynı başka bir örnek :
sh <<-\CMD
N= #N is NULL
_test=$N #_test is also NULL and
v="something you would rather do without"
( #this subshell dies
echo "v is ${v+set}: and its value is ${v:+not NULL}"
echo "So this ${_test:-"\$_test:="} will equal ${_test:="$v"}"
${_test:+${N:?so you test for it with a little nesting}}
echo "sure wish we could do some other things"
)
( #this subshell does some other things
unset v #to ensure it is definitely unset
echo "But here v is ${v-unset}: ${v:+you certainly wont see this}"
echo "So this ${_test:-"\$_test:="} will equal NULL ${_test:="$v"}"
${_test:+${N:?is never substituted}}
echo "so now we can do some other things"
)
#and even though we set _test and unset v in the subshell
echo "_test is still ${_test:-"NULL"} and ${v:+"v is still $v"}"
# END
CMD
v is set: and its value is not NULL
So this $_test:= will equal something you would rather do without
sh: line 7: N: so you test for it with a little nesting
But here v is unset:
So this $_test:= will equal NULL
so now we can do some other things
_test is still NULL and v is still something you would rather do without
Yukarıdaki örnek POSIX parametre yerine her 4 formları yararlanır ve bunların çeşitli :colon null
veya not null
testleri. Yukarıdaki linkte daha fazla bilgi var ve işte yine burada .
İnsanların sık sık düşünmediği bir başka şey, ${parameter:+expansion}
burada bir belgede ne kadar faydalı olabileceğidir. İşte farklı bir cevaptan başka bir alıntı :
ÜST, EN İYİ, TEPE
Burada bazı varsayılanları ayarlayacak ve çağrıldığında bunları yazdırmaya hazırlayacaksınız ...
#!/bin/sh
_top_of_script_pr() (
IFS="$nl" ; set -f #only split at newlines and don't expand paths
printf %s\\n ${strings}
) 3<<-TEMPLATES
${nl=
}
${PLACE:="your mother's house"}
${EVENT:="the unspeakable."}
${ACTION:="heroin"}
${RESULT:="succeed."}
${strings:="
I went to ${PLACE} and saw ${EVENT}
If you do ${ACTION} you will ${RESULT}
"}
#END
TEMPLATES
ORTA
Bu, sonuçlarına göre yazdırma işlevinizde çağrılacak diğer işlevleri tanımladığınız yerdir ...
EVENT="Disney on Ice."
_more_important_function() { #...some logic...
[ $((1+one)) -ne 2 ] && ACTION="remedial mathematics"
_top_of_script_pr
}
_less_important_function() { #...more logic...
one=2
: "${ACTION:="calligraphy"}"
_top_of_script_pr
}
ALT
Artık her şeyi ayarladınız, işte sonuçlarınızı uygulayacağınız ve çekeceğiniz yer burasıdır.
_less_important_function
: "${PLACE:="the cemetery"}"
_more_important_function
: "${RESULT:="regret it."}"
_less_important_function
SONUÇLAR
Neden bir dakika sonra gireceğim, ancak yukarıdakileri çalıştırmanız aşağıdaki sonuçları veriyor:
_less_important_function()'s
ilk çalıştırma:
Annenin evine gittim ve Disney on Ice'ı gördüm .
Eğer hat sanatı yaparsan, başaracaksın.
sonra _more_important_function():
Mezarlığa gittim ve Disney on Ice'ı gördüm.
Eğer düzeltici matematiği yaparsan, başaracaksın.
_less_important_function()
tekrar:
Mezarlığa gittim ve Disney on Ice'ı gördüm.
Düzeltici matematiği yaparsanız pişman olacaksınız .
NASIL ÇALIŞIR:
Buradaki en önemli özellik, conditional ${parameter} expansion.
bir değişkeni ancak formu kullanarak ayarlanmamış veya boş olması durumunda bir değere ayarlayabilirsiniz:
${var_name
: =desired_value}
Bunun yerine sadece belirsiz bir değişken ayarlamak isterseniz, ihmal eder :colon
ve boş değerler olduğu gibi kalır.
KAPSAMDA:
Yukarıdaki örnekteki fark edebilirsiniz $PLACE
ve $RESULT
üzeri ayarlandığında değişti parameter expansion
olsa bile _top_of_script_pr()
o yayınlandığında, bir muhtemelen onları ayarlayarak, zaten adı olmuştur. Bunun işe yaramasının sebebi _top_of_script_pr()
bir ( subshelled )
fonksiyon - başkaları parens
için { curly braces }
kullanmak yerine onu içine aldım . Alt kabuk olarak adlandırıldığından, ayarladığı her değişkendir locally scoped
ve ana kabuğuna döndüğünde bu değerler kaybolur.
Ancak _more_important_function()
kümeler $ACTION
böyle olunca ikinci değerlendirmeyi globally scoped
etkiler çünkü kümeler sadece üzerinden_less_important_function()'s
$ACTION
_less_important_function()
$ACTION
${parameter:=expansion}.
man bash
; "Parametre Genişletme" bloğunu arayın (yaklaşık% 28'de). Bu atamalar örneğin varsayılan işlevlerdir: "Henüz ayarlanmamışsa varsayılan değeri kullanın."