Как оценить объединенную строку, содержащую математические выражения, в скрипте 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. Без двойных кавычек оболочка попытается разбить содержимое переменной на несколько «слов», а также расширить любые найденные ею файловые глобусы (шаблонное выражение). выражения вроде[21-40] являютсяglobs (этот соответствует любым файлам с именами "2", "1" по "4" или "0"). Если в текущем каталоге есть файлы с любыми совпадающими именами, вместо выражения в скобках будет выведен список файлов. Таким образом, все, что вам нужно сделать, это использовать:

echo "$_FILENAME"

вместо версии без кавычек. Кстати, также лучше использовать строчные буквы (или смешанный регистр) для имен переменных оболочки, чтобы избежать конфликтов со многими магическими переменными, имеющими особое значение для оболочки или других программ.

решение2

Гордон правильно описал проблемы с вашим кодом.в своем ответеЯ даю вам альтернативную версию вашего кода, как бы я его написал:

echo 'First file'

for (( i = 20; i < 100; i += 20 )); do
    printf '[%d-%d]\n' "$(( i + 1 ))" "$(( i + 20 ))"
done

Использование printfобычно безопаснее для вывода пользовательских или переменных данных. См. напримерПочему printf лучше, чем echo?

Поскольку интервалы являются регулярными, forцикл в стиле C, возможно, подойдет лучше, чем явное перечисление начальных номеров каждого интервала.

Связанный контент