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

Linux mv:在shell脚本中使用mv但在终端中不使用mv时缺少文件操作数,linux,bash,ubuntu,scripting,Linux,Bash,Ubuntu,Scripting,我试图编写一个shell脚本,用户输入他们想要重命名的文件作为第一个变量,然后输入他们想要的第二个变量的新名称。程序将给出的唯一输出是mv缺少文件操作数。我碰上了一堵墙,在这一点上没有东西可以尝试。我尝试过使用文件的绝对路径,但没有帮助。谷歌没有为我找到任何东西 mv在命令行中按预期工作,但一旦引入变量,程序就会停止运行。我尝试了各种可能的格式化输入的方法 #!/bin/bash echo -n "Original filename: " read $input_filename echo ""

我试图编写一个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.

read
内置命令将变量名作为其参数

使用
读取文件名
,而不是
读取$filename

您还应该引用
mv
命令的参数:

mv -v "$input_filename" "$output_filename"

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

+ mv -v
mv: missing file operand

嗯,看起来没有设置
$input\u filename
$output\u filename
变量。在文档中查找
read
,错误变得明显。设置变量名称时,不应在变量名称前面加上
$
,因此
read$input\u filename
会变成
read input\u filename
,读取输出文件名时也会自动检测常见问题,包括。tl;dr:使用
read foo
,而不是
read$foo
Welp。就是这样。另外几个选项:使用
set-u
。这将有助于避免变量输入错误。此外,请尝试
mv-v“${input\u filename:?}”${output\u filename:?}”
(基本上与使用-u相同)。此外,请明确引用您的变量:
mv-v“$input\u filename”“$output\u filename”
错误:文件重命名失败。退出。“是完全多余的,因为
mv
已经生成了一条错误消息。如果您坚持要写入,请将其写入stderr:
echo“ERROR:File failed…”>&2