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
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
- Miku cevabı bu yana düzenlenen ve artık (bilinen) kusurları içerir.
- Değil kapsamlı bir listesi.
- 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. - Geçersiz (olmayan) komutları için, sadece Bash komut bulunamadı şikayet edecektir.
- Eğer uzunluk değer veriyorsan, ilk öneri en kısa olanıdır.
Nasıl Android global değişkenleri bild...
Nasıl/nodejs ile ABONE redis YAYINLAMA...
Nasıl && Facelets EL boolean ifadeleri...
Nasıl değişken bildirmek ve aynı SQL k...
Nasıl Bash dize değişkenleri bitiştirm...