如何在 bash 脚本中计算涉及数学的连接字符串

如何在 bash 脚本中计算涉及数学的连接字符串

我试图将这些字符串作为除零以外的项目的输出:

[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循环可能比显式列出每个间隔起始编号更适合。

相关内容