首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将所有命令参数放在一个变量中

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

Stack Overflow用户
提问于 2015-02-16 21:48:28
回答 2查看 179关注 0票数 2

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

参数2包含一个带空格的字符串

我想将所有参数放在一个变量中,如下所示:

代码语言:javascript
运行
复制
Linux:~# kk="\"111\" \"222 222\" \"333\""
Linux:~# echo $kk
"111" "222 222" "333"

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

代码语言:javascript
运行
复制
func() {
  echo ---$1---
  echo ---$2---
  echo ---$3---
}

以这种方式使用$kk变量

代码语言:javascript
运行
复制
func $kk

然后它就会返回

代码语言:javascript
运行
复制
Linux:~# func $kk
---"111"---
---"222---
---222"---

我希望能得到这样的结果

代码语言:javascript
运行
复制
---111---
---222 222---
---333---

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-02-16 21:56:22

OP最初标记了问题bash,然后删除了该标记。请参考Charles Duffy对POSIX shell解决方案的精彩回答!下面的解决方案使用数组,仅适用于bash

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

代码语言:javascript
运行
复制
func() {
    echo "---$1---"
    echo "---$2---"
    echo "---$3---"
}

或者更好(printfecho更好):

代码语言:javascript
运行
复制
func() {
    printf -- '---%s---\n' "$1"
    printf -- '---%s---\n' "$2"
    printf -- '---%s---\n' "$3"
}

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

将愉快地打印出来:

代码语言:javascript
运行
复制
---111---
---222 222---
---333---

您甚至可以在参数中包含换行符之类的内容:

代码语言:javascript
运行
复制
$ kk=( $'one\none' "222 222" $' *   three\nthree' )
$ func "${kk[@]}"
---one
one---
---222 222---
--- *   three
three---
票数 3
EN

Stack Overflow用户

发布于 2015-02-16 22:01:39

如果特性(如数组)不能使bash比POSIX sh更具表现力,那么就没有理由添加它们。:)

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

代码语言:javascript
运行
复制
set -- 111 "222 222" 333
printf '%s\n' "$@"

...will打印...

代码语言:javascript
运行
复制
111
222 222
333

如果您需要逐步构建参数列表,您可以使用"$@"作为第一个参数来多次调用set (请确保您注意到引号!):

代码语言:javascript
运行
复制
set -- 111
set -- "$@" "222 222"
set -- "$@" 333
printf '%s\n' "$@"

...will打印...

代码语言:javascript
运行
复制
111
222 222
333
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28542911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档