&&
не является аргументом []
(, так как [
на самом деле является программой ), это оператор 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
Есть инструмент, который может сделать это за вас:paste
$ paste -sd: names.txt
roger:peter:henry
Альтернативное решение с sed
иtr
:
sed '$!s/$/:/' names.txt | tr -d '\n'
Выходы:
roger:peter:henry
paste
— правильный инструмент для работы. Но для полноты картины вот как сделать то, что вы пытались:
k="$(head -n1 names.txt)";
for i in $(tail -n+2 names.txt); do
k="$k:$i";
done
Получается:
$ echo "$k"
roger:peter:henry
$i+=$i":"
Это не делает то, что вы хотите. Вместо этого он расширяет $i
в отмеченных местах и пытается выполнить результат как команду. Присваивание оболочки не принимает знак доллара слева (, думайте о нем как о значении переменной, здесь нам нужно не это, а место для сохранения в ). Вместо этого должно быть i+=$i":"
. Или, предпочтительно, i+="$i:"
просто для того, чтобы привыкнуть цитировать расширения переменных оболочки.
Кроме того, вы пытаетесь добавить переменную, используемую в качестве переменной цикла. Это не очень полезно, так как оно перезаписывается в следующем раунде цикла. Кроме того, вы добавляете двоеточие после каждого элемента, включая последний, так что он будет в конце. Но мы можем удалить его позже с расширением ${var%suffix}
.
Так:
s=
for i in $(cat names.txt); do
s+="$i:"
done
s=${s%:}
Однако имейте в виду, что расширение $(cat)
без кавычек будет обрабатывать любые шаблоны имен файлов (подстановочные знаки ), поэтому строка *
в файле будет расширена на все файлы в текущем каталоге и т. д.