Bagaimana cara membandingkan variabel dengan string (dan melakukan sesuatu jika cocok)?
Bagaimana cara membandingkan variabel dengan string (dan melakukan sesuatu jika cocok)?
Jawaban:
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Jika Anda ingin melakukan sesuatu ketika mereka tidak cocok, ganti =
dengan !=
. Anda dapat membaca lebih lanjut tentang operasi string dan operasi aritmatika dalam dokumentasi masing-masing.
$x
?Anda ingin mengutipnya $x
, karena jika kosong, skrip Bash Anda menemui kesalahan sintaksis seperti terlihat di bawah:
if [ = "valid" ]; then
==
operator yang tidak standarPerhatikan bahwa Bash memungkinkan ==
untuk digunakan untuk kesetaraan dengan [
, tetapi ini bukan standar .
Gunakan kasus pertama dimana kutipan di sekitar $x
adalah opsional:
if [[ "$x" == "valid" ]]; then
atau gunakan kasus kedua:
if [ "$x" = "valid" ]; then
[ "$1" == "on" ]
. Mengubah ini ke ["$ 1" = "on"] menyelesaikan masalah.
=
dan bukan dua.
[ $x -eq "valid" ]
. -eq
adalah operator pembanding untuk bilangan bulat, bukan string.
["x$yes" == "xyes"]
, yaitu awalan variabel dan string literal dengan x
? Apakah itu peninggalan zaman dulu atau apakah itu benar-benar diperlukan dalam beberapa situasi?
Atau, jika Anda tidak perlu klausa lain:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
bisa gagal.
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
lebih efisien daripada ( echo invalid && false )
, karena menghindari membayar untuk subkulit yang tidak perlu.
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
Catatan:
if
dan [
dan ]
itu penting>
dan <
merupakan operator pengalihan jadi lepas dengan \>
dan \<
masing-masing untuk string.$a
sebenarnya telah " "
mengelilinginya sebagai bagian dari nilai literal string, oleh karena itu saya harus menggunakan karakter pelarian $b
untuk membandingkan nilai. Saya dapat menemukan ini setelah berjalan bash -x ./script.sh
, flag -x memungkinkan Anda untuk melihat nilai dari setiap eksekusi dan membantu dalam debug.
Untuk membandingkan string dengan penggunaan wildcard
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
sekitar wildcard. (btw: +1 untuk wildcard!)
$stringB
harus dikutip (dan, kebetulan, sisi kiri tidak perlu dikutip): if [[ $stringA = *"$stringB"* ]]; then
.
Saya harus tidak setuju salah satu komentar di satu titik:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Itu hanya terlihat seperti satu untuk, hmm, yang belum tahu ...
Ini menggunakan pola umum sebagai bahasa, dengan cara;
Dan setelah Anda mempelajari bahasa itu.
Ini adalah ekspresi logis sederhana, dengan satu bagian khusus: evaluasi malas dari operator logika.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Setiap bagian adalah ekspresi logis; yang pertama mungkin benar atau salah, dua lainnya selalu benar.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Sekarang, ketika dievaluasi, yang pertama diperiksa. Jika salah, maka operan kedua dari logika dan &&
setelah itu tidak relevan. Yang pertama tidak benar, jadi tidak mungkin yang pertama dan yang kedua benar.
Sekarang, dalam hal ini adalah sisi pertama dari logika atau ||
salah, tetapi bisa jadi benar jika pihak lain - bagian ketiga - benar.
Jadi bagian ketiga akan dievaluasi - terutama menulis pesan sebagai efek samping. (Ini memiliki hasil yang 0
benar, yang tidak kita gunakan di sini)
Kasus-kasus lain serupa, tetapi lebih sederhana - dan - saya berjanji! adalah - bisa - mudah dibaca!
(Saya tidak punya, tapi saya pikir menjadi veteran UNIX dengan janggut abu-abu sangat membantu dalam hal ini.)
... && ... || ...
biasanya disukai (maaf veteran Unix greybeard, Anda telah salah selama ini), karena itu tidak setara secara semantik if ... then ... else ...
. Jangan khawatir, ini adalah perangkap umum .
... && ... || ...
adalah pola yang benar-benar valid dan idiom bash yang umum. Penggunaannya memang menentukan pengetahuan sebelumnya (yang mungkin baik untuk diingat jika ada pemula di antara hadirin), tetapi OP memiliki rambut untuk membuktikan bahwa mereka tahu bagaimana menghindari penutup lubang got terbuka.
Anda juga dapat menggunakan use case / esac
case "$string" in
"$pattern" ) echo "found";;
esac
|
, sebelum )
. The in
pernyataan setara dengan then
di if
pernyataan. Anda bisa berargumen ini bekerja di atas daftar pola, di mana setiap daftar memiliki pernyataan sendiri tentang apa yang harus dilakukan, jika Anda berasal dari Python. Bukan suka substring in string
, tapi lebih tepatnya for item in list
. Gunakan *
sebagai pernyataan terakhir Anda jika Anda menginginkan suatu else
kondisi. Ia kembali pada pertemuan pertama.
Script berikut membaca dari file bernama "testonthis" baris demi baris dan kemudian membandingkan setiap baris dengan string sederhana, string dengan karakter khusus dan ekspresi reguler. Jika tidak cocok, maka skrip akan mencetak garis, jika tidak tidak.
Ruang di Bash sangat penting. Jadi yang berikut ini akan berhasil:
[ "$LINE" != "table_name" ]
Tetapi yang berikut tidak akan:
["$LINE" != "table_name"]
Jadi silakan gunakan apa adanya:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
bash
tetapi karena [
sebenarnya biner eksternal (seperti dalam which [
menghasilkan sesuatu seperti /usr/bin/[
)
Saya mungkin akan menggunakan pencocokan regexp jika input hanya memiliki beberapa entri yang valid. Misalnya hanya "mulai" dan "berhenti" adalah tindakan yang valid.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Perhatikan bahwa saya mengurangi variabel $ACTION
dengan menggunakan koma ganda. Perhatikan juga bahwa ini tidak akan berfungsi pada versi bash yang terlalu tua di luar sana.
Bash 4+ contoh. Catatan: tidak menggunakan tanda kutip akan menyebabkan masalah ketika kata-kata mengandung spasi, dll. Selalu kutip di Bash, IMO.
Berikut beberapa contoh di Bash 4+:
Contoh 1, periksa 'ya' dalam string (case-sensitive):
if [[ "${str,,}" == *"yes"* ]] ;then
Contoh 2, periksa 'ya' dalam string (case-sensitive):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Contoh 3, periksa 'ya' dalam string (peka huruf besar kecil):
if [[ "${str}" == *"yes"* ]] ;then
Contoh 4, periksa 'ya' dalam string (peka huruf besar kecil):
if [[ "${str}" =~ "yes" ]] ;then
Contoh 5, pencocokan tepat (peka huruf besar-kecil):
if [[ "${str}" == "yes" ]] ;then
Contoh 6, kecocokan persis (tidak sensitif huruf besar):
if [[ "${str,,}" == "yes" ]] ;then
Contoh 7, kecocokan persis:
if [ "$a" = "$b" ] ;then
Nikmati.
if [ "$a"="$b" ]
atau tidak bekerja ... tidak dapat memiliki ruang di sekitar yang sama
Saya melakukannya dengan cara ini yang kompatibel dengan Bash dan Dash (sh):
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac
(
vs sebelumnya tidak menggunakannya?