将bash参数连接到带空格的单个字符串中


39

我正在尝试将Bash函数的所有参数连接到一个字符串中,每个参数之间用空格隔开。我还需要使字符串在整个字符串周围包含单引号。

这是我到目前为止所拥有的...

$array=("$@")
str="\'"
for arg in "${array[@]}"; do
    let $str=$str+$arg+" "
done
let $str=$str+"\'"

显然这是行不通的,但是我想知道是否有办法实现这一目标?

Answers:


54

我相信这可以满足您的需求。它将所有参数放在一个字符串中,以空格分隔,并在所有字符串之间加上单引号:

str="'$*'"

$*产生所有脚本参数,以第一个字符分隔$IFS,默认情况下,该参数为空格。

在双引号字符串内,不需要转义单引号。

让我们将以上内容放入脚本文件中:

$ cat script.sh 
#!/bin/sh
str="'$*'"
echo "$str"

现在,使用示例参数运行脚本:

$ sh script.sh one two three four 5
'one two three four 5'

该脚本是POSIX。它可以使用,bash但不需要bash

变体:用斜杠而不是空格连接

我们可以通过调整从空格更改为另一个字符IFS

$ cat script.sh 
#!/bin/sh
old="$IFS"
IFS='/'
str="'$*'"
echo "$str"
IFS=$old

例如:

$ sh script.sh one two three four       
'one/two/three/four'

好的,这很好用,并且确实满足了我的需求。我正在尝试使用此方法仅通过使用参数将目录更改为名称中带有空格的目录。我最终需要这样做的是创建一个函数,该函数将更改目录,而如果目录中的单词之间没有空格,则无需键入撇号。我刚才尝试的内容如下:cdm(){str =“'$ *'” cd $ str}它仅访问str中的第一个参数,例如:cdm test 2结果:'test:无此类文件或目录
Schwagmister

@Schwagmister:您可以根据需要将其保存到(字符串)变量中,但是,如果您不需要这样做,我想cd "$*"就足够了。
斯科特

@Schwagmister单引号在那里没有帮助。试试:cdm(){ str="$*"; cd "$str"; }或如Scott所建议的cdm(){ cd "$*"; }。另外,请注意$*用单个空格替换多个连续的空格。如果您的目录名称可能包含多个连续的空格,制表符或换行符,那么在将这些字符传递给函数之前,确实需要对其进行转义cdm
John1024

因此,如果它类似于测试2试用版1,我将如何使此cd命令正常工作?同样,这是个了不起的帮助,我非常感谢你们。@Scott
Schwagmister

@Schwagmister最好的方法是cdm像那样在调用时在命令行上放置单引号cdm 'test 2 trial 1'。这将处理所有奇怪名称的庄园。但是,只要将空格限制为单个空格,则cdmthen可以运行为cdm test 2 trial 1
John1024

5

它比您想象的要容易:

#!/bin/bash
array="${@}"

echo $array

chmod + x并运行它:

$ ./example.sh --foo bar -b az 
--foo bar -b az
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.