
Этот скрипт отлично работает, и я изменил его, чтобы увеличить на 5. Моя проблема в том, что мне не нужна последняя запятая в конце, и я не знаю, как ее удалить.
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done
решение1
В GNU и некоторых других системах для решения этой конкретной проблемы просто используйтеseq
:
seq -s, 0 5 55
Это дает последовательность от 0 до 55 (включительно), разделенную запятой.
Есть несколько опций чистого bash, которые могут быть полезны, если ваша проблема немного сложнее, чем предполагает пример. Самый стандартный — просто использовать явный тест на то, находитесь ли вы на последней итерации:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j"
[ $i -lt 12 ] && echo -n ,
done
Здесь мы только выводим $j
каждый раз и проверяем, $i
меньше ли значение 12 (т.е. мы не на последней итерации) перед выводом запятой.
Альтернативой является формирование всего вывода в виде одной строки:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
ACCUM="$ACCUM$j,"
done
echo "${ACCUM%,}"
Здесь мы делаем ACCUM
то же самое, что вы уже распечатали, но мы ничего не выводим в самом цикле. Вы можете обрезать запятую в конце с помощью ${ACCUM%,}
: thatрасширяется дозначение ACCUM
с чем-либо в конце, соответствующим ,
отрезанному.
Но если этот seq
вариант подходит для вашего случая, я бы выбрал его.
решение2
В bash цикл редко когда нужен:
echo {0..55..5} | sed 's/ /,/g'
решение3
Вместо того, чтобы добавлять запятые везде, а затем удалять последнюю, вот потенциальное решение «на чистом bash», использующее IFS
переменную в [*]
форме расширения массива
a=( {0..55..5} ); (IFS=, ; printf '%s\n' "${a[*]}")
0,5,10,15,20,25,30,35,40,45,50,55
ВидетьBashGuide/Массивыдля получения подробной информации, включая объяснение использования подоболочки (...)
для сохранения значения родительской оболочки IFS
.
Если вы не хотите использовать подход с массивом, то вы можете избежать внешней sed
команды, используя встроенные возможности подстановки строк оболочки, например (опять же в bash):
printf -v str '%s,' {0..55..5}; printf '%s\n' "${str%,}"
0,5,10,15,20,25,30,35,40,45,50,55
решение4
Более сложные решения, которые вы получили, лучше, но для полноты картины вы всегда можете просто убрать последнюю запятую sed
:
for ((i=1, j=0; i <= 12 ; i++, j=j+5))
do
echo -n "$j,"
done | sed 's/,$//'