Вам нужно использовать ${c}q
для предотвращения жадного обращения (bash
пытается использовать как можно больше допустимых символов):
pax$ export cq=111
pax$ export c=222
pax$ echo $cq
111
pax$ echo ${c}q
222q
Я должен также упомянуть, что, если производительность важна для вас, вы хотите попытаться свести к минимуму количество внешних процессов (например, bc
), которые вы запускаете для выполнения своей задачи. Форкинг и исполнение не являются бесплатными действиями, и вы будете работать намного быстрее, если вы заставите bash
выполнять большую часть работы для краткосрочных задач.
Под недолговечным я имею в виду такие вещи, как добавление единицы к переменной. Очевидно, что если вы хотите выполнить большую работу, например sed
, для всего файла, вам лучше сделать это в выделенном внешнем инструменте, но bash
предоставляет довольно много возможностей для замены дорогих операций, таких как i=$(expr $i + 1)
или i=$(echo "$i+1"|bc)
.
Таким образом, цикл
A bash
может быть выполнен с инкрементом и другими вычислениями, выполняемыми без внешних процессов:
#!/bin/bash
for ((count = 0; count < 10; count++)) ; do
((next = count + 1))
echo "count is ${count}, sed string is '${next}q;d'."
done
Это выводит:
count is 0, sed string is '1q;d'.
count is 1, sed string is '2q;d'.
count is 2, sed string is '3q;d'.
count is 3, sed string is '4q;d'.
count is 4, sed string is '5q;d'.
count is 5, sed string is '6q;d'.
count is 6, sed string is '7q;d'.
count is 7, sed string is '8q;d'.
count is 8, sed string is '9q;d'.
count is 9, sed string is '10q;d'.
Вы также можете включить next
в цикл for
:
#!/bin/bash
for ((count = 0, next = 1; count < 10; count++, next++)) ; do
echo "count is ${count}, sed string is '${next}q;d'."
done