Eu gostaria de escrever um script bash com uma quantidade desconhecida de argumentos.
Como posso percorrer esses argumentos e fazer algo com eles?
Uma tentativa errada seria assim:
#!/bin/bash
for i in $args; do
echo $i
done
Há uma sintaxe especial para isso:
for i do
printf '%s\n' "$i"
done
De maneira mais geral, a lista de parâmetros do script ou função atual está disponível através da variável especial $@
.
for i in "$@"; do
printf '%s\n' "$i"
done
Observe que você precisa de aspas duplas $@
, caso contrário, os parâmetros passam por expansão de curinga e divisão de campo. "$@"
é mágico: apesar das aspas duplas, ele se expande em tantos campos quanto em parâmetros.
print_arguments () {
for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special !\characters' '-n' # prints 4 lines
print_arguments '' # prints one empty line
print_arguments # prints nothing
#! /usr/bin/env bash
for f in "$@"; do
echo "$f"
done
Você deve citar, $@
porque é possível que os argumentos contenham espaços (ou novas linhas, etc.) se você os citar ou escapar com a \
. Por exemplo:
./myscript one 'two three'
São dois argumentos em vez de três, devido às aspas. Se você não citar $@
, esses argumentos serão divididos no script.
for f; do ...