我试图将这些字符串作为除零以外的项目的输出:
[21-40]
[41-60]
[61-80]
[81-100]
但以下脚本以某种方式尝试评估_FILENAME
变量的内容。
#!/bin/bash
for i in 0 21 41 61 81
do
if (( $i > 0 ))
then
_FILENAME="[$i-$((i+19))]"
else
_FILENAME="First File"
fi
echo $_FILENAME
done
我确信我在这里遗漏了一些语法。
答案1
在变量引用周围使用双引号,例如$_FILENAME
.如果没有双引号,shell 将尝试将变量的内容拆分为多个“单词”,并展开它找到的任何文件 glob(通配符表达式)。表达如[21-40]
是globs(这个匹配任何名为“2”、“1”到“4”或“0”的文件)。如果当前目录中碰巧有任何匹配名称的文件,则将打印文件列表而不是括号表达式。因此,您需要做的就是使用:
echo "$_FILENAME"
而不是未引用的版本。顺便说一句,最好使用小写(或混合大小写)作为 shell 变量名称,以避免与许多对 shell 或其他程序具有特殊含义的魔术变量发生冲突。
答案2
戈登正确描述了您的代码的问题在他的回答中。我正在为您提供代码的替代版本,就像我编写它的方式一样:
echo 'First file'
for (( i = 20; i < 100; i += 20 )); do
printf '[%d-%d]\n' "$(( i + 1 ))" "$(( i + 20 ))"
done
printf
对于输出用户提供的数据或可变数据来说,使用通常更安全。参见例如为什么 printf 比 echo 更好?
由于间隔是规则的,因此 C 样式for
循环可能比显式列出每个间隔起始编号更适合。