Добавить строку к переменной с разделителем

&& не является аргументом [](, так как [на самом деле является программой ), это оператор Bash для запуска второй команды, если первая выполнена успешно. Итак, для bash ваш скрипт выглядит как:

if ([ $mintemp -ge 15) && ($maxtemp -le 28 ]; then echo "nice day"; fi)

Что недопустимо. Однако вы можете сделать это как:

if [ $mintemp -ge 15 ] && [ $maxtemp -le 28 ]; then echo "nice day"; fi
0
24.09.2020, 15:45
4 ответа

Есть инструмент, который может сделать это за вас:paste

$ paste -sd: names.txt
roger:peter:henry
4
18.03.2021, 23:02

Альтернативное решение с sedиtr:

sed '$!s/$/:/' names.txt | tr -d '\n'

Выходы:

roger:peter:henry
0
18.03.2021, 23:02

paste— правильный инструмент для работы. Но для полноты картины вот как сделать то, что вы пытались:

k="$(head -n1 names.txt)";
for i in $(tail -n+2 names.txt); do 
    k="$k:$i"; 
done

Получается:

$ echo "$k"
roger:peter:henry
0
18.03.2021, 23:02
$i+=$i":"

Это не делает то, что вы хотите. Вместо этого он расширяет $iв отмеченных местах и ​​пытается выполнить результат как команду. Присваивание оболочки не принимает знак доллара слева (, думайте о нем как о значении переменной, здесь нам нужно не это, а место для сохранения в ). Вместо этого должно быть i+=$i":". Или, предпочтительно, i+="$i:"просто для того, чтобы привыкнуть цитировать расширения переменных оболочки.

Кроме того, вы пытаетесь добавить переменную, используемую в качестве переменной цикла. Это не очень полезно, так как оно перезаписывается в следующем раунде цикла. Кроме того, вы добавляете двоеточие после каждого элемента, включая последний, так что он будет в конце. Но мы можем удалить его позже с расширением ${var%suffix}.

Так:

s=
for i in $(cat names.txt); do
   s+="$i:"
done 
s=${s%:}

Однако имейте в виду, что расширение $(cat)без кавычек будет обрабатывать любые шаблоны имен файлов (подстановочные знаки ), поэтому строка *в файле будет расширена на все файлы в текущем каталоге и т. д.

0
18.03.2021, 23:02

Теги

Похожие вопросы