A primeira coisa óbvia é que você deve fornecer espaços entre os argumentos de [, testou [[:
if [ "$1" = 1 ];
No Bash, o uso [[ ]]é recomendado, pois não faz coisas desnecessárias para a expressão condicional, como divisão de palavras e expansão do nome do caminho. Também não é necessário citar aspas duplas. Um operador mais legível ==também pode ser usado.
if [[ $1 == 1 ]];
Nota acrescentou: Se segundo operando também contém variáveis, citando é necessária, pois podem estar sujeitos a correspondência de padrão se ele contém personagens reconhecíveis como *, ?, [], etc .. Se estendida englobamento ou correspondência padrão é ativado com shopt -s extglob, outras formas como @(), !(), etc. também será reconhecido como padrões. Consulte Correspondência de padrões .
Com operadores como <e >ainda pode ser necessário, pois uma vez encontrei um bug em que não citar o segundo argumento causou resultados diferentes.
Quanto ao primeiro operando, nada se aplica.
Considere também essa 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 da matriz onde 2está o deslocamento. Isso faz com que a expansão comece com o segundo valor. Com isso, talvez não precisemos usar shift.
O --item adicionado impede o mvreconhecimento de nomes de arquivos iniciados por dash ( -) como opções inválidas.
$var,$(cmd)e até mesmo`cmd`[para o qual$(cmd)deve ser preferido]). Existem alguns casos extremos em que você não precisa citar, mas sempre isso não fará mal.