SORU
1 HAZİRAN 2010, Salı


Nasıl ve kabuk boolean değişkenleri bildirmek kullanılır?

Aşağıdaki sözdizimini kullanarak: kabuk boolean bir değişkeni bildirmek için çalıştım

variable=$false

variable=$true

Bu doğru mu? Eğer update etmek istesem de, bu değişken aynı sözdizimini kullanır mıydım? Son olarak, ifadeleri doğru olarak boolean değişkenleri kullanmak için aşağıdaki sözdizimini

if [ $variable ]

if [ !$variable ]

CEVAP
18 Ocak 2014, CUMARTESİ


TL;DR

bool=true

if [ "$bool" = true ]

Miku (original) ile cevap verir

Yapıyorumdeğilkabul cevabı öneririz1. Onun sözdizimi, ama bazı kusurları var çok güzel.

Aşağıdaki iki koşul var.

if $var; then
  echo 'Muahahaha!'
fi

Aşağıdaki durumlarda2bu durumu değerlendirirdoğruve iç içe komutunu çalıştırın.

# Variable var not defined beforehand. Case 1
var=''  # Equivalent to var="".        Case 2
var=    #                              Case 3
unset var  #                           Case 4
var='<some valid command>'  #          Case 5

Genellikle sadece "" değişken, var Bu örnekte açık bir şekilde true olarak ayarlanır. boolean zaman doğru değerlendirmek durumunuz istiyorum Diğer durumlarda tehlikeli biçimde yanıltıcı!

Son durum (#5) komut değişkeninde bulunan çalıştırır çünkü özellikle yaramazlık durum geçerli komutlar için true değerini verir . bu yüzden ( ^sup>, 4 3).

Burada zararsız bir örnek:

var='echo this text will be displayed when the condition is evaluated'
if $var; then
  echo 'Muahahaha!'
fi

# Outputs:
# this text will be displayed when the condition is evaluated
# Muahahaha!

Değişkenleri alıntı daha güvenli, örneğin if "$var"; then. Yukarıdaki durumda, komut bulunmayan bir uyarı almalısınız. Ama hala daha iyi (altındaki bilgilere bakınız) yapabiliriz.

Also see Mike Holt's explanation of Miku's original answer.

Hbar cevabı ile ilgili sorunlar

Bu yaklaşım aynı zamanda beklenmedik davranışlar vardır.

var=false
if [ $var ]; then
  echo "This won't print, var is false!"
fi

# Outputs:
# This won't print, var is false!

Yukarıdaki koşul false, böylece asla iç içe deyimi yürütme değerlendirmek için beklenir. Sürpriz!

Değeri ("false") alıntı, değişken ("$var") alıntı veya test ya da [ yerine [[ kullanarak bir fark yaratmıyor.

Ben ne tavsiye:

Buradasınız kontrol öneririm yolları "". booleans Beklendiği gibi çalışıyor.

bool=true

if [ "$bool" = true ]; then
if [ "$bool" = "true" ]; then

if [[ "$bool" = true ]]; then
if [[ "$bool" = "true" ]]; then
if [[ "$bool" == true ]]; then
if [[ "$bool" == "true" ]]; then

if test "$bool" = true; then
if test "$bool" = "true"; then

Hemen hemen eşdeğer. Yazın için diğer cevapları yaklaşımlar daha birkaç tuş vuruşlarını5ama kodunuzu daha defansif olacak.


Dipnotlar

  1. Miku cevabı bu yana düzenlenen ve artık (bilinen) kusurları içerir.
  2. Değil kapsamlı bir listesi.
  3. Bu bağlamda geçerli bir komut var bu komut anlamına gelir. Eğer komutu doğru veya yanlış kullanılırsa bir önemi yok. E. g. man woman yine de eğer böyle bir adam sayfa varsa bile geçerli bir komut olarak görülür.
  4. Geçersiz (olmayan) komutları için, sadece Bash komut bulunamadı şikayet edecektir.
  5. Eğer uzunluk değer veriyorsan, ilk öneri en kısa olanıdır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Darren Kitchen

    Darren Kitch

    3 EKİM 2011
  • kremosakhaz

    kremosakhaz

    25 AĞUSTOS 2006
  • ThisWeekYT

    ThisWeekYT

    14 Mart 2013