Как скомкатентовать строковые переменные в Бэше

bash shell syntax concat string-concatenation


В PHP,строки скомпонованы вместе следующим образом:

$foo = "Hello";
$foo .= " World";

Здесь $foo становится «Hello World».

Как это достигается в Бэше?




Answer 1 codaddict


foo="Hello"
foo="${foo} World"
echo "${foo}"
> Hello World

В общем,чтобы свести воедино две переменные,можно просто записывать их одну за другой:

a='Hello'
b='World'
c="${a} ${b}"
echo "${c}"
> Hello World



Answer 2 thkala


Bash также поддерживает оператор += , как показано в этом коде:

$ A="X Y"
$ A+=" Z"
$ echo "$A"
X Y Z



Answer 3 F. Hauri


Бэш первый

Поскольку этот вопрос предназначен специально для Bash , моя первая часть ответа представит различные способы сделать это правильно:

+= : Добавить к переменной

Синтаксис += может использоваться по-разному:

Добавить в строку var+=...

(Поскольку я скромен, я буду использовать только две переменные foo и a , а затем повторно использовать их во всем ответе. ;-)

a=2
a+=4
echo $a
24

Используя синтаксис вопроса Stack Overflow ,

foo="Hello"
foo+=" World"
echo $foo
Hello World

работает отлично!

Добавить к целому числу ((var+=...))

переменная a является строкой, но также и целым числом

echo $a
24
((a+=12))
echo $a
36

Добавить в массив var+=(...)

Наш a также является массивом только одного элемента.

echo ${a[@]}
36

a+=(18)

echo ${a[@]}
36 18
echo ${a[0]}
36
echo ${a[1]}
18

Обратите внимание, что между скобками находится разделенный пробелами массив . Если вы хотите сохранить строку, содержащую пробелы в вашем массиве, вы должны заключить их:

a+=(one word "hello world!" )
bash: !": event not found

Хм ... это не ошибка, а особенность ... Чтобы предотвратить попытки разработки bash !" , Вы можете:

a+=(one word "hello world"! 'hello world!' $'hello world\041')

declare -p a
declare -a a='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="h
ello world!" [6]="hello world!")'

printf : перестроить переменную с помощью встроенной команды

printf встроенной команды дает мощный способ рисования формат строка. Поскольку это встроенная функция Bash , существует возможность отправки отформатированной строки в переменную вместо печати на стандартный stdout :

echo ${a[@]}
36 18 one word hello world! hello world! hello world!

В этом массиве семь строк . Таким образом, мы можем построить отформатированную строку, содержащую ровно семь позиционных аргументов:

printf -v a "%s./.%s...'%s' '%s', '%s'=='%s'=='%s'" "${a[@]}"
echo $a
36./.18...'one' 'word', 'hello world!'=='hello world!'=='hello world!'

Или мы могли бы использовать одну строку формата аргумента, которая будет повторяться столько же аргументов, сколько представлено ...

Обратите внимание, что наш a все еще является массивом! Только первый элемент изменен!

declare -p a
declare -a a='([0]="36./.18...'\''one'\'' '\''word'\'', '\''hello world!'\''=='\
''hello world!'\''=='\''hello world!'\''" [1]="18" [2]="one" [3]="word" [4]="hel
lo world!" [5]="hello world!" [6]="hello world!")'

Под bash,когда вы получаете доступ к имени переменной без указания индекса,вы всегда обращаетесь только к первому элементу!

Поэтому,чтобы получить наш массив из семи полей,нам нужно только переустановить 1-й элемент:

a=36
declare -p a
declare -a a='([0]="36" [1]="18" [2]="one" [3]="word" [4]="hello world!" [5]="he
llo world!" [6]="hello world!")'

Строка форматирования одного аргумента с множеством переданных аргументов:

printf -v a[0] '<%s>\n' "${a[@]}"
echo "$a"
<36>
<18>
<one>
<word>
<hello world!>
<hello world!>
<hello world!>

Использование синтаксиса вопроса переполнения стека :

foo="Hello"
printf -v foo "%s World" $foo
echo $foo
Hello World

Примечание: использование двойных кавычек может быть полезно для манипулирования строками, которые содержат spaces , tabulations и / или newlines

printf -v foo "%s World" "$foo"

Шелл теперь

В оболочке POSIX вы не можете использовать bashisms , поэтому нет встроенного printf .

Basically

Но ты можешь просто сделать:

foo="Hello"
foo="$foo World"
echo $foo
Hello World

Отформатирован с использованием разветвленного printf

Если вы хотите использовать более сложные конструкции, вы должны использовать форк (новый дочерний процесс, который выполняет задание и возвращает результат через stdout ):

foo="Hello"
foo=$(printf "%s World" "$foo")
echo $foo
Hello World

Исторически, вы могли использовать обратные пометки для получения результата форка :

foo="Hello"
foo=`printf "%s World" "$foo"`
echo $foo
Hello World

Но это не легко для вложения :

foo="Today is: "
foo=$(printf "%s %s" "$foo" "$(date)")
echo $foo
Today is: Sun Aug 4 11:58:23 CEST 2013

с обратными чертами вы должны избегать внутренних вилок с обратными слешами :

foo="Today is: "
foo=`printf "%s %s" "$foo" "\`date\`"`
echo $foo
Today is: Sun Aug 4 11:59:10 CEST 2013



Answer 4 userend


Ты тоже можешь это сделать:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh



Answer 5 orkoden


bla=hello
laber=kthx
echo "${bla}ohai${laber}bye"

Волевой вывод

helloohaikthxbye

Это полезно, когда $blaohai приводит к ошибке переменной not found. Или если у вас есть пробелы или другие специальные символы в ваших строках. "${foo}" правильно экранирует все, что вы в него помещаете.