Bir değişkeni bir dizeyle nasıl karşılaştırırım (ve eşleşirse bir şeyler yaparım)?
Bir değişkeni bir dizeyle nasıl karşılaştırırım (ve eşleşirse bir şeyler yaparım)?
Yanıtlar:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Eğer onlar eşleşmeyen bir şey yapmak istiyorsanız, yerini =
ile !=
. Dizge işlemleri ve aritmetik işlemler hakkında daha fazla bilgiyi ilgili dokümanlarda bulabilirsiniz.
$x
?Tırnakların etrafında olmasını istiyorsunuz $x
, çünkü boşsa, Bash betiğiniz aşağıda görüldüğü gibi bir sözdizimi hatasıyla karşılaşır:
if [ = "valid" ]; then
==
Operatörün standart dışı kullanımıBash'in ==
eşitlik için kullanılmasına izin verdiğini unutmayın [
, ancak bu standart değildir .
Tırnakların $x
isteğe bağlı olduğu ilk durumu kullanın :
if [[ "$x" == "valid" ]]; then
veya ikinci vakayı kullanın:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
. Bunu ["$ 1" = "on"] olarak değiştirmek sorunu çözdü.
=
değil iki değil.
[ $x -eq "valid" ]
. -eq
dizeler için değil tamsayılar için karşılaştırma operatörüdür.
["x$yes" == "xyes"]
, hem değişkene hem de dize değişmezine bir önek ekleyen deseni kullanmam gerekir x
? Bu eski zamanların bir kalıntısı mı yoksa bazı durumlarda gerçekten gerekli mi?
Veya başka bir maddeye ihtiyacınız yoksa:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
başarısız olabileceği gibi genellikle kötü bir fikirdir .
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
daha etkilidir ( echo invalid && false )
bunu gereksiz bir alt kabuğa için ödeme önler olarak.
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
Notlar:
if
ve [
ve ]
önemlidir>
ve <
yeniden yönlendirme işleçleri bu nedenle dizelerden \>
ve \<
sırasıyla dizelerden kaçarlar .$a
aslında " "
dize değişmez değerinin bir parçası olarak çevreleyen vardı , bu nedenle $b
değerleri karşılaştırmak için kaçış karakteri kullanmak zorunda kaldı . bash -x ./script.sh
Çalıştırdıktan sonra bunu bulabildim , -x bayrağı her yürütmenin değerini görmenizi sağlar ve hata ayıklamaya yardımcı olur.
Dizeleri joker karakterlerle karşılaştırmak için
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
joker karakterlerin eksikliğini de not edin . (btw: Joker karakterler için +1!)
$stringB
gerekir verilemeyecek (ve bu arada, sol taraftaki teklif edilecek gerekmez): if [[ $stringA = *"$stringB"* ]]; then
.
Yorumlardan birini bir noktada katılmıyorum:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Sadece biri gibi görünmüyor, hmm, deneyimsiz ...
Bir şekilde ortak kalıpları dil olarak kullanır;
Ve dili öğrendikten sonra.
Özel bir kısmı olan basit bir mantıksal ifadedir: mantık operatörlerinin tembel değerlendirmesi.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Her bölüm mantıklı bir ifadedir; birincisi doğru veya yanlış olabilir, diğer ikisi her zaman doğrudur.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Şimdi, değerlendirildiğinde, ilk kontrol edilir. Yanlışsa, mantığın ikinci işlenmesinden ve &&
sonradan ilgili değildir. Birincisi doğru değil, bu yüzden ilk ve ikincisi doğru olamaz.
Şimdi, bu durumda mantığın ilk tarafı ya da ||
yanlış, ama diğer taraf - üçüncü kısım - doğruysa doğru olabilir.
Böylece üçüncü bölüm değerlendirilecektir - esas olarak mesajı bir yan etki olarak yazmak. (Burada kullanmadığımız sonuç 0
doğrudur)
Diğer vakalar benzer, ama daha basit - ve - söz veriyorum! kolay okunabilir!
(Bende yok, ama bence gri sakallı UNIX emektarı olmak çok yardımcı oluyor.)
... && ... || ...
O anlam eşdeğer değil gibi genellikle (Bütün bu zaman boyunca üzgün ihtiyar adam Unix gazisi, sen oldum yanlış) üzerine kaşlarını edilir if ... then ... else ...
. Endişelenme, bu yaygın bir tuzak .
... && ... || ...
son derece geçerli bir model ve ortak bir bash deyimidir. Kullanımı, ön bilgileri (izleyicide yeni başlayanlar varsa akılda tutmak iyi olabilir) reçete eder, ancak OP, açık rögar kapaklarından nasıl kaçınılacağını bildiklerini kanıtlamak için saçlara sahiptir.
ayrıca kullanım senaryosu / esac kullanabilirsiniz
case "$string" in
"$pattern" ) echo "found";;
esac
|
Önce, ile ayrılmış kalıplara sahip olabileceğinizi unutmayın )
. in
İfadesi eşdeğerdir then
içinde if
tablolar. Python'dan geliyorsanız, her listenin ne yapacağına dair kendi beyanına sahip olduğu bir desen listesi üzerinde çalıştığını iddia edebilirsiniz. Gibi değil substring in string
, aksine for item in list
. *
Bir else
koşul istiyorsanız, son ifadeniz olarak a kullanın . İlk karşılaşmada geri döner.
Aşağıdaki komut dosyası "testonthis" adlı dosyayı satır satır okur ve her satırı basit bir dize, özel karakterli bir dize ve normal bir ifade ile karşılaştırır. Eşleşmezse, komut satırı satırı yazdırır, aksi takdirde yazdırmaz.
Bash'teki alan çok önemli. Yani aşağıdakiler işe yarayacak:
[ "$LINE" != "table_name" ]
Ancak aşağıdakiler olmaz:
["$LINE" != "table_name"]
Bu yüzden lütfen şu şekilde kullanın:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
ama [
aslında harici bir ikili (gibi bir which [
şey verir gibi /usr/bin/[
)
Girişin yalnızca birkaç geçerli girdisi varsa regexp eşleşmelerini kullanırım. Örneğin, yalnızca "başlat" ve "durdur" geçerli eylemlerdir.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Ben $ACTION
çift virgül kullanarak değişken küçük harf unutmayın . Ayrıca, bunun çok yaşlı bash sürümlerinde çalışmadığını unutmayın.
Bash 4+ örnekleri. Not: tırnak işareti kullanmamak kelimeler boşluk vb. İçerdiğinde sorunlara neden olur. Her zaman Bash, IMO'da alıntı yapın.
Bash 4+ ile ilgili bazı örnekler:
Örnek 1, dizede 'evet' olup olmadığını kontrol edin (büyük / küçük harf duyarsız):
if [[ "${str,,}" == *"yes"* ]] ;then
Örnek 2, dizede 'evet' olup olmadığını kontrol edin (büyük / küçük harf duyarsız):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Örnek 3, dizede 'evet' olup olmadığını kontrol edin (büyük / küçük harfe duyarlı):
if [[ "${str}" == *"yes"* ]] ;then
Örnek 4, dizede 'evet' olup olmadığını kontrol edin (büyük / küçük harfe duyarlı):
if [[ "${str}" =~ "yes" ]] ;then
Örnek 5, tam eşleme (büyük / küçük harfe duyarlı):
if [[ "${str}" == "yes" ]] ;then
Örnek 6, tam eşleme (büyük / küçük harf duyarlı):
if [[ "${str,,}" == "yes" ]] ;then
Örnek 7, tam eşleme:
if [ "$a" = "$b" ] ;then
Zevk almak.
if [ "$a"="$b" ]
veya çalışmıyor ... eşittir etrafında boşluklar olamaz