Usando parâmetros de linha de comando como destino para cp e mv no script bash

Oct 30 2020

Estou tentando copiar um arquivo (ou renomear um arquivo) executando o script com sinalizadores / parâmetros para fornecer o nome do arquivo de origem e de destino:

#!/bin/bash/

while getopts s:d flag
do
        case "${flag}" in s) copy_source=${OPTARG};;
                d) copy_dest=${OPTARG};; esac done echo "Copy a file input with argument to another file input with argument" cp $copy_source $copy_dest

A saída é um erro:

sh test_cp.sh -s  file1.txt -d file2.txt
Copy a file input with argument to another file input with argument
cp: missing destination file operand after ‘file1.txt’
Try 'cp --help' for more information.

Será que cp(e mv) não aceita destino parametrizada? O que estou fazendo de errado?

Respostas

5 AdminBee Oct 30 2020 at 18:03

Você está faltando o obrigatório :após o dem sua while getoptslinha se quiser -daceitar um parâmetro. Portanto, seu copy_destestá vazio e, portanto, cpreclama sobre o "operando ausente". Se você adicionar linhas de "depuração", como

echo "Source parameter: $copy_source" echo "Destination parameter: $copy_dest"

após o seu loop, você verá o problema. Para resolver, basta adicionar ::

while getopts s:d: flag
do
   ...
done

Além disso , observe que, em particular ao lidar com nomes de arquivos, você deve sempre citar variáveis ​​shell, como em

cp "$copy_source" "$copy_dest"

Além disso , esteja ciente de que executar um script como

sh test_cp.sh

irá substituir o shebang-line #!/bin/bash e você não pode ter certeza de que ele é executado sob bash! Se você quiser garantir que o shell correto está sendo usado, você pode indicar explicitamente

argumentos bash test_cp.sh

ou tornar o arquivo de script executável e executá-lo como

./test_cp.sh argumentos