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.