Na verdade, você pode usar as expansões de parâmetros padrão aqui (estava faltando o caractere curinga):
$ args=a:b:c:
$ x=b
$ echo "${args%$x:*}"
a:
$ if [ "$args" != "${args#*$x:}" ]; then echo 'b: is present'; fi
b: is present
(ou igualmente "${args%$x:*}"
)
A desvantagem é que você precisa ter os dois-pontos depois de b
, então a:b
ou um b
comum não corresponderia e também corresponderia a a:bb:c
. ( [[ $var = *$x:* ]]
, assim como a correspondência óbvia de padrões com case
, têm a mesma desvantagem).
A correspondência de todos os b
, b:c
, a:b
, a:b:c
, embora não corresponda a a:bb:c
, seria um pouco mais complicada. Tudo o que posso pensar é algo assim:
args=a:b:c
x=b
IFS=: # affects globally
set -f # affects globally...
for x in $args; do
if [ "$x" = "b" ]; then
echo "b is present"
fi
done
A menos que você queira escrever todos os casos:
args=a:b:c
x=b
found=0
case "$args" in
$x) found=1;;
$x:*) found=1;;
*:$x) found=1;;
*:$x:*) found=1;;
esac
if [ "$found" = 1 ]; then ...; fi
Muito mais fácil com os regexes (no Bash):
args=b:c
x=b
if [[ $args =~ (^|:)$x(:|$) ]]; then
echo "b found"
fi