bash - shell字符串拼接空格 - shell循环拼接字符串




如何在Bash中连接字符串变量 (19)

在PHP中,字符串连接在一起如下:

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

在这里, $foo成为“Hello World”。

如何在Bash中完成?


Bash第一

由于这个问题专门针对Bash ,我的第一部分答案会提出不同的方法:

+= :附加到变量

语法+=可以以不同的方式使用:

附加到字符串var+=...

(因为我节俭,我只会使用两个变量fooa然后在整个答案中重复使用相同的。;-)

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

嗯.. 这不是一个bug,而是一个功能 ......为了防止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 :使用builtin命令重构变量

printf builtin命令提供了一种绘制字符串格式的强大方法。 由于这是一个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下,当您在不指定索引的情况下访问变量名时,您始终只能查询第一个元素!

所以要检索我们的七个字段数组,我们只需要重新设置第一个元素:

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

注意:使用双引号可能对操作包含spacestabulations newlines和/或newlines字符串很有用

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

壳牌现在

POSIX shell下,你不能使用bashisms ,因此没有内置的 printf

基本上

但你可以这样做:

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

格式化,使用分叉 printf

如果你想使用更复杂的结构,你必须使用fork (创建作业的新子进程并通过stdout返回结果):

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

从历史上看,您可以使用反引号来检索fork的结果:

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

Bash还支持+ =运算符,如以下脚本所示:

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

以下是大多数答案所讨论的简明摘要。

假设我们有两个变量:

a=hello
b=world

下表解释了我们可以组合ab的值来创建新变量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, 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用双引号括起来通常是一种很好的做法,尽管在许多情况下它是非常可选的
  • 如果以小增量构造一个大字符串,尤其是在循环中,从性能角度来看, +=更好
  • 在变量名称周围使用{}来消除其扩展的歧义(如上表中的第2行)

也可以看看:


你也可以这样做:

$ var="myscript"

$ echo $var

myscript


$ var=${var}.sh

$ echo $var

myscript.sh

又一种方法......

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

......还有一个。

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

如果你想追加下划线之类的东西,请使用escape(\)

FILEPATH=/opt/myfile

这不起作用:

echo $FILEPATH_$DATEX

这很好用:

echo $FILEPATH\\_$DATEX

如果您要做的是将字符串拆分为多行,则可以使用反斜杠:

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

中间有一个空格:

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

这个也只增加了一个空格:

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

引号最简单的方法:

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

您可以尝试以下方式。 当替换发生时,双引号将保留空格。

var1="Ram "    
var2="Lakshmana" 
echo $var1$var2
or 
echo var1+=$var2 "bash support += operation.

bcsmc2rtese001 [/tmp]$ var1="Ram "  
bcsmc2rtese001 [/tmp]$ var2="Lakshmana"  
bcsmc2rtese001 [/tmp]$ echo $var1$var2  
Ram Lakshmana  

bcsmc2rtese001 [/tmp]$ var1+=$var2  
bcsmc2rtese001 [/tmp]$ echo $var1  
Ram Lakshmana

我想从列表中构建一个字符串。 无法找到答案,所以我在这里发布。 这是我做的:

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

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

echo ${string}

然后我得到以下输出:

1 2 3 4 5

我更喜欢使用大括号${}来扩展字符串中的变量:

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

卷曲括号适合连续字符串使用:

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

否则使用foo = "$fooWorld"将无法正常工作。


我有点像快速功能。

#! /bin/sh -f
function combo() {
    echo [email protected]
}

echo $(combo 'foo''bar')

另一种给猫皮肤的方法。 这次有功能:D


我还不了解PHP,但这适用于Linux Bash。 如果您不想将其影响到变量,可以尝试这样做:

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

>Hello World!

你可以放置另一个变量而不是'Hello'或'!'。 您也可以连接更多字符串。


更安全的方式:

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

包含空格的字符串可以成为命令的一部分,使用“$ XXX”和“$ {XXX}”来避免这些错误。

另外看看关于+ =的其他答案


请注意,这不起作用

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

因为它似乎放弃了$ foo并离开你:

PREFIX_WORLD

但这会奏效:

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

并留下正确的输出:

PREFIX_HELLO_WORLD


这是通过AWK的一个:

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

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

会输出

helloohaikthxbye

$blaohai导致变量未找到错误时,这很有用。 或者如果字符串中有空格或其他特殊字符。 "${foo}"正确地逃脱了你投入的任何东西。


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


var1='hello'
var2='world'
var3=$var1" "$var2 
echo $var3




string-concatenation