සටහන
bash
ටැගය නිසා මම දැඩි ලෙස අවධානය යොමු කළ පිළිතුරක් ලබා දෙමි .
කෙටි පිළිතුර
ඔබ Bash හි නම් කරන ලද විචල්යයන් සමඟ පමණක් කටයුතු කරන තාක් කල්, මෙම ශ්රිතය සෑම විටම ඔබට කියනුයේ විචල්යය සකසා ඇත්ද, එය හිස් අරාවක් වුවද.
variable-is-set() {
declare -p "$1" &>/dev/null
}
මෙය ක්රියාත්මක වන්නේ ඇයි?
Bash හි (අවම වශයෙන් 3.0 තරම් back var
ත ), ප්රකාශිත / සැකසුම් විචල්යයක් නම්, එහි වර්තමාන වර්ගය සහ අගය කුමක් වුවත් විචල්යයක් declare -p var
සැකසෙන declare
විධානයක් ප්රතිදානය කර var
තත්ව කේතය 0
(සාර්ථකත්වය) ලබා දෙයි. ප්රකාශයට පත් නොකළේ නම් var
, declare -p var
දෝෂ පණිවිඩයක් ප්රතිදානය කර stderr
තත්ව කේතය ලබා දෙයි 1
. තත්ව කේතය වෙනස් නොකර, භාවිතා කිරීම &>/dev/null
, නිත්ය stdout
සහ stderr
ප්රතිදානය යන දෙකටම නැවත යොමු /dev/null
කරයි. මේ අනුව ශ්රිතය නැවත ලබා දෙන්නේ තත්ව කේතය පමණි.
Bash හි වෙනත් ක්රම (සමහර විට) අසමත් වීමට හේතුව
[ -n "$var" ]
: මෙය පරික්ෂා කරන්නේ ${var[0]}
නොසැලකිලිමත් නම් පමණි . (Bash හි, $var
සමාන වේ ${var[0]}
.)
[ -n "${var+x}" ]
: මෙය පරික්ෂා කරන්නේ ${var[0]}
සකසා ඇත්නම් පමණි .
[ "${#var[@]}" != 0 ]
: මෙය පරික්ෂා කරන්නේ අවම වශයෙන් එක් දර්ශකයක්වත් $var
සකසා ඇත්නම් පමණි .
මෙම ක්රමය Bash හි අසමත් වූ විට
මෙම පමණක් නම් විචල්යයන් (ඇතුළු සඳහා ක්රියා $_
), නො යම් යම් විශේෂ විචල්යයන් ( $!
, $@
, $#
, $$
, $*
, $?
, $-
, $0
, $1
, $2
, ..., ඕනෑම මම අමතක විය හැක). මේ කිසිවක් අරා නොවන බැවින්, මෙම [ -n "${var+x}" ]
සියලු විශේෂ විචල්යයන් සඳහා පොසික්ස් විලාසිතාව ක්රියා කරයි. බොහෝ විශේෂ විචල්යයන් ශ්රිතයන් හැඳින්වෙන විට අගයන් / පැවැත්ම වෙනස් කරන බැවින් එය ශ්රිතයක් තුළට ඔතා පරිස්සම් වන්න.
ෂෙල් අනුකූලතා සටහන
ඔබේ ස්ක්රිප්ටයේ අරා තිබේ නම් සහ ඔබ එය හැකි තරම් ෂෙල් වෙඩි සමඟ අනුකූල කිරීමට උත්සාහ කරන්නේ නම්, ඒ typeset -p
වෙනුවට භාවිතා කිරීම ගැන සලකා බලන්න declare -p
. Ksh කලින් සහාය දෙන බව මම කියවා ඇත්තෙමි, නමුත් මෙය පරීක්ෂා කිරීමට නොහැකි විය. මම එක් එක් උපකාරක දන්නේ බව බෑෂ් 3.0+ සහ Zsh 5.5.1 දෙකම typeset -p
හා declare -p
, පමණක් වන එක් අනෙක් සඳහා විකල්ප වේ වෙනස්. නමුත් මම එම මූල පද දෙකෙන් ඔබ්බට වෙනස්කම් පරීක්ෂා කර නැති අතර වෙනත් ෂෙල් වෙඩි පරීක්ෂා කර නැත.
ඔබේ ස්ක්රිප්ටය POSIX sh අනුකූල වීමට අවශ්ය නම්, ඔබට අරා භාවිතා කළ නොහැක. අරා නොමැතිව, [ -n "{$var+x}" ]
ක්රියා කරයි.
Bash හි විවිධ ක්රම සඳහා සංසන්දනාත්මක කේතය
මෙම ශ්රිතය විචල්යය var
, eval
සම්මත කළ කේතය, d කේතය var
මඟින් සකසා තිබේද යන්න තීරණය කිරීම සඳහා පරීක්ෂණ ධාවනය කරයි eval
, අවසානයේදී විවිධ පරීක්ෂණ සඳහා ප්රති ing ල ලැබෙන තත්ව කේත පෙන්වයි.
මම පනින කරනවා test -v var
, [ -v var ]
සහ [[ -v var ]]
ඔවුන් POSIX සම්මත සමාන ප්රතිඵල නිසා [ -n "${var+x}" ]
බෑෂ් 4.2+ අවශ්ය අතර,. මම පරීක්ෂා කළ ෂෙල් වෙඩි typeset -p
හා සමාන බැවින් මම ද මඟ declare -p
හරිමි (Bash 3.0 thru 5.0, සහ Zsh 5.5.1).
is-var-set-after() {
# Set var by passed expression.
unset var
eval "$1"
# Run the tests, in increasing order of accuracy.
[ -n "$var" ] # (index 0 of) var is nonempty
nonempty=$?
[ -n "${var+x}" ] # (index 0 of) var is set, maybe empty
plus=$?
[ "${#var[@]}" != 0 ] # var has at least one index set, maybe empty
count=$?
declare -p var &>/dev/null # var has been declared (any type)
declared=$?
# Show test results.
printf '%30s: %2s %2s %2s %2s\n' "$1" $nonempty $plus $count $declared
}
සිද්ධි කේතය පරීක්ෂා කරන්න
විචල්යය සහායක අරාව ලෙස ප්රකාශයට පත් කර නොමැති නම්, සංඛ්යාත්මක නොවන අරාව දර්ශක "0" ලෙස Bash සැලකීම නිසා පරීක්ෂණ ප්රති results ල අනපේක්ෂිත විය හැකි බව සලකන්න. තවද, සහායක අරා වලංගු වන්නේ Bash 4.0+ හි පමණි.
# Header.
printf '%30s: %2s %2s %2s %2s\n' "test" '-n' '+x' '#@' '-p'
# First 5 tests: Equivalent to setting 'var=foo' because index 0 of an
# indexed array is also the nonindexed value, and non-numerical
# indices in an array not declared as associative are the same as
# index 0.
is-var-set-after "var=foo" # 0 0 0 0
is-var-set-after "var=(foo)" # 0 0 0 0
is-var-set-after "var=([0]=foo)" # 0 0 0 0
is-var-set-after "var=([x]=foo)" # 0 0 0 0
is-var-set-after "var=([y]=bar [x]=foo)" # 0 0 0 0
# '[ -n "$var" ]' fails when var is empty.
is-var-set-after "var=''" # 1 0 0 0
is-var-set-after "var=([0]='')" # 1 0 0 0
# Indices other than 0 are not detected by '[ -n "$var" ]' or by
# '[ -n "${var+x}" ]'.
is-var-set-after "var=([1]='')" # 1 1 0 0
is-var-set-after "var=([1]=foo)" # 1 1 0 0
is-var-set-after "declare -A var; var=([x]=foo)" # 1 1 0 0
# Empty arrays are only detected by 'declare -p'.
is-var-set-after "var=()" # 1 1 1 0
is-var-set-after "declare -a var" # 1 1 1 0
is-var-set-after "declare -A var" # 1 1 1 0
# If 'var' is unset, then it even fails the 'declare -p var' test.
is-var-set-after "unset var" # 1 1 1 1
පරීක්ෂණ ප්රතිදානය
කිරීම සදහා ශීර්ෂ පේළිය අනුරූප දී ටෙස්ට් mnemonics [ -n "$var" ]
, [ -n "${var+x}" ]
, [ "${#var[@]}" != 0 ]
, හා declare -p var
, පිළිවෙළින්.
test: -n +x #@ -p
var=foo: 0 0 0 0
var=(foo): 0 0 0 0
var=([0]=foo): 0 0 0 0
var=([x]=foo): 0 0 0 0
var=([y]=bar [x]=foo): 0 0 0 0
var='': 1 0 0 0
var=([0]=''): 1 0 0 0
var=([1]=''): 1 1 0 0
var=([1]=foo): 1 1 0 0
declare -A var; var=([x]=foo): 1 1 0 0
var=(): 1 1 1 0
declare -a var: 1 1 1 0
declare -A var: 1 1 1 0
unset var: 1 1 1 1
සාරාංශය
declare -p var &>/dev/null
(100%?) අවම වශයෙන් 3.0 සිට Bash හි නම් කරන ලද විචල්යයන් පරීක්ෂා කිරීම සඳහා විශ්වාසදායකය.
[ -n "${var+x}" ]
POSIX අනුකූල අවස්ථාවන්හිදී විශ්වාසදායක නමුත් අරා හැසිරවිය නොහැක.
- විචල්යයක් අස්ථිර දැයි පරීක්ෂා කිරීම සඳහා සහ වෙනත් කවච වල ප්රකාශිත විචල්යයන් පරීක්ෂා කිරීම සඳහා වෙනත් පරීක්ෂණ පවතී. නමුත් මෙම පරීක්ෂණ Bash හෝ POSIX ස්ක්රිප්ට් සඳහා සුදුසු නොවේ.
if test $# -gt 0; then printf 'arg <%s>\n' "$@"; fi
.