我试图将 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 个子问题:
- 连接大批将参数输入到字符串中。
- 将连接的字符串作为 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*
会在扩展过程中将整个数组分组为一个参数。