Vraag Stringreeksen in Bash aaneenschakelen


In PHP worden tekenreeksen als volgt samengevoegd:

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

Hier, $foo wordt "Hallo wereld".

Hoe is dit bereikt in Bash?


2095
2017-11-15 05:38


oorsprong


antwoorden:


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

In het algemeen om twee variabelen aaneen te schakelen, kunt u ze gewoon achter elkaar schrijven:

a='hello'
b='world'
c=$a$b
echo $c
> helloworld

2842
2017-11-15 05:41



Bash ondersteunt ook een operator + = zoals weergegeven in het volgende transcript:

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

933
2017-11-15 08:33



Bash eerst

Waar deze vraag specifiek voor staat Bash, mijn eerste deel van het antwoord zou verschillende manieren voorstellen om dit op de juiste manier te doen:

+=: Toevoegen aan variabele

De syntaxis += kan op verschillende manieren worden gebruikt:

Voeg toe aan string var+=...

(Omdat ik zuinig ben, zal ik slechts twee variabelen gebruiken foo en a en gebruik vervolgens hetzelfde in het hele antwoord. ;-)

a=2
a+=4
echo $a
24

De ... gebruiken Stack Overflow-vraag syntaxis,

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

werkt prima!

Voeg toe aan een geheel getal ((var+=...))

veranderlijk a is een string, maar ook een geheel getal

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

Voeg toe aan een array var+=(...)

Onze a is ook een array van slechts één element.

echo ${a[@]}
36

a+=(18)

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

Merk op dat er tussen haakjes een staat ruimte gescheiden array. Als u een string met spaties in uw array wilt opslaan, moet u deze insluiten:

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

Hmm .. dit is geen bug, maar een functie... Om te voorkomen dat bash zich probeert te ontwikkelen !", je zou kunnen:

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: Herschat variabele met behulp van de ingebouwde opdracht

De printf  ingebouwde opdracht geeft een krachtige manier om tekenreeksen te tekenen. Omdat dit een Bash is ingebouwde, er is een optie voor het verzenden van een geformuleerde reeks naar een variabele in plaats van afdrukken op stdout:

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

Er zijn er zeven strings in deze array. We kunnen dus een geformuleerde reeks maken met precies zeven positionele argumenten:

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

Of we kunnen gebruiken een argument format string wat herhaald zal worden als er zoveel argumenten naar voren worden gebracht ...

Merk op dat onze a is nog steeds een array! Alleen eerste element is gewijzigd!

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!")'

Als u onder bash toegang hebt tot een variabelenaam zonder een index op te geven, moet u altijd alleen het eerste element adresseren!

Dus om onze zeven veldarray op te halen, hoeven we alleen het eerste element opnieuw in te stellen:

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!")'

Een argument-indelingsstring met veel argumenten doorgegeven aan:

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

De ... gebruiken Stack Overflow-vraag syntaxis:

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

Notitie: Het gebruik van dubbele aanhalingstekens kan handig zijn voor het manipuleren van tekenreeksen die bevatten spaces, tabulations en / of newlines

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

Shell nu

Onder POSIX schelp, je kon het niet gebruiken bashisms, dus er is geen ingebouwde  printf.

Eigenlijk

Maar je zou gewoon kunnen doen:

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

Opgemaakt, gebruikmakend van gevorkt  printf

Als u meer geavanceerde constructies wilt gebruiken, moet u a. Gebruiken vork (nieuw kindproces dat de taak uitvoert en het resultaat terugstuurt stdout):

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

Historisch gezien zou je kunnen gebruiken backticks voor het ophalen van het resultaat van een vork:

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

Maar dit is niet gemakkelijk voor nesting:

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

met backticks moet je innerlijke vorken ontsnappen backslashes:

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

803
2017-08-04 10:04



U kunt dit ook doen:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

114
2017-10-28 03:09



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

Zal uitvoeren

helloohaikthxbye

Dit is handig wanneer      $blaohai leidt tot een variabele niet gevonden fout. Of als je spaties of andere speciale tekens in je snaren hebt staan. "${foo}" op de juiste manier ontsnapt aan alles wat je erin stopt.


103
2017-07-25 15:48



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


35
2017-11-15 05:44



De manier waarop ik het probleem zou oplossen, is gewoon

$a$b

Bijvoorbeeld,

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

welke produceert

Hello World

Als u bijvoorbeeld een tekenreeks met een andere tekenreeks samenvoegt,

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

dan echo "$c" zal produceren

Hello World

met een extra spatie.

$aWorld

werkt niet, zoals je je misschien kunt voorstellen, maar

${a}World

produceert

HelloWorld

29
2018-03-07 16:43



$ a=hip
$ b=hop
$ ab=$a$b
$ echo $ab
hiphop
$ echo $a$b
hiphop

22
2017-11-15 05:42



Nog een andere benadering ...

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

... en toch nog een andere.

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

18
2018-03-18 08:24



Als je iets als een onderstrepingsteken wilt toevoegen, gebruik dan escape (\)

FILEPATH=/opt/myfile

Dit doet niet werk:

echo $FILEPATH_$DATEX

Dit werkt prima:

echo $FILEPATH\\_$DATEX

18
2017-09-20 19:15