Saya ingin menulis skrip shell Unix yang akan melakukan berbagai logika jika ada string di dalam string lain. Misalnya, jika saya berada di folder tertentu, cabut cabang. Bisakah seseorang tolong beri tahu saya cara melakukannya? Jika memungkinkan saya ingin membuat shell ini tidak spesifik (yaitu bukan bash saja) tetapi jika tidak ada cara lain saya dapat melakukannya dengan itu.
#!/usr/bin/env sh
if [ "$PWD" contains "String1" ]
then
echo "String1 present"
elif [ "$PWD" contains "String2" ]
then
echo "String2 present"
else
echo "Else"
fi
CURRENT_DIR
redundan; Anda bisa menggunakannya$PWD
.Jawaban:
Inilah solusi lain. Ini menggunakan ekspansi parameter substring POSIX , sehingga berfungsi di Bash, Dash, KornShell (ksh), Z shell (zsh), dll.
Versi yang difungsikan dengan beberapa contoh:
sumber
substring="$( printf '%q' "$2" )"
menghemat hari.[[ $haystack == *"My needle"* ]]
[]
. Lihat jawaban saya stackoverflow.com/a/54490453/712666 .Shell POSIX murni:
Kerang diperpanjang seperti ksh atau bash memiliki mekanisme pencocokan mewah, tetapi gaya lama
case
sangat kuat.sumber
Sayangnya, saya tidak mengetahui cara untuk melakukan ini di sh. Namun, menggunakan bash (mulai versi 3.0.0, yang mungkin milik Anda), Anda dapat menggunakan operator = ~ seperti ini:
Sebagai bonus tambahan (dan / atau peringatan, jika string Anda memiliki karakter lucu di dalamnya), = ~ menerima regex sebagai operan yang tepat jika Anda meninggalkan tanda kutip.
sumber
[[ test =~ "test.*" ]]
vs[[ test =~ test.* ]]
.sumber
grep -q "$2"
kegrep -q "$2" > /dev/null
untuk menghindari hasil yang tidak diinginkan.Berikut ini tautan ke berbagai solusi masalah Anda.
Ini adalah favorit saya karena masuk akal terbaca oleh manusia:
Metode Bintang Wildcard
sumber
sh
saya menerima "operan tidak dikenal" dengan ini. Bekerja dengan Bash.[[
bukan POSIXsumber
Ada ekspresi reguler Bash . Atau ada 'expr':
sumber
-> output: String 1 berisi string 2
sumber
Lihat halaman manual untuk program 'test'. Jika Anda hanya menguji keberadaan direktori, Anda biasanya akan melakukan hal seperti ini:
Jika Anda benar-benar mencoba mencocokkan string, Anda juga dapat menggunakan aturan ekspansi bash & wildcard:
Jika Anda perlu melakukan sesuatu yang lebih kompleks, Anda harus menggunakan program lain seperti expr.
sumber
Dalam kasus khusus di mana Anda ingin menemukan apakah suatu kata terkandung dalam teks yang panjang, Anda dapat mengulangi teks yang panjang dengan sebuah loop.
Ini shell Bourne murni.
sumber
Jika Anda menginginkan metode hanya ksh yang secepat "tes", Anda dapat melakukan sesuatu seperti:
Ini bekerja dengan menghapus jarum di tumpukan jerami dan kemudian membandingkan panjang tali tumpukan jerami lama dan baru.
sumber
test
? Seperti di dalamreturn [ ${#haystack} -eq ${#1} ]
?