stringContain
varian (kompatibel atau case-independent)
Karena sebagian besar jawaban Stack Overflow ini memberi tahu tentang Bash , saya telah memposting fungsi Bash independen kasus di bagian paling bawah posting ini ...
Lagi pula, ini milik saya
Jawaban yang kompatibel
Karena sudah ada banyak jawaban menggunakan fitur spesifik Bash, ada cara untuk bekerja di bawah cangkang fitur yang lebih buruk, seperti BusyBox :
[ -z "${string##*$reqsubstr*}" ]
Dalam praktiknya, ini bisa memberi:
string='echo "My string"'
for reqsubstr in 'o "M' 'alt' 'str';do
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'."
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
done
Ini diuji di bawah Bash, Dash , KornShell ( ksh
) dan ash (BusyBox), dan hasilnya selalu:
String 'echo "My string"' contain substring: 'o "M'.
String 'echo "My string"' don't contain substring: 'alt'.
String 'echo "My string"' contain substring: 'str'.
Menjadi satu fungsi
Seperti yang ditanyakan oleh @EeroAaltonen di sini adalah versi demo yang sama, diuji di bawah cangkang yang sama:
myfunc() {
reqsubstr="$1"
shift
string="$@"
if [ -z "${string##*$reqsubstr*}" ] ;then
echo "String '$string' contain substring: '$reqsubstr'.";
else
echo "String '$string' don't contain substring: '$reqsubstr'."
fi
}
Kemudian:
$ myfunc 'o "M' 'echo "My String"'
String 'echo "My String"' contain substring 'o "M'.
$ myfunc 'alt' 'echo "My String"'
String 'echo "My String"' don't contain substring 'alt'.
Perhatikan: Anda harus melarikan diri atau melampirkan dua tanda kutip dan / atau tanda kutip ganda:
$ myfunc 'o "M' echo "My String"
String 'echo My String' don't contain substring: 'o "M'.
$ myfunc 'o "M' echo \"My String\"
String 'echo "My String"' contain substring: 'o "M'.
Fungsi sederhana
Ini diuji di bawah BusyBox, Dash, dan, tentu saja Bash:
stringContain() { [ -z "${2##*$1*}" ]; }
Kemudian sekarang:
$ if stringContain 'o "M3' 'echo "My String"';then echo yes;else echo no;fi
no
$ if stringContain 'o "M' 'echo "My String"';then echo yes;else echo no;fi
yes
... Atau jika string yang dikirimkan dapat kosong, seperti yang ditunjukkan oleh @Sjlver, fungsi tersebut akan menjadi:
stringContain() { [ -z "${2##*$1*}" ] && [ -z "$1" -o -n "$2" ]; }
atau seperti yang disarankan oleh komentar Adrian Günter , menghindari -o
sakelar:
stringContain() { [ -z "${2##*$1*}" ] && { [ -z "$1" ] || [ -n "$2" ];};}
Fungsi final (sederhana):
Dan membalikkan tes untuk membuatnya berpotensi lebih cepat:
stringContain() { [ -z "$1" ] || { [ -z "${2##*$1*}" ] && [ -n "$2" ];};}
Dengan string kosong:
$ if stringContain '' ''; then echo yes; else echo no; fi
yes
$ if stringContain 'o "M' ''; then echo yes; else echo no; fi
no
Tidak tergantung huruf besar (Hanya Bash!)
Untuk menguji string tanpa peduli case, cukup konversi setiap string ke huruf kecil:
stringContain() {
local _lc=${2,,}
[ -z "$1" ] || { [ -z "${_lc##*${1,,}*}" ] && [ -n "$2" ] ;} ;}
Memeriksa:
stringContain 'o "M3' 'echo "my string"' && echo yes || echo no
no
stringContain 'o "My' 'echo "my string"' && echo yes || echo no
yes
if stringContain '' ''; then echo yes; else echo no; fi
yes
if stringContain 'o "M' ''; then echo yes; else echo no; fi
no