mv:在 shell 脚本中使用 mv 但不在终端中使用时缺少文件操作数

问题描述 投票:0回答:3

我正在尝试编写一个 shell 脚本,用户输入他们想要重命名为第一个变量的文件,然后输入他们想要的第二个变量的新名称。程序给出的唯一输出是 mv 缺少文件操作数。我已经碰壁了,目前没有什么可以尝试的。我尝试过使用文件的绝对路径,但这没有帮助。谷歌没有为我找到任何结果。

mv 在命令行中按预期工作,但一旦引入变量,程序就会崩溃。我已经尝试了所有可能的格式化输入的方法。

#!/bin/bash
echo -n "Original filename: "
read $input_filename
echo ""
echo -n "New filename: "
read $output_filename
echo ""
mv -v $input_filename  $output_filename
if [ $? == 0 ]
then
echo "Task completed successfully"
else
    echo "ERROR: File failed to be renamed. Exiting."
fi

输出及相关文件内容。

davevm@davevm-VirtualBox:~/lab10$ ls
helloworld  lab10.sh
davevm@davevm-VirtualBox:~/lab10$ ./lab10.sh 
Original filename: helloworld

New filename: copy1

mv: missing file operand
Try 'mv --help' for more information.
ERROR: File failed to be renamed. Exiting.
linux bash ubuntu scripting
3个回答
2
投票

read
内置命令采用变量名称作为其参数。

使用

read filename
,而不是
read $filename

您还应该引用

mv
命令的参数:

mv -v "$input_filename" "$output_filename"

0
投票

调试 shell 脚本时,将行

set -x
添加到文件顶部通常很有用,该行将在执行时输出所有命令,以准确显示正在发生的情况。使用您的脚本,这样做会显示以下输出:

+ mv -v
mv: missing file operand

嗯,看来您的

$input_filename
$output_filename
变量尚未设置。查找
read
的文档,错误变得明显。设置变量名时不应使用
$
作为前缀,因此
read $input_filename
会变为
read input_filename
,读取输出文件名时也是如此


0
投票

cd /ftp/daily/DWH/ rm -f ACCMAST.DAT rm -f LEGALMAST.DAT cat ACCMAST*.DAT > ACCTMP.DAT cat LEGALMAST*.DAT > LEGALTMP.DAT rm -f ACCMAST*.DAT rm -f LEGALMAST *.DAT mv ACCTMP.DAT ACCMAST.DAT mv LEGALTMP.DAT LEGALMAST.DAT - 错误行 错误:mv:“LEGALTMP.DAT LEGALMAST.DAT”后缺少目标文件操作数

© www.soinside.com 2019 - 2024. All rights reserved.