2015-02-17 2 views
3

В сценарии bash у меня есть три переменные, которые содержат несколько строк одинаковой длины.Bash script «concatenate» multi-lined variables

Например:

$a 
one 
two 
three 

$b 
dog 
cow 
fish 

$c 
blue 
red 
green 

Каким образом я мог бы эхо вывод в том же формате:

onedogblue 
twocowred 
threefishgreen 

Я попробовал цикл из цикла по каждой переменной, и повторяя каждую строку, но не получил желаемого результата. Любой совет?

РЕДАКТИРОВАНИЕ БОЛЬШЕ ТОЧНОСТИ Так что мой сценарий будет работать с текстовым файлом в качестве аргумента (./script.sh текстового файла) У меня есть три переменных с одинаковым содержанием этого переменным:

#!/bin/sh 
x=`awk 'NR>1{print $1}' $1 | tr '[:upper:]' '[:lower:]'` 

Я манипулирую тем же текстовым файлом из аргумента команды, чтобы получить разные части файла. В конечном итоге вы хотите «вставить» их вместе в этом формате «$ x»: «$ y» «$ z. Я знаю, что есть, вероятно, более разумные способы обработки текстового файла в желаемом формате, но я хотел бы найти, такой способ отформатировать его в пути, перечисленный выше

+4

Если вы делаете 'cat $ a', то' $ a' - это переменная, которая расширяет (не имеет значения) имя файла, который печатается стандартным образом. Это не то же самое, что содержимое переменной. –

+0

Можете ли вы сделать echo $ a –

+1

@JoseMartinez с цитатами пожалуйста: 'echo '$ a" '. –

ответ

6

paste ваш друг:.

$ paste -d' ' <(echo "$a") <(echo "$b") <(echo "$c") 
one dog blue 
two cow red 
three fish green 

отмечая, что $a заводится через a=$(cat a), с файлом a, содержащие следующие строки вашего предусмотренное То же самое относится. до $b и $c. Также важно видеть, что я делаю echo "$a" с кавычками вокруг переменной, так что fo rmat сохранен. В противном случае новые строки не появятся.

paste не позволяет -d'' (то есть пустой разделитель), так что если вы хотите, чтобы удалить пробелы вы можете трубы к, например tr:

$ paste -d' ' <(echo "$a") <(echo "$b") <(echo "$c") | tr -d ' ' 
onedogblue 
twocowred 
threefishgreen 
+0

Это будет работать в скрипте? – swam

+0

@swam Что вы имеете в виду? – fedorqui

+0

Команда вставки, кажется, терпит неудачу, когда я использую ее в сценарии .sh. – swam

0

Как насчет не имея котировки в эхе так что новые строки удалены, затем используйте sed для удаления пробелов.

$a="one 
> two 
> three" 
$ 
$echo "$a" 
one 
two 
three 
$ 
$echo $a 
one two three 
$ 
$echo $a | sed 's/ //g' 
onetwothree 
$ 
+1

Потому что без кавычек ваше расширение распространяется на расширение имени пути. Кстати, если вы этого только хотели, вы бы сделали: 'echo '$ {a // [[: space:]]}" '. Но проблема OP другая: OP хочет «перетасовать» три переменные. –