Удалить последний символ из переменной echo

Удалить последний символ из переменной echo

Этот скрипт отлично работает, и я изменил его, чтобы увеличить на 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/,$//'

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