繁体   English   中英

如何将所有命令参数放在一个变量中

[英]how to put all command arguments in one variable

我想执行一个需要3个参数的Shell脚本。

参数编号2包含带空格的字符串

我想将所有参数放在这样的一个变量中:

Linux:~# kk="\"111\" \"222 222\" \"333\""
Linux:~# echo $kk
"111" "222 222" "333"

现在,如果我调用一个函数:

func() {
  echo ---$1---
  echo ---$2---
  echo ---$3---
}

用$ kk变量以这种方式

func $kk

然后它将返回

Linux:~# func $kk
---"111"---
---"222---
---222"---

我期待得到这个结果

---111---
---222 222---
---333---

如何在不使用eval情况下解决此问题?

我知道eval解决了这个问题,但是我不想使用它(因为如果我多次执行这样的调用会花费时间)。

OP最初标记了问题 ,然后删除了该标记。 请参阅Charles Duffy的绝佳答案,以获取POSIX shell解决方案! 下面的解决方案使用数组,仅适用于


您不应该将数据放在这样的字符串中,而应该放在array中 顺便说一句,您在函数中缺少一些引号:

func() {
    echo "---$1---"
    echo "---$2---"
    echo "---$3---"
}

或更好( printf最好是echo ):

func() {
    printf -- '---%s---\n' "$1"
    printf -- '---%s---\n' "$2"
    printf -- '---%s---\n' "$3"
}

$ kk=( "111" "222 222" "333" )
$ func "${kk[@]}"

会愉快地打印:

---111---
---222 222---
---333---

您甚至可以在参数中包含换行符等:

$ kk=( $'one\none' "222 222" $' *   three\nthree' )
$ func "${kk[@]}"
---one
one---
---222 222---
--- *   three
three---

如果功能(如数组)没有使bash比POSIX sh更具表现力,则没有理由添加它们。 :)

也就是说,您可以通过根据需要覆盖"$@"来解决此问题:

set -- 111 "222 222" 333
printf '%s\n' "$@"

...将打印...

111
222 222
333

如果你需要建立一个脚印的参数列表步骤中,可以多次调用set"$@"作为第一个参数(请务必遵循引号!):

set -- 111
set -- "$@" "222 222"
set -- "$@" 333
printf '%s\n' "$@"

...将打印...

111
222 222
333

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM