Usando parâmetros de linha de comando como destino para cp e mv no script bash
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
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