我正在尝试编写一个小型 shell 脚本来制作文件的多个副本。我可以将文件名作为输入,但不能将副本数作为输入。这是我写的。但我无法通过NUMBER
变量到for循环。
echo -n "Enter filename: "
read FILENAME
echo -n "Number of copies to be made: "
read NUMBER
for i in {2..$NUMBER}
do
cp -f $FILENAME ${FILENAME%%.*}"_"$i.csv
done
不幸的是它不是那样工作的。重击在参数扩展之前执行大括号扩展 http://www.gnu.org/software/bash/manual/html_node/Shell-Expansions.html#Shell-Expansions,所以你的大括号会先展开$NUMBER
被评估。另请参阅重击陷阱 #33 http://mywiki.wooledge.org/BashPitfalls#for_i_in_.7B1...24n.7D,这解释了这个问题。
使用您的代码执行此操作的一种方法是:
for i in $(eval echo {2..$NUMBER})
do
# ...
done
或者,甚至更短:
for i in $(seq 2 $NUMBER)
# ...
(谢谢,格伦·杰克曼!)
请注意,通常,变量应该被引用 http://mywiki.wooledge.org/Quotes。这对于文件名尤其重要。如果你的文件被调用怎么办foo bar
?那么你的cp -f
会复制foo
and bar
因为参数被空格分隔。
所以,做这样的事情:
cp -f "$FILENAME" "${FILENAME%%.*}_${i}.csv"
虽然文件中不包含空格可能并不重要,但您应该自动执行引用变量以防止将来出现任何意外。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)