A primeira coisa óbvia é que você deve fornecer espaços entre os argumentos de [
, test
ou [[
:
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 2
está 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 mv
reconhecimento 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.