Bir dəyişənin bash-də müəyyənləşdirildiyini yoxlamaq üçün necə?

Bir dəyişənin bash-də müəyyənləşdirildiyini necə öyrənmək olar?

Məsələn, istifadəçinin funksiyanın ilk parametresini verdiyini necə yoxlamaq olar?

 function a { # if $1 is set ? } 
1189
30 авг. prosseek 30 avqu . 2010-08-30 17:54 '10 at 17:54 2010-08-30 17:54
ответ 31 cavab
  • 1
  • 2

(Adətən) Doğru

 if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi 

${var+x} parametr uzadılmasıdır, bir şey hesablanmır, əgər var deyil və x başqa bir şəkildə əvəz edərsə.

Quotation sapma

Bu sözdizim və istifadə yalnız kotirovka tələb etmədiyi dərəcədə genişlənməsini təmin edir, çünki quotes ( "${var+x}" əvəzinə "${var+x}" ) [ -z "" ] kimi eyni dəyərlə (həqiqətlə) qiymətləndirmək üçün əlverişli olan x genişlənir ( [ -z ] fasilələr yoxdur, belə ki, [ -z ] ehtiyac yoxdur) və ya heç bir şey yoxdur.

Buna baxmayaraq, kotirovkaların təhlükəsiz şəkildə silinməsinə baxmayaraq, hər kəs üçün dərhal aydın olmadıqda ( bu izahatın ilk müəllifi üçün, qiymətlər əsas bash kodlayıcı deyil, hətta açıq deyildir) bəzən [ -z "${var+x}" ] O (1) dərəcəsi üçün çox aşağı qiymətə uyğun qiymətə. Birinci müəllif də bu cavabı, bu cavabın URL'sini göstərərək kodun yanındakı bir şərh olaraq əlavə etdi və bu da indi də qiymətlərin təhlükəsiz şəkildə atılmasına səbəb olan bir izahat daxildir.

(Tez-tez) Səhv

 if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi 

Bu, yanlış dəyişən və boş bir dize təyin olunan bir dəyişən arasındakı fərqləri əks etdirmədiyi üçün tez-tez yanlışdır. Yəni əgər var='' , onda yuxarıdakı həll "var boşdur".

Unset və boş dizgə ilə təyin olunma arasındakı fərq, istifadəçinin bir uzantı və ya əlavə əmlak siyahılarını müəyyən etməsi və boş olmayan bir domenin göstərilməsi üçün boş olmayan bir dəyəri əlavə xüsusiyyətlər siyahısı etməsi vacibdir.

Ancaq hər ssenaridə fərq ola bilər. Belə hallarda, [ -z "$var" ] olacaq.

1799
13 дек. Cavab Lionel 13 dekabr. 2012-12-13 20:04 '12 at 8:04 pm 2012-12-13 20:04

Dize dəyişənini yoxlamaq üçün -n ULL / not -z deyil, yəni. Qurulmuş halda istifadə edin

 if [ -n "$1" ] 

Bu qarşı- -z . Mən daha çox -z istifadə edirəm.

border=0

Bunu aşağıdakı kimi istifadə edərdiniz:

 if [ -n "$1" ]; then echo "You supplied the first parameter!" else echo "First parameter not supplied." fi 
709
30 авг. cavab mbrannig 30 aug verilir . 2010-08-30 18:17 '10 at 6:17 PM 2010-08-30 18:17

Burada, boşluğun ("Null") və ya dəyəri ilə unset parametresinin olub olmadığını kontrol et:

 +--------------------+----------------------+-----------------+-----------------+ | | parameter | parameter | parameter | | | Set and Not Null | Set But Null | Unset | +--------------------+----------------------+-----------------+-----------------+ | ${parameter:-word} | substitute parameter | substitute word | substitute word | | ${parameter-word} | substitute parameter | substitute null | substitute word | | ${parameter:=word} | substitute parameter | assign word | assign word | | ${parameter=word} | substitute parameter | substitute null | assign word | | ${parameter:?word} | substitute parameter | error, exit | error, exit | | ${parameter?word} | substitute parameter | substitute null | error, exit | | ${parameter:+word} | substitute word | substitute null | substitute null | | ${parameter+word} | substitute word | substitute word | substitute null | +--------------------+----------------------+-----------------+-----------------+ 

Mənbə: POSIX: parametr genişləndirilməsi :

"Əvəzedicilər" ilə göstərilən bütün hallarda ifadə ifadə olunan dəyərlə əvəz olunur. Tapşırıqdan istifadə edilən bütün hallarda, bu tapşırığa bir dəyər verilir, bu da ifadəni əvəz edir.

408
25 мая '13 в 23:20 2013-05-25 23:20 Cavab Jens tərəfindən 25 May 'da 23:20' də verilir 2013-05-25 23:20

Burada göstərilən metodların əksəriyyəti doğru olsa da, bash 4.2 bir dəyişən ( man bash ) varlığı üçün faktiki testi dəstəkləyir və dəyişənin dəyərini test etmir.

 [[ -v foo ]]; echo $? # 1 foo=bar [[ -v foo ]]; echo $? # 0 foo="" [[ -v foo ]]; echo $? # 0 

Qeyd etmək lazımdır ki, bu yanaşma set -u / set -o nounset set -u dəyişənini test etmək üçün istifadə olunduqda səhv set -o nounset , digər yanaşmalardan fərqli olaraq [ -z .

173
09 июля '13 в 5:28 2013-07-09 05:28 Cavab Russell Harmon tərəfindən 09 İyul 2013, 5:28 'də verildi 2013-07-09 05:28

Bunu etmək üçün bir çox yol var, bunlardan biri aşağıdakılardır:

 if [ -z "$1" ] 

$ 1 null və ya unset halda bu icra edilir

169
30 авг. Ennuikiller tərəfindən verilmiş cavab 30 Avqust. 2010-08-30 18:00 '10, 18:00 'da, 2010-08-30 18:00

Bir değişkenin değişken olup olmadığını öğrenmek üçün istifadə edirəm

 if [[ $var ]]; then ... # `$var' expands to a nonempty string 

Değişkenin ayarlanmadığı və ya boş olduğu takdirde testler:

 if [[ ! $var ]]; then ... # `$var' expands to the empty string (set or not) 

Değişkenin müəyyən olub-olmadığını (boş və ya boş olmayan) tapmaq üçün istifadə edirəm

 if [[ ${var+x} ]]; then ... # `var' exists (empty or nonempty) if [[ ${1+x} ]]; then ... # Parameter 1 exists (empty or nonempty) 

Değişkenin ayarlanmadığı takdirde testler:

 if [[ ! ${var+x} ]]; then ... # `var' is not set at all if [[ ! ${1+x} ]]; then ... # We were called with no arguments 
57
08 мая '13 в 11:32 2013-05-08 11:32 cavab 08 may 2013- cü il saat 11:32 tarixində phkoester tərəfindən verilmişdir 2013-05-08 11:32

Mən həmişə POSIX masasını başqa bir cavabda yavaş-yavaş başa düşürəm, buna görə də mən özümü götürürəm:

  +----------------------+------------+-----------------------+-----------------------+ | if VARIABLE is: | set | empty | unset | +----------------------+------------+-----------------------+-----------------------+ - | ${VARIABLE-default} | $VARIABLE | "" | "default" | = | ${VARIABLE=default} | $VARIABLE | "" | $(VARIABLE="default") | ? | ${VARIABLE?default} | $VARIABLE | "" | exit 127 | + | ${VARIABLE+default} | "default" | "default" | "" | +----------------------+------------+-----------------------+-----------------------+ :- | ${VARIABLE:-default} | $VARIABLE | "default" | "default" | := | ${VARIABLE:=default} | $VARIABLE | $(VARIABLE="default") | $(VARIABLE="default") | :? | ${VARIABLE:?default} | $VARIABLE | exit 127 | exit 127 | :+ | ${VARIABLE:+default} | "default" | "" | "" | +----------------------+------------+-----------------------+-----------------------+ 

Hər bir qrupun (əvvəlki kolon ilə və ya olmadan) eyni dəstə malik olduğunu və halları ləğv etdiyini nəzərə alsaq, fərqli olan tək şey boş hallarda necə aparılır.

Əvvəlki kolonda, boş və müəyyən edilməmiş hallar bir-birinə bərabərdir, buna görə mümkün olduqda onları istifadə edəcəyəm (yəni, istifadə edin := və yalnız deyil, çünki boş halda uyğun deyildir).

Baş xəbərlər:

  • VARIABLE boş deyil ( VARIABLE="something" )
  • boş boş VARIABLE boş / null ( VARIABLE="" )
  • unset deyil VARIABLE yoxdur ( unset VARIABLE )

Dəyərlər:

  • $VARIABLE nəticə dəyişənin orijinal dəyəridir.
  • "default" nəticəsi bir əvəz simli olduğunu deməkdir.
  • "" nəticəsi null (boş simli) deməkdir.
  • exit 127 kodunun 127 kodunun exit kodu ilə bitməsi deməkdir.
  • $(VARIABLE="default") nəticə dəyişənin orijinal dəyəri olduğunu və gələcək istifadəsi üçün dəyişən əvəz simvolu təyin edilməsini nəzərdə tutur.
46
17 июня '17 в 18:19 2017-06-17 18:19 cavab 17 iyun 17: 18-də 2017-06-17 18:19 tarixində verilir

Bəşin müasir versiyasında (4.2 və ya daha sonra, əminəm ki, bilmirəm) bunu sınamaq olardı:

 if [ ! -v SOMEVARIABLE ] #note the lack of a $ sigil then echo "Variable is unset" elif [ -z "$SOMEVARIABLE" ] then echo "Variable is set to an empty string" else echo "Variable is set to some string" fi 
31
26 авг. Seamus Connor tərəfindən verilmiş cavab 26 avqu. 2013-08-26 19:24 '13 da 19:24 2013-08-26 19:24
 if [ "$1" != "" ]; then echo \$1 is set else echo \$1 is not set fi 

Mübahisələrə görə, bir qayda olaraq, mənim fikrimcə, arqumentlərin sayı olan # $ 'ni yoxlamaq yaxşıdır.

 if [ $# -gt 0 ]; then echo \$1 is set else echo \$1 is not set fi 
18
30 авг. Paul Creasey tərəfindən verilən cavabı 30 aug. 2010-08-30 18:00 '10, 18:00 'da, 2010-08-30 18:00

Əgər əlil olsaydı çıxmaq istəyirsən

Mənim üçün çalışdı. Parametr müəyyən edilmədikdə mənim skriptə səhv mesajla gəlmək istəmişdim.

 #!/usr/bin/env bash set -o errexit # Get the value and empty validation check all in one VER="${1:?You must pass a version of the format 0.0.0 as the only argument}" 

Bu başlanğıcda bir səhv ilə qaytarılır.

 peek@peek:~$ ./setver.sh ./setver.sh: line 13: 1: You must pass a version of the format 0.0.0 as the only argument 

Yalnız yoxlayın, heç bir çıxış - Boş və Qoşula - INVALID

Yalnız bu dəyəri = VALID və ya unset / empty = INVALID olub olmadığını yoxlamaq istəyirsinizsə, bu seçimi cəhd edin.

 TSET="good val" TEMPTY="" unset TUNSET if [ "${TSET:-}" ]; then echo "VALID"; else echo "INVALID";fi # VALID if [ "${TEMPTY:-}" ]; then echo "VALID"; else echo "INVALID";fi # INVALID if [ "${TUNSET:-}" ]; then echo "VALID"; else echo "INVALID";fi # INVALID 

Və ya hətta qısa testlər; -)

 [ "${TSET:-}" ]  echo "VALID" || echo "INVALID" [ "${TEMPTY:-}" ]  echo "VALID" || echo "INVALID" [ "${TUNSET:-}" ]  echo "VALID" || echo "INVALID" 

Yalnız yoxlayın, heç bir çıxış - yalnız boş - INVALID

Və bu sualın cavabıdır. Yalnızca dəyəri / boş = VALID və ya unset = INVALID olaraq ayarlanmış olub olmadığını yoxlamaq istəsəniz bunu istifadə edin.

Qeyd. "1" -də "..- 1" "bir qədər, hər şey ola bilər (məsələn, x)

 TSET="good val" TEMPTY="" unset TUNSET if [ "${TSET+1}" ]; then echo "VALID"; else echo "INVALID";fi # VALID if [ "${TEMPTY+1}" ]; then echo "VALID"; else echo "INVALID";fi # VALID if [ "${TUNSET+1}" ]; then echo "VALID"; else echo "INVALID";fi # INVALID 

Qısa testlər

 [ "${TSET+1}" ]  echo "VALID" || echo "INVALID" [ "${TEMPTY+1}" ]  echo "VALID" || echo "INVALID" [ "${TUNSET+1}" ]  echo "VALID" || echo "INVALID" 

Bu cavabı, @ mklement0 (şərhlər) adlandırıram, bu da mənə sualın dəqiq cavab verməsinə etiraz etdi.

Link http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_02

15
09 дек. Jarrod Chesney Dec 09 tərəfindən verilmiş cavab 2016-12-09 06:34 '16 saat 06:34 'da 2016-12-09 06:34

bash manual səhifəsində "Parametrelərin genişləndirilməsi" bölməsini oxuyun. Parametrlərin genişləndirilməsi müəyyən bir dəyişkənlik üçün ümumi bir test vermir, lakin müəyyən edilməmiş bir parametri ilə bir neçə şey var.

Məsələn:

 function a { first_arg=${1-foo} # rest of the function } 

təyin first_arg $1 ə təyin first_arg , əks halda "foo" dəyərini istifadə edir. Bir parametr almaq üçün heç bir şərt yoxdur və yaxşı bir vəziyyət yoxdur, əgər parametr göstərilmirsə, səhv mesajı ilə çıxış edə bilərsiniz:

 function a { : ${1?a must take a single argument} # rest of the function } 

(Bu istifadədə qeyd edin : yalnız öz arqumentlərinin dəyərlərini genişləndirən null komanda kimi. Bu nümunədə $1 ilə heç bir şey etmək istəmirik, əgər müəyyən edilməmişsə, buraxın)

14
01 февр. cavab şpner verildi 01 fevral. 2012-02-01 01:05 '12 'də 1:05' da 2012-02-01 01:05

Bir değişkenin boş olmayan bir [ -n "$x" ] ayarlanıp ayarlanmadığını kontrol [ -n "$x" ] , başkaları [ -n "$x" ] istifadə edin.

Çox hallarda, bir dəyişənə təyin olunmayan bir dəyişən kimi eyni şəkildə boş bir dəyərlə işlənmək məsləhət görülür. Lazım olduqda [ -n "${x+set}" ] ayırmaq olar: [ -n "${x+set}" ] ( "${x+set}" x set edildikdə və x müəyyən edilmədikdə boş bir dize təyin etmək üçün genişlənir).

Parametrin ötürülən olub olmadığını yoxlamaq üçün funksiyaya ötürülən parametrlərin sayını əks etdirən $# və ya (funksiyasız deyilsə, scriptdə) test edin (bax Pauldan Cavab ).

12
31 авг. Cavab Gilles 31 avqustda verilir. 2010-08-31 10:30 '10 10:30 'da 2010-08-31 10:30

-v də daxili-daxili [[ ]] istifadə edə bilərsiniz:

 #! /bin/bash -u if [[ ! -v SOMEVAR ]]; then SOMEVAR='hello' fi echo $SOMEVAR 
12
08 февр. cavab AlejandroVD verildi 08 fevral. 2016-02-08 16:31 '16 'da 16:31 2016-02-08 16:31

Kontrol etmək istəyənlər üçün, sıfırlanmır və ya deyil, set -u script ilə skriptdə:

 if [ -z "${var-}" ]; then echo "Must provide var environment variable. Exiting...." exit 1 fi 

Daimi [ -z "$var" ] var; unbound variable ilə icra edilməyəcək var; unbound variable var; unbound variable var; unbound variable set -u lakin [ -z "${var-}" ] əgər boş bir dize genişlənirsə , var olmayan yüklənməyən var; unbound variable .

11
16 нояб. Cavab noyabrın 16-da verilib. 2016-11-16 14:26 '16 'da 14:26' də 2016-11-16 14:26

Yuxarıdakı cavablar, Bash set -u seçimi effektiv olduqda işləməyəcəkdir. Bundan əlavə, onlar dinamik deyil, məsələn, "dummy" adlı bir dəyişən necə yoxlanılır? Aşağıdakıları cəhd edin:

 is_var_defined() { if [ $# -ne 1 ] then echo "Expected exactly one argument: variable name as string, eg, 'my_var'" exit 1 fi # Tricky. Since Bash option 'set -u' may be enabled, we cannot directly test if a variable # is defined with this construct: [ ! -z "$var" ]. Instead, we must use default value # substitution with this construct: [ ! -z "${var:-}" ]. Normally, a default value follows the # operator ':-', but here we leave it blank for empty (null) string. Finally, we need to # substitute the text from $1 as 'var'. This is not allowed directly in Bash with this # construct: [ ! -z "${$1:-}" ]. We need to use indirection with eval operator. # Example: $1="var" # Expansion for eval operator: "[ ! -z \${$1:-} ]" -> "[ ! -z \${var:-} ]" # Code execute: [ ! -z ${var:-} ] eval "[ ! -z \${$1:-} ]" return $? # Pedantic. } 

Müvafiq: Bash-da, dəyişən "-u" rejimində müəyyənləşdirildiyinə necə baxa bilərəm?

4
09 нояб. Cavab 09 noyabr Kevinarpe tərəfindən verilir. 2013-11-09 11:55 '13 at 11:55 2013-11-09 11:55

Bunu edə bilərsiniz:

 function a { if [ ! -z "$1" ]; then echo '$1 is set' fi } 
4
30 авг. Cavab 30 avqust cümə günü verilmişdir 2010-08-30 18:01 '10 at 18:01 2010-08-30 18:01

var bir sıra ola bilərsə, parametrenin [ -z "${var+x}" ] əvəz edilməsi səhvdir. Bəşdən əmin olmaq üçün, aşağıda göstərildiyi kimi bir sıra sintaksisindən istifadə etmək lazımdır , məsələn, [ "${#var[@]}" = 0 ] .

 is-var-set () { results="\${var+x}=${var+x}\t\${#var[@]}=${#var[@]}" if [ -z "${var+x}" ]  [ "${#var[@]}" = 0 ]; then echo -e "$1: var unset.\t$results" elif [ -n "${var+x}" ]  [ "${#var[@]}" != 0 ]; then echo -e "$1: var is set. \t$results" else echo -e "$1: Is var set? \t$results" fi unset var # so we don't have to do it everywhere else } 

Demək olar ki, bütün hallarda, razılaşırlar. Array üsulunu tapdığım yeganə vəziyyət, dəyişən 0 sıfır mövqeyinə malik boş olmayan bir sıra olduğunda daha dəqiqdir (məsələn, testlər 7A ). Bu uyğunsuzluq $var ${var[0]} üçün bir kısaltma, çünki [ -z "${var+x}" ] bütün array yoxlamaq baş verir.

Mənim testlərim:

 unset var; is-var-set 1 # var unset var=''; is-var-set 2 # var[0] set to '' var=foo; is-var-set 3 # var[0] set to 'foo' var=(); is-var-set 4 # var unset (all indices) var=(foo); is-var-set 5 # var[0] set to 'foo' var=([0]=foo); is-var-set 6 # var[0] set to 'foo' var=([1]=foo); is-var-set 7 # var[0] unset, but var[1] set to 'foo' declare -a var; is-var-set 8 # var empty, but declared as an array declare -A var; is-var-set 9 # var empty, but declared as an associative array declare -A var # Because is-var-set() conveniently unsets it var=([xz]=foo); is-var-set A # var[xz] set to 'foo', but var otherwise empty declare -a var # Demonstrate that Bash knows about var, even when there's declare -A var; is-var-set B # apparently no way to just _check_ its existence 

Aşağıdakı nəticə:

2
15 февр. 15 fevralda Mark Hafkamp tərəfindən verilmiş cavab. 2016-02-15 17:32 '16 saat 17:32 'da 2016-02-15 17:32

[[ -z "$var" ]] istifadə edərək, bir dəyişənin təyin edilmiş olub olmadığını tapmaq üçün asan bir yoldur, lakin -z parametri, bir -z dəyişən və dəyişən bir boş -z :

 $ set='' $ [[ -z "$set" ]]  echo "Set" || echo "Unset" Unset $ [[ -z "$unset" ]]  echo "Set" || echo "Unset" Unset 

Değişkenin tipine göre: env değişkenine, parametreye və ya düzenli değişkene göre kontrol etmek yaxşıdır.

Env dəyişən üçün:

 [[ $(env | grep "varname=" | wc -l) -eq 1 ]]  echo "Set" || echo "Unset" 

Bir parametr üçün (məsələn, bir parametrenin varlığını yoxlamaq üçün $5 ):

 [[ $# -ge 5 ]]  echo "Set" || echo "Unset" 

Müntəzəm bir dəyişən üçün (zərif bir şəkildə bunu etmək üçün bir köməkçi funksiyası istifadə edin):

 function declare_var { declare -p "$1"  /dev/null return $? } declare_var "var_name"  echo "Set" || echo "Unset" 

Qeydlər:

  • $# : mövqelər parametrlərinin sayını göstərir.
  • declare -p : parametr kimi qəbul edilmiş dəyişənlərin tərifini verir. Əgər varsa, 0 qaytarır, əgər yoxsa, 1 qaytarır və bir səhv mesajı göstərilir.
  • $? : icra edilən son əmr status kodunu verir.
2
19 окт. Cavab Peregring-lk 19 oktyabr verilir. 2014-10-19 01:09 '14 at 1:09 2014-10-19 01:09

Tercih etdiyim üsul:

 $var=10 $if ! ${var+false};then echo "is set";else echo "NOT set";fi is set $unset var $if ! ${var+false};then echo "is set";else echo "NOT set";fi NOT set 

Prinsipcə, bir dəyişən müəyyən edildikdə, "nəticələnən false " (bu, true = "təyin olunacaq) inkar edilməsinə çevrilir.

Əgər müəyyən edilməmişsə, "nəticələnən true inkar edilməsi" halına çevrilir (boş nəticələr true kimi qiymətləndirilir) (beləliklə false = "QEYD OLUNMAYAN" kimi başa çatacaq).

1
15 нояб. Cavab verilir Aquarius Power 15 nov. 2014-11-15 20:55 '14 da 20:55 2014-11-15 20:55

Qabıqda, -z operatorunu istifadə edə bilərsiniz, yəni simli uzunluq -z True.

MY_VAR , MY_VAR u mənim MY_VAR üçün sadə bir sıra quraşdırılmışdır, əks halda mesajı göstərə bilərsiniz:

 [[ -z "$MY_VAR" ]]  MY_VAR="default" [[ -z "$MY_VAR" ]]  MY_VAR="default" || echo "Variable already set." 
1
22 сент. Sep 22-də Kenorbaya cavab verildi 2014-09-22 16:57 '14 saat 16:57 2014-09-22 16:57
 if [[ ${!xx[@]} ]] ; then echo xx is defined; fi 
0
11 февр. Cavab Graham fevral 11-də verilir 2015-02-11 23:51 '15 at 23:51 2015-02-11 23:51
 if [[ ${1:+isset} ]] then echo "It was set and not null." > else echo "It was not set or it was null." > fi if [[ ${1+isset} ]] then echo "It was set but might be null." > else echo "It was was not set." > fi 
0
30 июня '13 в 8:22 2013-06-30 08:22 cavab 30 iyun 'da 8:22' də verildi. 2013-06-30 08:22

$@ Bir şey yoxlamaq istəyirsinizsə, bunu etmək üçün (çox) daha yaxşı kod tapdım.

 əgər [[$ 1 = ""]] sonra   '$ 1 boş deyil' başqa   echo '$ 1 doldu' fi

Niyə bunların hamısı? $@ test -z hər şey test -z , ancaq default olaraq boşdur, test -ztest -n sizə kömək edə bilməz.

Yeniləmə: Siz həmçinin parametrlərdəki simvolların sayını da saya bilərsiniz.

 əgər [$ {# 1} = 0] sonra   '$ 1 boş deyil' başqa   echo '$ 1 doldu' fi
0
18 нояб. Cavab Zlatan 18 noyabrda verilir . 2013-11-18 17:44 '13 at 17:44 2013-11-18 17:44

Mən həmişə bu metoddan istifadə edirəm ki, ilk dəfə kodu görən birinin anlayışını anlamaq asandır:

 if [ "$variable" = "" ] then echo "Variable X is empty" fi 

Və boş olmadığını yoxlamaq istəyirsinizsə,

 if [ ! "$variable" = "" ] then echo "Variable X is not empty" fi 

Nədir?

0
07 сент. cavab verdi mijnnaam 07 sep . 2013-09-07 12:06 '13 at 12:06 2013-09-07 12:06

Hər gün mən istifadə edirəm:

 # # Check if a variable is set # param1 name of the variable # function is_set() { [[ -n "${1}" ]]  test -n "$(eval "echo "\${${1}+x}"")" } 

Bash 3.0 əvvəl Linux və Solaris altında yaxşı işləyir.

 bash-3.00$ myvar="TEST" bash-3.00$ is_set myvar ; echo $? 0 bash-3.00$ mavar="" bash-3.00$ is_set myvar ; echo $? 0 bash-3.00$ unset myvar bash-3.00$ is_set myvar ; echo $? 1 
0
11 дек. Cavab fr00tyl00p 11 dekabr verilir. 2014-12-11 18:24 '14 at 18:24 2014-12-11 18:24
 (( ${#foo} )) 

və ya

 declare -p foo 
0
11 мая '14 в 7:59 2014-05-11 07:59 Cavab 11 may 2014-cü il saat 7: 59-da Steven Penny tərəfindən verilir

Başın kobud detallarını gizlətmək üçün köməkçi funksiyaları sevirəm. Bu vəziyyətdə daha çox (gizli) dürüstlük əlavə olunur:

 # The first ! negates the result (can't use -n to achieve this) # the second ! expands the content of varname (can't do ${$varname}) function IsDeclared_Tricky { local varname="$1" ! [ -z ${!varname+x} ] } 

Bu tətbiqdə ilk dəfə səhvlərim olduğundan (Jens və Lionelin cavablarından ilhamlanaraq) başqa bir həll yolu ilə gəldim:

 # Ask for the properties of the variable - fails if not declared function IsDeclared() { declare -p $1  } 

Mən bunu daha sadə, daha çox Bask və anlamaq / yadda asanlaşdırır. Test vəziyyətində bu, bərabərdir:

 function main() { declare -i xyz local foo local bar= local baz='' IsDeclared_Tricky xyz; echo "IsDeclared_Tricky xyz: $?" IsDeclared_Tricky foo; echo "IsDeclared_Tricky foo: $?" IsDeclared_Tricky bar; echo "IsDeclared_Tricky bar: $?" IsDeclared_Tricky baz; echo "IsDeclared_Tricky baz: $?" IsDeclared xyz; echo "IsDeclared xyz: $?" IsDeclared foo; echo "IsDeclared foo: $?" IsDeclared bar; echo "IsDeclared bar: $?" IsDeclared baz; echo "IsDeclared baz: $?" } main 

Testi göstərir ki, local var bildirir var ('=' əməl etmədikcə). Bir müddət düşündüm ki, mən bu şəkildə dəyişənləri bəyan etmişəm, yalnız niyyətimi ifadə etdiyim üçün indi tapmaq ... Bu qeyri-op deyil, düşünürəm.

IsDeclared_Tricky xyz: 1
IsDeclared_Tricky foo: 1
IsDeclared_Tricky paneli: 0
IsDeclared_Tricky bazası: 0
Xəyanətləndirilmişdir: 1
IsDeclared foo: 1
İşlənmiş panel: 0
IsDeclared baz: 0

BONUS: usecase

Mən əsasən bu testi bir neçə "zərif" və təhlükəsiz şəkildə (demək olar ki, bir interfeysə bənzəyir) funksiyaları vermək (və qaytarmaq) üçün istifadə edirlər:

 #auxiliary functions function die() { echo "Error: $1"; exit 1 } function assertVariableDeclared() { IsDeclared "$1" || die "variable not declared: $1" } function expectVariables() { while (( $# > 0 )); do assertVariableDeclared $1; shift done } # actual example function exampleFunction() { expectVariables inputStr outputStr outputStr="$inputStr world!" } function bonus() { local inputStr='Hello' local outputStr= # remove this to trigger error exampleFunction echo $outputStr } bonus 

Əgər bütün çağırışlar elan edilmiş dəyişənlər tələb etsə:

Salam dünya!

daha çox:

Hata: dəyişən elan edilməmişdir: outputStr

-1
01 марта '16 в 16:12 2016-03-01 16:12 Cavab 01 mart '16' da 16:12 ' də Daniel S' ye verilərək 2016-03-01 16:12

Değişkenin bağlı və ya bağlanılmadığını kontrol etmek isterseniz, bu nounset seçeneğini açtığınızda bile yaxşı çalışır:

 set -o noun set if printenv variableName >/dev/null; then # variable is bound to a value else # variable is unbound fi 
-1
25 мая '13 в 23:01 2013-05-25 23:01 Cavab 25 May 2013, 11:13 pm 2013-05-25 23:01 istifadəçi tərəfindən verilir

Bir dəyişənin olub-olmadığını yoxlamaq üçün funksiyalar

boş olan $array=()


Aşağıdakı funksiyalar, verilən adın dəyişən kimi olub olmadığını yoxlayır.

 # The first parameter needs to be the name of the variable to be checked. # (See example below) var_is_declared() { { [[ -n ${!1+anything} ]] || declare -p $1  } var_is_unset() { { [[ -z ${!1+anything} ]]  ! declare -p $1  } 
  • При первом тестировании, если переменная (un) установлена, вызов declare можно избежать, если это не необходимо.
  • Если, однако, $1 содержит имя пустого $array=() , вызов объявления будет гарантировать, что мы получим правильный результат
  • До сих пор не передавалось много данных в /dev/null, поскольку declare вызывается только в том случае, если переменная не установлена ​​или пустой массив.

Эти функции будут проверяться, как показано в следующих условиях:

 a; # is not declared a=; # is declared a="foo"; # is declared a=(); # is declared a=(""); # is declared unset a; # is not declared a; # is unset a=; # is not unset a="foo"; # is not unset a=(); # is not unset a=(""); # is not unset unset a; # is unset 

.

Подробнее...

и тест script см. мой ответ на вопрос "Как проверить, существует ли переменная в bash?" .

Примечание: Аналогичное использование declare -p , как это показано также Peregring-lk ответ , поистине случайный. В противном случае, я бы, конечно, придумал это!

-1
ответ дан Martin Rüegg 12 марта '16 в 1:06 2016-03-12 01:06

Чтобы проверить, установлен ли параметр var или нет

 var=""; [[ $var ]]  echo "set" || echo "not set" 
-2
ответ дан koola 21 нояб. '12 в 14:09 2012-11-21 14:09
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос