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

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

我试图将 Bash 函数的所有参数连接到一个字符串中,并用空格分隔每个参数。我还需要让字符串在整个字符串周围包含单引号。

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

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

显然这不起作用,但我想知道是否有办法实现这一目标?

答案1

我相信这会达到你想要的效果。它将把所有参数放在一个字符串中,用空格分隔,并用单引号引起来:

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'

答案2

这比你想象的要容易:

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

echo $array

chmod +x ,然后运行它:

$ ./example.sh --foo bar -b az 
--foo bar -b az

答案3

更新 Tl;博士,使用

"'${array[*]}'"

需要明确的是,我无意复制这个答案。我刚刚发现使用@*取消引用数组中的所有值存在细微差别。

在底层,$*$@都是数组,引用 argv 列表。

从问题来看,

我试图将所有论点加入到一个bash函数进入一根单弦每个参数之间用空格分隔。

它有 2 个子问题:

  1. 连接大批将参数输入到字符串中。
  2. 将连接的字符串作为 shell 函数的单个参数传递。

首先,将数组连接成字符串,

array=("$@")
str="'${array[@]}'"
# or
str="'${array[*]}'"
# or
str=\'"${array[*]}"\'

其次,当您传递str给函数时,让我们计算一下函数接收到的参数数量,

#!/usr/bin/env bash

arr=(a b c d)

function count_args() {
  echo '$#' $#
}

count_args "'${arr[@]}'"
count_args \'"${arr[@]}"\'
count_args "'${arr[*]}'"
count_args \'"${arr[*]}"\'

输出是

$# 4
$# 4
$# 1
$# 1

arr[*]将数组包装到 shell 函数的 1 个参数中,为什么?

引用自如何在 bash 脚本中使用数组,我发现这对我有用,

echo ${array[*]}
echo ${array[@]}

两种语法都允许我们访问数组的所有值并产生相同的结果,除非它被引用的扩展。在这种情况下会出现差异:在第一种情况下,当使用 @ 时,扩展将为数组的每个元素生成一个单词。

而 using*会在扩展​​过程中将整个数组分组为一个参数。

相关内容