执行一个命令,即一个变量的内容。
我正在尝试创建一个 bash 重命名程序,它可以重命名给定目录中的所有文件。我有以下程序:
for PATHFILE in tracks/*
do
path="$(dirname "$PATHFILE")"
file="$(basename "$PATHFILE")"
program='mv';
if [[ "$file" =~ ([0-9]*)\s*(.*) ]]
then
from=${path}/${file}
to=${path}/${BASH_REMATCH[1]};
command_string="$program '$from' '$to'";
#here the command_string contains the command i want to execute.
$(command_string);
#causes error:
# mv: target ''\''tracks/01'\''' is not a directory.
break;
fi
done
如果我自己直接运行命令,那么它运行没有问题。我也不太明白为什么系统要在字符串周围添加这些逗号。
如果我将变量回显到屏幕上,那么我就可以复制它,运行它并且它运行时没有错误。但是如果我尝试在代码中运行它,那么我会不断收到此错误。
我如何让它工作?
首先,
$(command_string)
将给您错误“bash: command_string: command not found”作为命令替换。命令替换将运行括号内的命令,并用该命令的输出替换整个命令。其次,即使你只是
$command_string
用来执行你的命令,你仍然会在文件名中添加单引号。文件名中没有单引号。一般来说,只要避免将命令放入变量即可。请参阅“我们如何运行存储在变量中的命令? ”。
相反,也许是这样的:
这个循环(我认为)做了你想做的事情。为了安全起见,我已经注释掉了实际上重命名文件的部分。