Risposte:
Puoi usare il modulo in ${VAR/subs}
cui VAR
contiene la stringa più grande ed
subs
è la sottostringa che stai cercando di trovare:
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
Questo funziona perché ${VAR/subs}
è uguale $VAR
ma con la prima occorrenza della stringa subs
rimossa, in particolare se $VAR
non contiene la parola subs
non verrà modificata.
ab was found in abc
, ma se lo uso substring=z
ottengoz was found in abc
ab is not in abc
. Ma z was found in abc
. Questo è divertente: D
[[ "bcd" =~ "ab" ]]
[[ "abc" =~ "ab" ]]
le parentesi sono per il test, e siccome sono doppie parentesi, possono fare alcuni test extra =~
.
Quindi potresti usare questo modulo in qualche modo
var1="ab"
var2="bcd"
if [[ "$var2" =~ "$var1" ]]; then
echo "pass"
else
echo "fail"
fi
Modifica: corretto "= ~", è stato capovolto.
fail
con questi parametri:var2="abcd"
[[ $string =~ $substring ]]
. Ho aggiornato la risposta.
Uso dei modelli di nome file bash (noti anche come modelli "glob")
substr=ab
[[ abc == *"$substr"* ]] && echo yes || echo no # yes
[[ bcd == *"$substr"* ]] && echo yes || echo no # no
I seguenti due approcci funzioneranno su qualsiasi ambiente compatibile con POSIX, non solo su 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
Entrambi i risultati sopra:
'abc' contains 'ab'
'bcd' does not contain 'ab'
Il primo ha il vantaggio di non generare un grep
processo separato .
Nota che uso printf %s\\n "${foo}"
invece di echo "${foo}"
because echo
potrebbe rovinarsi ${foo}
se contiene barre rovesciate.
xrandr
monitor nell'elenco dei nomi dei monitor memorizzati in una variabile. +1 e benvenuto nel club di ripetizione 1K :)
Questa è la soluzione più portatile, funzionerà anche su vecchie shell Bourne e Korn shell
#!/bin/bash
case "abcd" in
*$1*) echo "It's a substring" ;;
*) echo "Not a substring" ;;
esac
Esecuzione di esempio:
$ ./case_substr.sh "ab"
It's a substring
$ ./case_substr.sh "whatever"
Not a substring
Si noti che non è necessario utilizzare in modo specifico echo
è possibile utilizzare exit 1
e exit 0
per indicare il successo o il fallimento.
Ciò che potremmo anche fare è creare una funzione (che può essere utilizzata in script di grandi dimensioni se necessario) con valori di ritorno specifici (0 in corrispondenza, 1 in nessuna corrispondenza):
$ ./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
Questo particolare approccio è utile con le istruzioni if-else in bash
. Anche per lo più portatile
$ 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
Ricorda il [[
e "
:
[[ $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).
Quindi, come ha detto @glenn_jackman, ma tieni presente che se racchiudi l'intero secondo termine tra virgolette, il test passerà alla corrispondenza letterale .
Simile alla risposta di Edwin, ma con una migliore portabilità per posix & ksh e un tocco meno rumoroso di quello di 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
Produzione:
abc contains ab
bcd does NOT contain ab
echo
affermazioni. Perché ottengoab is not in abc