Ikiqat kvadrat mötərizələr [[]] bash kvadrat köşklərdə [] istifadə olunur?

Bu yaxınlarda bir işçi, bir [[ ]] quruluşunun [ ] kimi konstruksiyalarda üstün olması lazım olduğunu bir kod nəzərdən keçirdiyini bildirdi

 if [ "`id -nu`" = "$someuser" ] ; then echo "I love you madly, $someuser" fi 

O, izah edə bilmədi. Bir varmı?

407
21 марта '09 в 18:28 2009-03-21 18:28 Leonard 21 Mart '09 tarixində 18:28 'də təyin olundu, 2009-03-21 18:28
@ 7 cavab

[[ daha az sürpriz var və adətən istifadə etmək daha təhlükəsizdir. Amma bu portativ deyil - POSIX nə etdiyini göstərmir və yalnız bəzi kabuklar onu dəstəkləyir (bash ilə yanaşı, ksh bunu dəstəkləyir). Məsələn, edə bilərsiniz

 [[ -e $b ]] 

fayl mövcud olub olmadığını yoxlayın Ancaq [ $b ə qiymət vermək məcburiyyətindəsiniz, çünki bu, arqumenti bölüşdürür və "a*" kimi şeylərə genişləndirilir. Bu da [ xarici proqram ola bilər və hər hansı digər proqram kimi, öz arqumentini həmişə olduğu kimi qəbul edir (baxmayaraq ki, o da yerləşdirilə bilər, lakin bundan sonra bu xüsusi emal yoxdur).

[[ həmçinin =~ uyğun bir müntəzəm ifadə kimi digər gözəl xüsusiyyətlərə malikdir, eləcə də C tipli dillərdə tanınan operatorlar. Burada yaxşı bir səhifə var: Testlər arasındakı fərq nədir [[[ ?bash testləri

477
21 марта '09 в 18:44 2009-03-21 18:44 Johannes Schaub tərəfindən cavablandırılmışdır - 21 Mart 21: 09 'da, saat 18:44' da, 2009-03-21 18:44

Davranış fərqləri

Bash 4.3.11-də bəzi fərqlər:

  • POSIX vs Bash genişləndirilməsi:

  • sehrli müntəzəm komanda

    • [ bu, qəribə bir adı olan müntəzəm bir komandadır.

      ] yalnız arqumentdir [ bu, daha çox arqumentlərin istifadəsinə imkan vermir.

      Ubuntu 16.04 həqiqətən /usr/bin/[ coreutils tərəfindən verilmişdir, lakin bash daxili versiyası üstünlük təşkil edir.

      Bəşin bir komanda necə təhlil edildiyi heç bir dəyişiklik yoxdur.

      Xüsusilə, bu < redirection, > və || bir neçə əmrləri birləşdirən, ( ) qaçan deyilsə, subshellləri yaradır və sözlərin genişlənməsi hər zamanki kimi baş verir.

    • [[ X ]] sehrli təhlili X < , > , || olan tək ||() xüsusi () işlənir və söz bölüşdürmə qaydaları fərqlidir.

      Digər fərqlər var: ==~ .

      Bəsşeydə: Daxili komanda və [[ açar söz: https://askubuntu.com/questions/445749/whats-the-difference-between-shell-builtin-and-shell-keyword

  • <

  • > və ||

    • [[ a = a b = b ]] : doğru, məntiqi və
    • [ a = a b = b ] : sintaksis səhvi, > cmd1 cmd2 ayırıcı kimi cmd1 cmd2cmd1 cmd2 kimi ayrıştırılmış
    • [ a = a -ab = b ] : ekvivalent, lakin POSIX³ təklif edilməmişdir
    • [ a = a ] [ b = b ] : POSIX və etibarlı bərabərdir
  • (

    • [[ (a = a || a = b) a = b ]] : yanlışdır
    • [ ( a = a ) ] : sintaksis səhvi, () bir subshell kimi təfsir edilmişdir
    • [ \( a = a -oa = b \) -aa = b ] : ekvivalent, lakin () POSIX-də köhnəlmişdir
    • { [ a = a ] || [ a = b ]; } [ a = b ] { [ a = a ] || [ a = b ]; } [ a = b ] { [ a = a ] || [ a = b ]; } [ a = b ] { [ a = a ] || [ a = b ]; } [ a = b ] { [ a = a ] || [ a = b ]; } [ a = b ] POSIX ekvivalenti 5
  • söz bölüşdürmə və fayl adı nəsil uzadılması zamanı (split + glob)

    • x='a b'; [[ $x = 'ab' ]] x='a b'; [[ $x = 'ab' ]] x='a b'; [[ $x = 'ab' ]] x='a b'; [[ $x = 'ab' ]] : doğru, heç bir kotirovka lazım deyil
    • x='a b'; [ $x = 'ab' ] x='a b'; [ $x = 'ab' ] x='a b'; [ $x = 'ab' ] x='a b'; [ $x = 'ab' ] : sözdizimi səhvi, [ ab = 'ab' ]
    • x='*'; [ $x = 'ab' ] x='*'; [ $x = 'ab' ] x='*'; [ $x = 'ab' ] x='*'; [ $x = 'ab' ] : cari dizindəki birdən çox fayl varsa sözdizimi səhv.
    • x='a b'; [ "$x" = 'ab' ] x='a b'; [ "$x" = 'ab' ] x='a b'; [ "$x" = 'ab' ] x='a b'; [ "$x" = 'ab' ] : POSIX ekvivalenti
  • =

    • [[ ab = a? ]] [[ ab = a? ]] [[ ab = a? ]] [[ ab = a? ]] : Doğru, çünki desen eşleme yapar ( *? [ büyülüdür]). Cari qovluğa faylları genişletmiyor.
    • [ ab = a? ] [ ab = a? ] [ ab = a? ] [ ab = a? ] : a? top genişlənir. Belə ki, cari kataloqdakı fayllardan asılı olaraq doğru və ya yanlış ola bilər.
    • [ ab = a\? ] [ ab = a\? ] [ ab = a\? ] [ ab = a\? ] : yalançı deyil, qlobal genişlənmə deyil
    • === [[[ , [[ ===]) ilə eynidırlar.
    • case ab in (a?) echo match; esac case ab in (a?) echo match; esac case ab in (a?) echo match; esac case ab in (a?) echo match; esac case ab in (a?) echo match; esac case ab in (a?) echo match; esac : POSIX ekvivalenti
    • [[ ab =~ 'ab?' ]] [[ ab =~ 'ab?' ]] [[ ab =~ 'ab?' ]] [[ ab =~ 'ab?' ]] : saxta 4 '' ilə sehr sarsıdır
    • [[ ab? =~ 'ab?' ]] [[ ab? =~ 'ab?' ]] [[ ab? =~ 'ab?' ]] [[ ab? =~ 'ab?' ]] [[ ab? =~ 'ab?' ]] : doğru
  • =~

    • [[ ab =~ ab? ]] [[ ab =~ ab? ]] [[ ab =~ ab? ]] [[ ab =~ ab? ]] : Doğru, POSIX müntəzəm ifadə oyunu ? genişləndirməz
    • [ a =~ a ] : sintaksis səhvi. Heç bir ekvivalent bash.
    • printf 'ab\n' | grep -Eq 'ab?' : POSIX'e bərabərdir (tək xətt data)
    • awk 'BEGIN{exit !(ARGV[1] ~ ARGV[2])}' ab 'ab?' : POSIX ekvivalenti.

Tövsiyə : həmişə [] istifadə edin.

Hər bir [[ ]] quruluşu üçün POSIX ekvivalentləri var.

[[ ]] edin:

  • hərəkətliliyi itirməyin
  • oxucuya başqa bir bash uzadının incəliklərini bilmək üçün olsun. [ bu, qəribə bir adla adi bir əmrdir, xüsusi bir semantik tələb olunur.
border=0

Korn qabığında ekvivalent [[...]] quruluşundan ilhamlanıb

², lakin a və ya b nin bəzi dəyərləri uğursuz olur (məsələn, + və ya index ) və ab ondalık tamsayılar kimi baxarsa ədədi müqayisə aparır. expr "x$a" '<' "x$b" həm də ətrafında işləyir.

³, və ya a və ya b kimi bəzi dəyərlər uğursuz ! və ya ( .

BASH_COMPAT=3.1 3.2 və yuxarıdakı 4- də və bash 3.1 ilə uyğunluğun təmin BASH_COMPAT=3.1 ( BASH_COMPAT=3.1 ilə BASH_COMPAT=3.1 kimi)

Qruplaşmalara baxmayaraq (komanda qrupu ilə birlikdə (...) əvəzinə lazımsız bir başlanğıc başlayan (...) çünki || və operatorların ( > [[...]] və ya -o / -a [ ) operatorlarının əvəzinə > shell operatorları bərabər prioritetə ​​malikdirlər. Beləliklə, [ a = a ] || [ a = b ] [ a = b ] [ a = a ] || [ a = b ] [ a = b ] [ a = a ] || [ a = b ] [ a = b ] [ a = a ] || [ a = b ] [ a = b ] bərabər olardı.

52
30 нояб. Ciro Santilli tərəfindən verilmiş cavab 改造 改造 中心 六四 事件 法站 kab 30 Noyabr 2017-11-30 18:04 '17 saat 06:04 'da 2017-11-30 18:04

[[ ]] daha çox xüsusiyyətə malikdir - Daha ətraflı məlumat üçün, xüsusən 7- ci fəsildə genişləndirilmiş test əmri üçün Advanced Bash Scripting Guide ilə tanış olmanızı məsləhət görürəm. Testlər .

Yeri gəlmişkən, təlimatlar olaraq [[ ]] ksh88-də (Korn versiyasının 1988 versiyası) təqdim edilmişdir.

51
21 марта '09 в 18:32 2009-03-21 18:32 cavab 21 mart 21: 09-da saat 18: 32-da verilir

Hansı müqayisə, test, bracket və ya ikiqat bracket ən sürətli? ( http://bashcurescancer.com )

İki köşeli bir "kompozit komanda "dır, burada bir test və tək olaraq bracket daxili mərtəbələrdir (və eyni komanda da müvafiqdir). Beləliklə, bir qutu və ikiqat köşk bir başqa kodu yerinə yetirir.

Test və tək köşkdən ibarətdir ki, onlar ayrı və xarici əmrlər kimi mövcuddur. Lakin, BASH-ın uzaqdan müasir bir versiyasını istifadə edirsinizsə, ikili dəstək dəstəklənir.

8
21 марта '09 в 18:34 2009-03-21 18:34 cavab 21 mart 2009- cu il saat 18.33 -də verilmişdir

Tipik bir vəziyyət, [[autotools configure.ac skriptindəki] istifadə edə bilmədiyində, braçetlərin xüsusi və fərqli bir mənası vardır, beləliklə [və ya [[- bu testi qeyd edin və eyni proqramdır .

1
21 марта '15 в 20:23 2015-03-21 20:23 Cavab Vicente Adolfo Bolea Sanchezə verilir 21 Mart 'da 20:23' də 2015-03-21 20:23

Bir sözlə, [[daha yaxşı bir proses inkişaf etmir, çünki. Heç bir bracket və ya bir bracket bir cüt bracket daha yavaş, çünki başqa bir proses səbəb olur.

-1
24 нояб. cavab unix4linux 24 noyabr verilir . 2010-11-24 19:08 '10 at 19:08 2010-11-24 19:08

[[]] SunOS'un xüsusi bir versiyası və tamamilə icazəsiz daxili funksiya bəyanatları üçün cüt köşeli dəstəklənmir: GNU bash, version 2.02.0 (1) -release (sparc-sun-solaris2.6)

-1
19 марта '13 в 17:59 2013-03-19 17:59 cavab 19-19 mart 2013 tarixində saat 17:59 'də verilir