while read pos; do
string1= echo $pos | cut -c 20-38
string2="=$pos"
string3="$string1 $string2"
echo "$string3"
done < file
Это код моего сценария. Я хочу отобразить вывод в одной строке, но вывод происходит в разных строках.
pos = abcdefghi1234567890QWERTYUXY.tar.gz
string1 = 1234567890QWERTYUXY
string2 = abcdefghi1234567890QWERTYUXY.tar.gz
Требуется вывод:
1234567890QWERTYUXY abcdefghi1234567890QWERTYUXY.tar.gz
Но две строки отображаются в двух разных строках. Я хочу отобразить вывод в 1 строке.
Пара изменяется, и она должна работать:
Обычно то, когда Вы используете переменную как Вы, сделало в эхе, исходная переменная остается, как это было, таким образом, Ваше использование строки 2 совершенно не нужно. Кроме того, я имею привычку использовать фигурные скобки для {включения} переменных, таким образом, на них можно сослаться прямо в текста, работа фигурных скобок для разграничивания имени переменной, просто поместите знак доллара впереди (пример для следования).
1-, Когда Вы первый набор string1, не помещайте пробелы по обе стороны от знака "равно".
2-при присвоении результатов команды к переменной, необходимо вынудить команду выполняться, единственные задние галочки (символ слева от № 1 включают американские клавиатуры), окружение команды делает это.
3-часов для количества символов, которые Вы сокращаете, Ваш код и пример, не соглашаются. Так, чтобы строка была похожа:
string1=`echo $pos | cut -c 20-38`
Другая вещь состоит в том, когда Вы устанавливаете одно значение от другого, не включают дополнительный знак "равно". Таким образом, код для установки string2 должен быть похожим:
string2="$pos"
Я полагаю, что следующее сделает, как Вы запрашиваете, я скорректировал счетчики символов для предоставления вывода примера:
Вход "файл" для моего теста содержал:
abcdefghi1234567890QWERTYUXY.tar.gz
И мой сценарий:
#!/bin/sh
while read pos; do
string1=`echo ${pos} | cut -c 10-28`
echo "${string1} ${pos}"
done < file
Вывод похож:
1234567890QWERTYUXY abcdefghi1234567890QWERTYUXY.tar.gz
Который является точно, что я полагаю, что Вы просите.
Bash имеет мощную подстановку переменных, которая избавит вас от необходимости создавать дополнительные переменные и направлять их в другую команду. Может быть, попробовать что-то вроде этого
while read pos; do
echo "${pos} ${pos%.tar.gz}"
done
Общая форма ${var%Pattern}
- удалить из $ var
самую короткую часть $Pattern
, которая соответствует заднему концу $var
.
http://www.tldp.org/LDP/abs/html/parameter-substitution.html
Вы можете направить вывод через sed
, а именно:
echo "$string3" | sed ':a;N;$!ba;s/\n/ /g'
Весь кредит Жолт Ботыкай в StackOverflow за его ответ