Bash

在 bash 腳本中使用命令行參數作為 cp 和 mv 的目標

  • November 4, 2020

我正在嘗試通過執行帶有標誌/參數的腳本來複製文件(或重命名文件)以提供源文件名和目標文件名:

#!/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

輸出是一個錯誤:

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.

cp(和)不mv接受參數化的目的地嗎?我究竟做錯了什麼?

如果要接受參數:,則d在您的while getopts行中缺少必填項。-d因此,您copy_dest是空的,因此cp抱怨“缺少操作數”。如果您添加“調試”行,例如

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

在你的循環之後,你會看到問題。要解決,只需添加:

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

另外,請注意,特別是在處理文件名時,您應該始終引用 shell 變數,如

cp "$copy_source" "$copy_dest"

此外,請注意將腳本作為

sh test_cp.sh

將覆蓋 shebang-line #!/bin/bash並且您無法確定它是否在bash! 如果您想確保使用正確的外殼,您可以明確聲明

bash test_cp.sh*參數*

或使腳本文件可執行並將其執行為

./test_cp.sh*參數*

引用自:https://unix.stackexchange.com/questions/617178