Se você me perdoar um pouco de reciclagem de respostas, eu acho que você pode achar isso útil.
_fn() { set -- "$@" $(cat)
while ${1+:} false ; do
echo "$1" && [ "$1" = "arg2" ] && echo "$1"
$YOUR_CHK
shift
done
}
echo "arg2" | _fn "arg1"
OUTPUT
arg1
arg2
arg2
Que lida com os argumentos de linha de cmd e stdin
. Ele só executa o loop while
para verificá-los enquanto você ainda tem pelo menos um argumento salvo em sua matriz de parâmetros. Ele descarta todos os argumentos verificados, portanto, parte do $YOUR_CHK
deve estar salvando as informações que você considera valiosas de uma forma ou de outra.
_fn
se comportaria da mesma forma se seu conteúdo fosse o corpo de um script ou se estivesse na forma de uma função de shell.
_fn
processa stdin
- nesse caso "arg2" echo
ed sobre o |pipe
- na primeira linha por set
seu array de parâmetro posicional $@
array para tudo que é passado na linha de comando - ou "$@"
- E tudo cat
é enviado via $(comand substitution)
.
O
while _fn's $1
primeiro parâmetro é ${set+}
, substituímos o :true
do shell para satisfazer o condicional while
do loop. Assim que $1
não estiver certo de que a substituição não ocorre, a condicional será avaliada como false
e o while
será interrompido.
Para cada iteração do loop while
, o _fn() echo
es seu $1
primeiro parâmetro &&
se for bem-sucedido ( echo
é sempre com êxito) [ tests ]
para ver se $1
é igual à string "arg2"
&&
se o [ test ]
for bem-sucedido _fn() echo
es $1
novamente.
$YOUR_CHK
é um null-op - é uma variável indefinida que nada avalia antes mesmo de o shell executar qualquer código.
Para cada iteração do loop while
, nós shift
descartamos o primeiro parâmetro $1
. Então, na iteração, 1 "$@"
se parece com:
arg1 arg2
Mas depois de shift
, a primeira vez parece:
arg2
E depois nós shift
da última vez que parece:
Então, isso nos traz de volta novamente para ${1+:} false
- porque $1
agora está desanexado, o shell não substituirá :true
e, em vez disso, apenas false
é avaliado, que quebra o loop while
e termina o _fn().