Linux mv:在shell脚本中使用mv但在终端中不使用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 ""
#!/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