Як об'єднати струнні змінні в Bash


2766

У PHP рядки об'єднуються у такий спосіб:

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

Тут $fooстає "Hello World".

Як це робиться в Баші?


6
foo="Hello" foo=$foo" World" echo $foo це, скоріше, працювало на "#! / bin / sh"
парашутувати

1
Що робити, якщо хочеш HelloWorld без місця?
Аді

@Adifoo1="World" foo2="Hello" foo3="$foo1$foo2"
GeneCode

простори мають справу в
баші

Відповіді:


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

Загалом для об'єднання двох змінних можна просто записати їх одна за одною:

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

314
Напевно, добре вписатись $fooу подвійні цитати, коли це дійсно має значення.
Каскабель

104
Нас вчать робити це завжди, оскільки коли відбувається підміна, оболонка буде ігнорувати пробіли, але подвійні лапки завжди захистять ці пробіли.
Полуниця

62
Чи повинен бути пробіл у вашому першому прикладі? Чи можна зробити щось подібне foo="$fooworld"? Я б припустив, що не ...
безглузда

341
@nonsensickle Це буде шукати змінну з назвою fooworld. Розбір, що робиться за допомогою брекетів, як у foo="${foo}world"...
twalberg

4
@ JVE999 Так, це добре працює, хоча, на мою думку, це не так добре для чіткості коду ... Але це може бути просто моїм уподобанням ... Є ще кілька способів, як це можна зробити. переконайтесь, що ім'я змінної відокремлено від частин імені, що не змінюється, щоб вона правильно розбирала.
twalberg

1127

Bash також підтримує +=оператора, як показано в цьому коді:

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

2
Чи можна використовувати цей синтаксис із ключовим словом експорту? наприклад, export A+="Z"або, можливо, Aзмінну потрібно експортувати лише один раз?
levesque

3
@levesque: Обидва :-). Експортувати змінні потрібно лише один раз, але він також export A+=Zпрацює непогано.
thkala

38
Оскільки це башизм, я думаю, що варто згадати, що ви ніколи не повинні використовувати #!/bin/shсценарій, використовуючи цю конструкцію.
Score_Under

2
Це конкретно і лише плюс-дорівнює оператору. Тобто, на відміну від Javascript, у Bash echo $ A + $ B друкує "X Y + Z"
phpguru

6
Башізм - це функція оболонки, яка підтримується лише в bashдеяких інших більш досконалих оболонках. Він не працюватиме під busybox shабо dash(що знаходиться /bin/shв багатьох дистрибутивах), або в деяких інших оболонках, як це /bin/shпередбачено у FreeBSD.
Score_Under

960

Баш перший

Оскільки це питання стоїть спеціально для Bash , моя перша частина відповіді представляла б різні способи цього правильно:

+=: Додати до змінної

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

Додайте до рядка var+=...

(Тому що я скромний, я буду використовувати тільки дві змінні fooі aпотім повторно використовувати той же самий в цілому відповідь ;-).

a=2
a+=4
echo $a
24

Використовуючи синтаксис запитання про переповнення стека ,

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

Хм .. це не помилка, а особливість ... Щоб запобігти тому, щоб баш намагався розвиватися !", ви можете:

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

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

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

Шелл зараз

Під оболонкою POSIX ви не можете використовувати башизми , тому немає вбудованого printf .

В основному

Але ви могли просто зробити:

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

4
+=Оператор також набагато швидше , ніж $a="$a$b"в моїх тестах .. Який сенс.
Метт

7
Ця відповідь є приголомшливою, але я думаю, що в ній відсутній var=${var}.shприклад з інших відповідей, що дуже корисно.
генеорама

1
Є bashєдина оболонка з +=оператором? Я хочу дізнатися, чи достатньо портативний
дефіс

1
@dashesy немає. Я, звичайно, не єдина оболонка з +=оператором, але всі ці способи - це башизми , тому не портативні! Навіть у вас може виникнути спеціальна помилка у разі неправильної версії bash!
Ф. Хаурі

134

Ви також можете це зробити:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

4
Хоча жодних спеціальних символів і пробілів не використовуються, подвійні лапки, цитати та фігурні дужки марні: var=myscript;var=$var.sh;echo $varмали б однакові ефекти (Ця робота під bash, dash, busybox та ін.).
Ф. Хаурі

@ F.Hauri дякую, що вказали на це. Але якби ви echo $var2myscript2
додали

@Pynchia Ця робота через .незаконну точку в назві змінної. Якщо інше echo ${var}2чи дивіться мою відповідь
Ф. Хаурі

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

Вийде

helloohaikthxbye

Це корисно, коли $blaohai призводить до помилки не знайдено змінної. Або якщо у ваших рядках є пробіли чи інші спеціальні символи. "${foo}"належним чином уникає всього, що ви вкладете в нього.


3
Не працює. Я отримую "backupstorefolder: команда не знайдена" з bash, де "backupstorefolder" - ім'я змінної.
Zian Choy

7
Це допомагає виділити синтаксис зовсім небагато і видаляє деяку людську неоднозначність.
Рей Фосс

44
foo="Hello "
foo="$foo World"

     


10
Це найкорисніша відповідь для сценаріїв оболонок. Я знайшов себе останні 30 хвилин, тому що у мене був пробіл до та після знаку рівності !!
Стефан

8
foo = "$ {foo} Світ"
XXL

@XXL, звичайно, я б скоріше скористався дужками, щоб інкапсулювати ім'я var. Настійно рекомендується
Серхіо А.

33

Я вирішував проблему просто

$a$b

Наприклад,

a="Hello"
b=" World"
c=$a$b
echo "$c"

який виробляє

Hello World

Якщо ви спробуєте з'єднати рядок з іншою, наприклад,

a="Hello"
c="$a World"

то echo "$c"виробить

Hello World

з додатковим простором.

$aWorld

не працює, як ви можете собі уявити, але

${a}World

виробляє

HelloWorld

1
... отже, ${a}\ WorldвиробляєHello World
XavierStuvw

Це мене дивує; Я би очікував, що c=$a$bтут зробить те саме, що c=$a World(що спробував би запустити Worldяк команду). Я думаю, це означає, що призначення аналізується перед розширенням змінних ..
mwfearnley

30

Ось стислий підсумок того, про що йдеться у більшості відповідей.

Скажімо, у нас є дві змінні, і $ 1 встановлено на "одну":

set one two
a=hello
b=world

У наведеній нижче таблиці описані різні контексти , де ми можемо об'єднати значення aі bстворити нову змінну, c.

Context                               | Expression            | Result (value of c)
--------------------------------------+-----------------------+---------------------
Two variables                         | c=$a$b                | helloworld
A variable and a literal              | c=${a}_world          | hello_world
A variable and a literal              | c=$1world             | oneworld
A variable and a literal              | c=$a/world            | hello/world
A variable, a literal, with a space   | c=${a}" world"        | hello world
A more complex expression             | c="${a}_one|${b}_2"   | hello_one|world_2
Using += operator (Bash 3.1 or later) | c=$a; c+=$b           | helloworld
Append literal with +=                | c=$a; c+=" world"     | hello world

Кілька приміток:

  • Включення RHS завдання у подвійних лапках, як правило, є хорошою практикою, хоча у багатьох випадках це зовсім необов’язково
  • += краще з точки зору продуктивності, якщо велика струна будується невеликими кроками, особливо в циклі
  • використовуйте {}імена змінних, щоб розмежувати їх розширення (як у другому рядку в таблиці вище). Як видно з рядків 3 і 4, немає необхідності, {}якщо змінна не буде об'єднана рядком, який починається з символу, який є дійсним першим символом у назві змінної оболонки, тобто алфавіту або підкреслення.

Дивись також:


2
Якщо ви стурбовані тим, про продуктивності, см аналіз в моїй обороні stackoverflow.com/a/47878161/117471
Бруно Bronosky


20

Ще один підхід ...

> H="Hello "
> U="$H""universe."
> echo $U
Hello universe.

... і ще один.

> H="Hello "
> U=$H"universe."
> echo $U
Hello universe.

1
Це я і зробив, і я вважав це набагато простішим і простішим, ніж інші відповіді. Чи є причина, що ніхто з найбільш проголосованих відповідей не вказав на цей варіант?
quimnuss

1
@quimnuss Те, що рядки не відповідають тим, які використовуються у питанні про ОП, може бути вагомою причиною.
jlliagre

20

Якщо ви хочете додати щось на зразок підкреслення, використовуйте escape (\)

FILEPATH=/opt/myfile

Це не працює:

echo $FILEPATH_$DATEX

Це добре працює:

echo $FILEPATH\\_$DATEX

11
Або ж $ {FILEPATH} _ $ DATEX. Тут {} використовуються для позначення меж імені змінної. Це підходить, тому що підкреслення є юридичним символом змінних імен, тому у вашому фрагменті фрагментів насправді намагається вирішити FILEPATH_, а не лише $
FILEPATH

1
для мене у мене була одна змінна, тобто $ var1 та константа поруч із цим, тому echo $ var1_costant_traling_part працює для мене
YouAreAwesome

2
Я думаю, що для втечі потрібен лише один зворотний люфт: echo $a\_$bбуло б. Як натякнув у коментарі Нік О'Лай, підкреслення є регулярним символом. Обробка білих пробілів набагато більш чутлива для струн, відлуння та конкатенації --- ви можете \ ретельно використовувати та читати цю тему, оскільки ця проблема повертається раз у раз.
XavierStuvw

16

Найпростіший спосіб з лапками:

B=Bar
b=bar
var="$B""$b""a"
echo "Hello ""$var"

1
Занадто багато лапок, ІМХО. var=$B$b"a"; echo Hello\ $varзробив би, я вважаю
XavierStuvw

Я пропоную використовувати всі лапки, тому що якщо ви поставите його всюди, чого не можете пропустити, вам не доведеться думати.
betontalpfa

15

Ви можете об'єднатись без лапок. Ось приклад:

$Variable1 Open
$Variable2 Systems
$Variable3 $Variable1$Variable2
$echo $Variable3

Це останнє твердження надрукує "OpenSystems" (без лапок).

Це приклад сценарію Bash:

v1=hello
v2=world
v3="$v1       $v2"
echo $v3            # Output: hello world
echo "$v3"          # Output: hello       world

1
Синтаксис першого блоку заплутаний. Що означають ці знаки $?
XavierStuvw

15

Навіть якщо оператор + = зараз дозволений, він був введений в Bash 3.1 в 2004 році.

Будь-який сценарій, що використовує цього оператора в старих версіях Bash, не вдасться з помилкою "команда не знайдена", якщо вам пощастить, або "помилкою синтаксису поблизу несподіваного маркера".

Для тих, хто піклується про зворотну сумісність, дотримуйтесь старих стандартних методів конкатенації Bash, таких як зазначені у вибраній відповіді:

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

1
Дякую, що вказали на це, я просто шукав, для якої версії потрібно це працювати.
Rho Phi

14

Я вважаю за краще використовувати фігурні дужки ${}для розширення змінної в рядку:

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

Фігурні дужки підійдуть до постійного використання рядків:

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

Інакше використовувати foo = "$fooWorld"не вийде.


8

Якщо ви намагаєтеся розділити рядок на кілька рядків, ви можете скористатися зворотною косою рисою:

$ a="hello\
> world"
$ echo $a
helloworld

З одним проміжком між ними:

$ a="hello \
> world"
$ echo $a
hello world

Цей додає лише один пробіл між ними:

$ a="hello \
>      world"
$ echo $a
hello world

Боюся, що це не малося на увазі
installero

7

Більш безпечний спосіб:

a="AAAAAAAAAAAA"
b="BBBBBBBBBBBB"
c="CCCCCCCCCCCC"
d="DD DD"
s="${a}${b}${c}${d}"
echo "$s"
AAAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCCCCDD DD

Рядки, що містять пробіли, можуть стати частиною команди, використовуйте "$ XXX" та "$ {XXX}", щоб уникнути цих помилок.

Плюс подивіться іншу відповідь про + =


Точка рядків з пробілом, який читається як команда, відображається в точці визначення. Так d=DD DDби дав DD: command not found--- зауважте, що це останній DD, а не d, який не знайдено. Якщо всі операнди належним чином відформатовані і вже містять необхідні пробіли, ви можете просто об'єднатися s=${a}${b}${c}${d}; echo $sз меншими позначками лапок. Також ви можете використовувати \ (уникнуту пробіл), щоб уникнути цих проблем --- d=echo\ echoне запустить жодного ехо-виклику, тоді як d=echo echoбуде.
XavierStuvw

7

Є один конкретний випадок, коли вам слід подбати:

user=daniel
cat > output.file << EOF
"$user"san
EOF

Вийде "daniel"san, а не danielsan, як ви могли б хотіти. У цьому випадку вам слід зробити:

user=daniel
cat > output.file << EOF
${user}san
EOF

6
a="Hello,"
a=$a" World!"
echo $a

Це те, як ви об'єднали два рядки.


1
Це працює, але іноді дасть непередбачувані результати, оскільки змінна інтерполяція не захищена. Таким чином, ви не можете покластися на цю форму для всіх випадків використання.
Ентоні

5

Якщо це ваш приклад додавання " World"до початкового рядка, то це може бути:

#!/bin/bash

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

Вихід:

Hello World


5

Висловлюються занепокоєння щодо продуктивності, але даних не надано. Дозвольте запропонувати простий тест.

(ПРИМІТКА: dateна macOS не пропонуються наносекунди, тому це потрібно зробити в Linux.)

Я створив append_test.sh на GitHub із вмістом:

#!/bin/bash -e

output(){
    ptime=$ctime;
    ctime=$(date +%s.%N);
    delta=$(bc <<<"$ctime - $ptime");
    printf "%2s. %16s chars  time: %s  delta: %s\n" $n "$(bc <<<"10*(2^$n)")" $ctime $delta;
}

method1(){
    echo 'Method: a="$a$a"'
    for n in {1..32}; do a="$a$a"; output; done
}

method2(){
    echo 'Method: a+="$a"'
    for n in {1..32}; do a+="$a";  output; done
}

ctime=0; a="0123456789"; time method$1

Тест 1:

$ ./append_test.sh 1
Method: a="$a$a"
 1.               20 chars  time: 1513640431.861671143  delta: 1513640431.861671143
 2.               40 chars  time: 1513640431.865036344  delta: .003365201
 3.               80 chars  time: 1513640431.868200952  delta: .003164608
 4.              160 chars  time: 1513640431.871273553  delta: .003072601
 5.              320 chars  time: 1513640431.874358253  delta: .003084700
 6.              640 chars  time: 1513640431.877454625  delta: .003096372
 7.             1280 chars  time: 1513640431.880551786  delta: .003097161
 8.             2560 chars  time: 1513640431.883652169  delta: .003100383
 9.             5120 chars  time: 1513640431.886777451  delta: .003125282
10.            10240 chars  time: 1513640431.890066444  delta: .003288993
11.            20480 chars  time: 1513640431.893488326  delta: .003421882
12.            40960 chars  time: 1513640431.897273327  delta: .003785001
13.            81920 chars  time: 1513640431.901740563  delta: .004467236
14.           163840 chars  time: 1513640431.907592388  delta: .005851825
15.           327680 chars  time: 1513640431.916233664  delta: .008641276
16.           655360 chars  time: 1513640431.930577599  delta: .014343935
17.          1310720 chars  time: 1513640431.954343112  delta: .023765513
18.          2621440 chars  time: 1513640431.999438581  delta: .045095469
19.          5242880 chars  time: 1513640432.086792464  delta: .087353883
20.         10485760 chars  time: 1513640432.278492932  delta: .191700468
21.         20971520 chars  time: 1513640432.672274631  delta: .393781699
22.         41943040 chars  time: 1513640433.456406517  delta: .784131886
23.         83886080 chars  time: 1513640435.012385162  delta: 1.555978645
24.        167772160 chars  time: 1513640438.103865613  delta: 3.091480451
25.        335544320 chars  time: 1513640444.267009677  delta: 6.163144064
./append_test.sh: fork: Cannot allocate memory

Тест 2:

$ ./append_test.sh 2
Method: a+="$a"
 1.               20 chars  time: 1513640473.460480052  delta: 1513640473.460480052
 2.               40 chars  time: 1513640473.463738638  delta: .003258586
 3.               80 chars  time: 1513640473.466868613  delta: .003129975
 4.              160 chars  time: 1513640473.469948300  delta: .003079687
 5.              320 chars  time: 1513640473.473001255  delta: .003052955
 6.              640 chars  time: 1513640473.476086165  delta: .003084910
 7.             1280 chars  time: 1513640473.479196664  delta: .003110499
 8.             2560 chars  time: 1513640473.482355769  delta: .003159105
 9.             5120 chars  time: 1513640473.485495401  delta: .003139632
10.            10240 chars  time: 1513640473.488655040  delta: .003159639
11.            20480 chars  time: 1513640473.491946159  delta: .003291119
12.            40960 chars  time: 1513640473.495354094  delta: .003407935
13.            81920 chars  time: 1513640473.499138230  delta: .003784136
14.           163840 chars  time: 1513640473.503646917  delta: .004508687
15.           327680 chars  time: 1513640473.509647651  delta: .006000734
16.           655360 chars  time: 1513640473.518517787  delta: .008870136
17.          1310720 chars  time: 1513640473.533228130  delta: .014710343
18.          2621440 chars  time: 1513640473.560111613  delta: .026883483
19.          5242880 chars  time: 1513640473.606959569  delta: .046847956
20.         10485760 chars  time: 1513640473.699051712  delta: .092092143
21.         20971520 chars  time: 1513640473.898097661  delta: .199045949
22.         41943040 chars  time: 1513640474.299620758  delta: .401523097
23.         83886080 chars  time: 1513640475.092311556  delta: .792690798
24.        167772160 chars  time: 1513640476.660698221  delta: 1.568386665
25.        335544320 chars  time: 1513640479.776806227  delta: 3.116108006
./append_test.sh: fork: Cannot allocate memory

Помилки вказують на те, що мій Bash отримав до 335.54432 Мб, перш ніж він вийшов з ладу . Ви можете змінити код від подвоєння даних до додавання константи для отримання більш деталізованого графіка та точки відмови. Але я думаю, що це повинно дати вам достатньо інформації, щоб вирішити, чи вам це все одно. Особисто менше 100 МБ я не знаю. Ваш пробіг може відрізнятися.


Цікаво! Поміркуйте: join <(LANG=C bash -c 'a="a" c=1 last=${EPOCHREALTIME//.};while :;do a+=$a;now=${EPOCHREALTIME//.};echo $((c++)) ${#a} $((now-last));last=$now;done') <(LANG=C bash -c 'a="a" c=1 last=${EPOCHREALTIME//.};while :;do a=$a$a;now=${EPOCHREALTIME//.};echo $((c++)) ${#a} $((now-last));last=$now;done')|sed -ue '1icnt strlen a+=$a a=$a$a' -e 's/^\([0-9]\+\) \([0-9]\+\) \([0-9]\+\) \2/\1 \2 \3/' | xargs printf "%4s %11s %9s %9s\n"(Спробуйте це на не продуктивний хост !!;)
Ф. Хаурі

4

Я хотів побудувати рядок зі списку. Не вдалося знайти відповіді на це, тому я розміщую його тут. Ось що я зробив:

list=(1 2 3 4 5)
string=''

for elm in "${list[@]}"; do
    string="${string} ${elm}"
done

echo ${string}

і тоді я отримую такий вихід:

1 2 3 4 5

4

Незважаючи на спеціального оператора, +=для конкатенації існує більш простий шлях:

foo='Hello'
foo=$foo' World'
echo $foo

Подвійні лапки вимагають додаткового часу на обчислення для інтерпретації змінних всередині. Уникайте, якщо це можливо.


3

Зауважте, що це не спрацює

foo=HELLO
bar=WORLD
foobar=PREFIX_$foo_$bar

як здається, скидає $ foo і залишає вас з:

PREFIX_WORLD

але це спрацює:

foobar=PREFIX_"$foo"_"$bar"

і залишимо вам правильний вихід:

PREFIX_HELLO_WORLD


8
це відбувається тому, що підкреслення є дійсним символом змінних імен, тому bash бачить foo_ як змінну. Коли потрібно сказати точні межі імені вару, можна використовувати фігурні дужки: PREFIX _ $ {foo} _ $ bar
Nik O'Lai

2

Ось один через AWK :

$ foo="Hello"
$ foo=$(awk -v var=$foo 'BEGIN{print var" World"}')
$ echo $foo
Hello World

1
Приємно, але я думаю, що я міг би отримати більшу точність за допомогою Python!
техно

1

Я роблю це так, коли зручно: Використовуйте вбудовану команду!

echo "The current time is `date`"
echo "Current User: `echo $USER`"

1
У першому рядку ви можете кинути вилку , використовуючи:, date "+The current time is %a %b %d %Y +%T"а не echo ...$(date). Згідно з недавнім Баш, ви могли б написати: printf "The current time is %(%a %b %d %Y +%T)T\n" -1.
Ф. Хаурі

1

На мою думку, найпростіший спосіб об'єднати два рядки - написати функцію, яка робить це для вас, а потім скористатися цією функцією.

function concat ()
{
    prefix=$1
    suffix=$2

    echo "${prefix}${suffix}"
}

foo="Super"
bar="man"

concat $foo $bar   # Superman

alien=$(concat $foo $bar)

echo $alien        # Superman

-1

Мені подобається робити швидку функцію.

#! /bin/sh -f
function combo() {
    echo $@
}

echo $(combo 'foo''bar')

Ще один спосіб зіпсувати кішку. Цього разу з функціями: D


Виклик функції, яка теж знаходиться в нижній частині корпусу, є занадто великим надмірним рівнем для простого контету.
codeforester

-1

Я ще не знаю про PHP, але це працює в Linux Bash. Якщо ви не хочете впливати на змінну, ви можете спробувати це:

read pp;  *# Assumes I will affect Hello to pp*
pp=$( printf $pp ;printf ' World'; printf '!');
echo $pp;

>Hello World!

Ви можете розмістити іншу змінну замість "Привіт" або "!". Ви також можете об'єднати більше рядків.


2
Використання підшару для простого конкатенації - це занадто дорого!
codeforester
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.