Bir değişkeni, if / else deyiminde tamsayı yerine metin dizesiyle nasıl karşılaştırabilirim?


24

Bir kabuk komut dosyası yazma sürecinde, komut dosyasının ortasında bir yere düşen aşağıdaki if / else deyimiyle ilgili bir sorunla karşılaştım:

if [ $act -eq "add" ]
then
    read - "add or update: " $comm
    git commit -m "$comm $file"
else
    git commit -m "$act $file"
fi

Geri dönen hata:

./gitup: line 13: [: add: integer expression expected

ve daha sonra komut dosyasının geri kalanıyla devam eder. Nasıl if segmenti değerlendirmek / değişkeni bir tamsayı yerine bir dize girişi ile karşılaştırabilirsiniz; denediğim birkaç şey arasında "! =" kullanılırken farklı bir hata gerekiyordu.

Yanıtlar:


38

Bunun gibi bir şey:

act="add"
if [[ $act = "add" ]]
then
    echo good
else
    echo not good
fi

-eqsayı karşılaştırması içindir, =dize karşılaştırması için kullanın


Teşekkürler. Bunu denedim ve komut dosyası bir tuş vuruşu gerektiren ücretsiz olurdu, ancak sadece bununla ilgili olmayan bir sözdizimi hatasından kaynaklandığını gördü, bu yüzden bu mükemmel çalıştı. Yardım için teşekkürler.
tony_perkis666

3
@josephmarhee: Testin Bash'a [[]]özgü bir yapı olduğunu ve bu örneğin []soruda kullanılan POSIX ile birlikte çalıştığını unutmayın . Tercüman açıkça #!/bin/bashveya benzeri olarak verilirse , [[]]sorunsuz bir şekilde kullanılabilir (ve Bash'deki alternatiften biraz daha hızlıdır , inanıyorum - yine de bir şişe boynu olmamalı), aksi takdirde biriyle yapışmalıdır []. Birinin Bash özelliklerine hiç ihtiyacı yoksa, komut dosyası örneğin Dash'de biraz daha hızlı çalışacaktır. POSIX, doğal taşınabilirlik sağlar.
Daniel Andersson

4

Bu yöntem de işe yarar. @ Guru'nun cevabına çok benzer, ancak çift köşeli parantez ihtiyacını ortadan kaldırır.

if [ "$act" == "add" ]
then
echo "Good!"
      else
      echo "Not good!"
fi
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.