无法从单行命令回显bash变量

时间:2018-06-11 19:21:53

标签: bash unix for-loop filenames cut

我有以下文件名,我正在尝试将v5.4b重新标记为v5.7

v5.4b_lvl-1.e8974326
v5.4b_lvl-1.o8974326
v5.4b_lvl-1.pe8974326
v5.4b_lvl-1.po8974326
v5.4b_lvl-2.1.e8974303
v5.4b_lvl-2.1.o8974303
v5.4b_lvl-2.1.pe8974303
v5.4b_lvl-2.1.po8974303
v5.4b_lvl-2.2.e8974304
v5.4b_lvl-2.2.o8974304
v5.4b_lvl-2.2.pe8974304
v5.4b_lvl-2.2.po8974304
v5.4b_lvl-3.1.e8974305
v5.4b_lvl-3.1.o8974305
v5.4b_lvl-3.1.pe8974305
v5.4b_lvl-3.1.po8974305
v5.4b_lvl-4.1.e8974327
v5.4b_lvl-4.1.o8974327
v5.4b_lvl-4.1.pe8974327
v5.4b_lvl-4.1.po8974327

我无法mv v5.4b_* v5.7_*,因为它认为v5.7_*是一个目录,所以我正在尝试for-loop,但我无法让它工作

我正在尝试这篇SO How to set a variable to the output of a command in Bash?的推荐答案,但却得到了一堆空行。

我做错了什么?如何将cut的输出保存到SUFFIX,以便我可以mv $i v5.7_$SUFFIX

-bash-4.1$ for i in v5.4b*; do echo $i | SUFFIX=`cut -f2 -d'_'`; echo ${SUFFIX}; done

2 个答案:

答案 0 :(得分:2)

您已将echo $i放在错误的位置。该命令的输出需要通过管道传送到cut才能读取任何内容,然后将结果分配给SUFFIX

for i in v5.4b*
do 
    SUFFIX=`echo $i | cut -f2 -d'_'`
    echo ${SUFFIX}
done

答案 1 :(得分:1)

如果您重命名实用程序,那么只需执行以下操作:

rename -n 's/v5\4.b/v5.7/' v5.4b*

PS:-n用于干跑。您可以稍后将其删除以进行真正的重命名。

如果rename不可用,请使用:

for i in v5.4b*; do
   echo mv "$i" "${i/v5.4b/v5.7}"
done

如果您对输出感到满意,请删除' echo。