Jawaban:
Anda dapat menggunakan formulir di ${VAR/subs}
mana VAR
berisi string yang lebih besar dan
subs
merupakan substring yang Anda coba temukan:
my_string=abc
substring=ab
if [ "${my_string/$substring}" = "$my_string" ] ; then
echo "${substring} is not in ${my_string}"
else
echo "${substring} was found in ${my_string}"
fi
Ini berfungsi karena ${VAR/subs}
sama dengan $VAR
tetapi dengan kemunculan pertama dari string yang subs
dihapus, khususnya jika $VAR
tidak mengandung kata subs
itu tidak akan dimodifikasi.
ab was found in abc
, tetapi jika saya menggunakan substring=z
saya dapatkanz was found in abc
ab is not in abc
. Tapi z was found in abc
. Ini lucu: D
[[ "bcd" =~ "ab" ]]
[[ "abc" =~ "ab" ]]
kurung untuk tes, dan karena kurung ganda, bisa jadi beberapa tes tambahan suka =~
.
Jadi Anda bisa menggunakan formulir ini seperti
var1="ab"
var2="bcd"
if [[ "$var2" =~ "$var1" ]]; then
echo "pass"
else
echo "fail"
fi
Edit: dikoreksi "= ~", telah terbalik.
fail
dengan parameter ini:var2="abcd"
[[ $string =~ $substring ]]
. Saya memperbarui jawabannya.
Menggunakan pola nama file bash ( pola alias "glob")
substr=ab
[[ abc == *"$substr"* ]] && echo yes || echo no # yes
[[ bcd == *"$substr"* ]] && echo yes || echo no # no
Dua pendekatan berikut ini akan bekerja pada lingkungan yang kompatibel dengan POSIX, tidak hanya di bash:
substr=ab
for s in abc bcd; do
if case ${s} in *"${substr}"*) true;; *) false;; esac; then
printf %s\\n "'${s}' contains '${substr}'"
else
printf %s\\n "'${s}' does not contain '${substr}'"
fi
done
substr=ab
for s in abc bcd; do
if printf %s\\n "${s}" | grep -qF "${substr}"; then
printf %s\\n "'${s}' contains '${substr}'"
else
printf %s\\n "'${s}' does not contain '${substr}'"
fi
done
Kedua output di atas:
'abc' contains 'ab'
'bcd' does not contain 'ab'
Yang pertama memiliki keuntungan tidak menelurkan grep
proses yang terpisah .
Perhatikan bahwa saya menggunakan printf %s\\n "${foo}"
bukan echo "${foo}"
karena echo
mungkin memotong ${foo}
jika berisi garis miring terbalik.
xrandr
nama monitor yang disimpan dalam variabel. +1 dan selamat datang di klub rep 1K :)
Ini adalah solusi paling portabel, akan bekerja bahkan pada cangkang Bourne lama dan cangkang Korn
#!/bin/bash
case "abcd" in
*$1*) echo "It's a substring" ;;
*) echo "Not a substring" ;;
esac
Contoh dijalankan:
$ ./case_substr.sh "ab"
It's a substring
$ ./case_substr.sh "whatever"
Not a substring
Perhatikan bahwa Anda tidak harus secara khusus menggunakan echo
Anda dapat menggunakan exit 1
dan exit 0
untuk menandakan keberhasilan atau kegagalan.
Apa yang bisa kita lakukan juga, adalah membuat fungsi (yang dapat digunakan dalam skrip besar jika perlu) dengan nilai pengembalian spesifik (0 pada pertandingan, 1 pada tidak cocok):
$ ./substring_function.sh
ab is substring
$ cat substring_function.sh
#!/bin/sh
is_substring(){
case "$2" in
*$1*) return 0;;
*) return 1;;
esac
}
main(){
if is_substring "ab" "abcdefg"
then
echo "ab is substring"
fi
}
main $@
$ grep -q 'ab' <<< "abcd" && echo "it's a substring" || echo "not a substring"
it's a substring
Pendekatan khusus ini berguna dengan pernyataan if-else di bash
. Sebagian besar juga portabel
$ awk '$0~/ab/{print "it is a substring"}' <<< "abcd"
it is a substring
$ python -c 'import sys;sys.stdout.write("it is a substring") if "ab" in sys.stdin.read() else exit(1)' <<< "abcd"
it is a substring
$ ruby -e ' puts "is substring" if ARGV[1].include? ARGV[0]' "ab" "abcdef"
is substring
Pikirkan [[
dan "
:
[[ $a == z* ]] # True if $a starts with an "z" (pattern matching).
[[ $a == "z*" ]] # True if $a is equal to z* (literal matching).
[ $a == z* ] # File globbing and word splitting take place.
[ "$a" == "z*" ] # True if $a is equal to z* (literal matching).
Jadi seperti yang dikatakan @glenn_jackman, tetapi ingatlah bahwa jika Anda membungkus seluruh istilah kedua dalam tanda kutip ganda, itu akan mengalihkan tes ke pencocokan literal .
Mirip dengan jawaban edwin, tetapi dengan peningkatan portabilitas untuk posix & ksh, dan sentuhan yang tidak terlalu berisik daripada jawaban Richard:
substring=ab
string=abc
if [ "$string" != "${string%$substring*}" ]; then
echo "$substring IS in $string"
else
echo "$substring is NOT in $string"
fi
string=bcd
if [ "$string" != "${string%$substring*}" ]; then
echo "$string contains $substring"
else
echo "$string does NOT contain $substring"
fi
Keluaran:
abc contains ab
bcd does NOT contain ab
echo
pernyataan. Karena saya mendapatkanab is not in abc