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().