Eu tenho este código:
for file in "$@"*png; do
echo "$file"
done
Funciona apenas se você fornecer um caminho que termine com /like /root/
.
Qual seria a forma correta de adicionar/ao input do caminho, em situações como essa, sem quebrar meu script?
Se você der uma entrada de caminho sem / no final, ele fará isso:
File: /root*png
Se eu modificá-lo para ser for file in "$@"/*png; do
e inserir /root/test/
, funcionará, mas o resultado parecerá feio:
File: /root/test//sample2.png
ilkkachu apontou uma grande falha na minha resposta e a corrigiu na dele, então, por favor, dê a ele o crédito que ele merece. Eu vim com outra solução embora:
Exemplo :
Solução Original :
O ${@%/} cortará qualquer / fora do final do seu parâmetro e, em seguida, o / fora o adicionará de volta - ou o adicionará a qualquer parâmetro que não tenha um.
Usar
$@
com o globo assim parece um tanto estranho. Se você espera que seja capaz de processar vários argumentos, bem, não funcionará. As strings ao redor$@
são anexadas apenas ao primeiro e ao item da lista.Portanto, para lidar com vários argumentos, você precisará fazer um loop
"$@"
separadamente:Em outro caso, você poderia usar a expansão de substituição de string
${//}
(em Bash ou zsh) para adicionar um sufixo a cada parâmetro posicional, mas é bastante difícil fazer isso funcionar com um glob.Você pode usar tr também.
Sempre adicione / no final e...