实现一个命令,即变量的内容。
我正在尝试创建一个 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
如果我自己直接运行该命令,那么它运行没有问题。我也不太明白为什么系统在字符串周围添加这些逗号。
如果我将变量回显到屏幕上,那么我可以复制它,运行它,它运行时不会出现错误。但如果我尝试在代码中运行它,我就会不断收到此错误。
我该如何让它发挥作用?
答案1
首先,$(command_string)
会给出错误“bash:command_string:找不到命令”作为命令替换。命令替换将运行括号内的命令,并用该命令的输出替换整个内容。
其次,即使您只是用来$command_string
执行命令,您仍然可以在文件名中添加单引号。文件名中没有单引号。
一般来说,避免将命令放入变量中即可。看 ”我们如何运行存储在变量中的命令?”。
相反,也许是这样的:
#!/bin/bash
for pathname in tracks/*; do
if [[ "$pathname" =~ ([0-9]+)[[:blank:]]* ]]; then
newpathname="${pathname%/*}/${BASH_REMATCH[1]}"
printf 'Would move "%s" to "%s"\n' "$pathname" "$newpathname"
# mv -i "$pathname" "$newpathname"
break
fi
done
这个循环做了(我认为)你想要做的事情。为了安全起见,我已经注释掉了实际重命名文件的部分。