test=$line i=0
while case "$test" in (*select*)
test=${test#*select};;(*) ! :;;
esac; do i=$(($i+1)); done
Vous n'avez pas besoin d'appeler greppour une chose aussi simple.
Ou en fonction:
occur() while case "$1" in (*"$2"*) set -- \
"${1#*"$2"}" "$2" "${3:-0}" "$((${4:-0}+1))";;
(*) return "$((${4:-0}<${3:-1}))";;esac
do : "${_occur:+$((_occur=$4))}";done
Il faut 2 ou 3 arguments. Fournir plus que cela faussera ses résultats. Vous pouvez l'utiliser comme:
_occur=0; occur ... . 2 && echo "count: $_occur"
... qui affiche le nombre d'occurrences .dans ...s'il se produit au moins 2 fois. Comme ça:
count: 3
Si $_occurest vide ou unsetlorsqu'il est appelé, cela n'affectera aucune variable shell et return1 si "$2"survient "$1"moins de "$3"fois. Ou, si elle est appelée avec seulement deux arguments, elle ne sera return1 que si elle "$2"n’est pas insérée "$1". Sinon, il retourne 0.
Et ainsi, dans sa forme la plus simple, vous pouvez faire:
occur '' . && echo yay || echo shite
... qui imprime ...
shite
...mais...
occur . . && echo yay || echo shite
... imprimera ...
yay
Vous pouvez également l'écrire un peu différemment et omettre les guillemets $2dans l' instruction (*"$2"*)and "${1#*"$2"}". Si vous faites cela, vous pouvez utiliser des globes de shell pour les correspondances comme sh[io]tepour le test de correspondance.
...<<<"$line". La commandegrepattend un fichier à la place