bashスクリプトでcpとmvのターゲットとしてコマンドライン引数を使用する

bashスクリプトでcpとmvのターゲットとしてコマンドライン引数を使用する

ソースとターゲットのファイル名を指定するには、フラグ/パラメータを含むスクリプトを実行してファイルをコピーするか、ファイル名を変更しようとします。

#!/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)はパラメータ化されたターゲットを受け入れませんか?私は何が間違っていましたか?

ベストアンサー1

パラメータを許可したい場合は、後でその行に:必要な項目がありません。したがって、あなたのアイテムは空であるため、「オペランドが見つかりません」という苦情が表示されます。次のような「デバッグ」行を追加すると、dwhile getopts-dcopy_destcp

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

ループ後に問題が表示されます。この問題を解決するには、以下を追加してください:

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

返品特にファイル名を扱うときは、次のシェル変数を常に引用する必要があることに注意してください。

cp "$copy_source" "$copy_dest"

また、スクリプトの実行に注意してください。

sh test_cp.sh

shebang-lineを無視します #!/bin/bashそして、あなたはそれが実行されているかどうかはわかりませんbash!正しいシェルを使用していることを確認するには、明示的に次のように指定できます。

バッシュ test_cp.sh議論

または、スクリプトファイルを実行可能にして実行します。

./test_cp.sh議論

おすすめ記事