Bir değişkenin uzunluğunu doğrulayın


27

Değişken okuma uzunluğunu doğruladım (kodum beş karaktere eklenir), şöyle bir şey düşünüyorum:

#!/bin/bash
read string
check=${#string}
echo $check
if [ $check -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

daha "zarif" bir çözüm var mı?


1
Komut dosyanız standart POSIX’de düzgün çalışıyor /bin/sh. Shebang hattını değiştirmeyi düşünmelisiniz, #!/bin/shböylece daha taşınabilir ve bash'ın bulunmadığı ortamlarda çalıştırılabilir. Ayrıca, /bin/shetkileşimli kullanım için tasarlanan özelliklerle dolu olmayan çizgi gibi daha hafif bir kabuk olabilir.
Celada

@Celada, bu durumda gerçek olsa dash'ın ${#string}size bayt karakterler yerine sayısındaki uzunluğunu verecekti.
Stéphane Chazelas

Yanıtlar:


43

Daha zarif? Yok hayır

Daha kısa? Evet :)

#!/bin/bash
read string
if [ ${#string} -ge 5 ]; then echo "error" ; exit
else echo "done"
fi

Daha az olmak yerine daha fazla zerafet ticareti yapmakta sorun yaşamıyorsanız, daha az 2 satırlık bir senaryo olabilir:

#!/bin/bash
read string
[ ${#string} -ge 5 ] && echo "error" || echo "done"

Daha güvenli olduğunu düşünüyorsanız çift braket kullanabilirsiniz. Burada açıklama .


3

Bourne uyumlu bir alternatif ( ${#string}POSIX'dir ancak Bourne değil (bugünlerde Bourne kabuğuna rastlama ihtimaliniz yoktur)):

case $string in
  ?????*) echo >&2 Too long; exit 1;;
       *) echo OK
esac

Her ikisi için geldiğini hatırlatırız ${#string}ve ????bu bayt veya karakter sayısı olup olmayacağı, kabuk bağlı olacaktır. Genelde (ve POSIX tarafından zorunludur), karakter sayısıdır. Ancak dashbunun gibi bazı kabukları çok bayt farkında değildir, bunun yerine bayt olacaktır.

Bununla birlikte mksh, set -o utf8-modeçok baytlık karakterleri anlayabilmesi için (UTF-8 yerel ayarlarında) gerekir:

$ string=€€€ bash -c 'echo "${#string}"'
3
$ string=€€€ dash -c 'echo "${#string}"'
9
$ string=€€€ mksh -c 'echo "${#string}"'
9
$ string=€€€ mksh -o utf8-mode -c 'echo "${#string}"'
3
$ locale charmap
UTF-8

konu dışı, ama echo Too longbaşlıktan farklıecho 'Too long'
Steven Penny

Ve eğer sadece "çok uzun" olduğunda yazdıracaksanız, ifseçeneğim hakkında daha da

2
@StevenPenny, echo Too longiki bağımsız değişkenin (geçer Toove longüzere) echoolan echosüre, çıkışlar arasında bir boşluk (ve sonrasında bir yeni satır) echo 'Too long', biz bir geçmesi Too longiçin bağımsız değişken echobir yeni satır aşağıdaki görüntüler olan. Bu yüzden fonksiyonel eşdeğerdir.
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.