@slm telah menyertakan dokumen POSIX - yang sangat membantu - tetapi mereka tidak benar-benar memperluas bagaimana parameter ini dapat digabungkan untuk mempengaruhi satu sama lain. Belum ada sebutan di sini tentang formulir ini:
${var?if unset parent shell dies and this message is output to stderr}
Ini adalah kutipan dari jawaban saya yang lain, dan saya pikir itu menunjukkan dengan sangat baik bagaimana ini bekerja:
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?
Contoh lain dari yang sama :
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
Contoh di atas mengambil keuntungan dari semua 4 bentuk substitusi parameter POSIX dan berbagai :colon null
atau not null
pengujian. Ada informasi lebih lanjut di tautan di atas, dan ini dia lagi .
Hal lain yang sering tidak dipertimbangkan orang ${parameter:+expansion}
adalah betapa bermanfaatnya dokumen ini. Berikut kutipan lain dari jawaban yang berbeda :
TERATAS
Di sini Anda akan menetapkan beberapa default dan bersiap untuk mencetaknya saat dipanggil ...
#!/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
TENGAH
Di sinilah Anda mendefinisikan fungsi lain untuk memanggil fungsi cetak Anda berdasarkan hasil mereka ...
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
}
BAWAH
Anda telah menyiapkan semuanya sekarang, jadi di sinilah Anda akan menjalankan dan menarik hasil Anda.
_less_important_function
: "${PLACE:="the cemetery"}"
_more_important_function
: "${RESULT:="regret it."}"
_less_important_function
HASIL
Saya akan membahas mengapa suatu saat, tetapi menjalankan di atas menghasilkan hasil sebagai berikut:
_less_important_function()'s
Lari pertama:
Saya pergi ke rumah ibumu dan melihat Disney on Ice.
Jika Anda melakukan kaligrafi, Anda akan berhasil.
kemudian _more_important_function():
Saya pergi ke kuburan dan melihat Disney on Ice.
Jika Anda melakukan matematika perbaikan Anda akan berhasil.
_less_important_function()
lagi:
Saya pergi ke kuburan dan melihat Disney on Ice.
Jika Anda melakukan matematika perbaikan Anda akan menyesalinya.
BAGAIMANA ITU BEKERJA:
Fitur utama di sini adalah konsep conditional ${parameter} expansion.
Anda dapat mengatur variabel ke nilai hanya jika tidak disetel atau null menggunakan formulir:
${var_name
: =desired_value}
Jika Anda hanya ingin menetapkan variabel yang tidak disetel, Anda akan menghilangkan :colon
dan nilai-nilai nol akan tetap apa adanya.
TENTANG RUANG LINGKUP:
Anda mungkin memperhatikan bahwa dalam contoh di atas $PLACE
dan $RESULT
diubah ketika diatur melalui parameter expansion
meskipun _top_of_script_pr()
telah dipanggil, mungkin pengaturan mereka ketika dijalankan. Alasan ini bekerja adalah bahwa _top_of_script_pr()
adalah ( subshelled )
fungsi - Saya sertakan dalam parens
daripada { curly braces }
yang digunakan untuk orang lain. Karena itu disebut dalam subkulit, setiap variabel yang disetel adalah locally scoped
dan saat ia kembali ke shell induknya, nilai-nilai itu menghilang.
Tetapi ketika _more_important_function()
set $ACTION
itu globally scoped
begitu mempengaruhi _less_important_function()'s
evaluasi kedua $ACTION
karena _less_important_function()
set $ACTION
hanya melalui${parameter:=expansion}.
man bash
; cari blok "Ekspansi Parameter" (sekitar 28%). Tugas-tugas ini misalnya fungsi default: "Gunakan nilai default hanya jika belum ada yang ditetapkan."