A primeira coisa óbvia é que você deve fornecer espaços entre os argumentos de [
, test
ou [[
:
if [ "$1" = 1 ];
Quando no Bash, o uso de [[ ]]
é recomendado, pois não faz coisas desnecessárias para expressões condicionais como a divisão de palavras e a expansão do nome do caminho. Citar entre aspas duplas também não é necessário. Um operador mais legível ==
também pode ser usado.
if [[ $1 == 1 ]];
Nota adicionada: Se o segundo operando também contiver variáveis, é necessário cotar, pois ele pode estar sujeito à correspondência de padrões se contiver caracteres reconhecíveis como *
, ?
, []
, etc. A correspondência está ativada com shopt -s extglob
, outras formas como @()
, !()
, etc. também serão reconhecidas como padrões. Veja Correspondência de padrões .
Com operadores como <
e >
, talvez ainda seja necessário, pois uma vez eu encontrei um erro em que não citar o segundo argumento causou resultados diferentes.
Quanto ao primeiro operando, nada se aplica.
Considere também esta variação mais simples:
case "$1" in
1)
mv -- "${@:2}" ~/lab/Sun
;;
2)
mv -- "${@:2}" ~/lab/Moon
;;
3)
mv -- "${@:2}" ~/lab/Earth
;;
esac
Ou condensado:
case "$1" in
1) mv -- "${@:2}" ~/lab/Sun ;;
2) mv -- "${@:2}" ~/lab/Moon ;;
3) mv -- "${@:2}" ~/lab/Earth ;;
esac
"${@:2}"
é uma forma de expansão de substring ou expansão de membro de matriz em que 2
é o deslocamento. Isso faz com que a expansão comece no segundo valor. Com isso, talvez não seja necessário usar shift
.
O --
adicionado impede que mv
reconheça nomes de arquivos começando com traço ( -
) como opções inválidas.