shell - 如何在 Bourne shell 的变量中存储带引号的字符串列表? (没有 Bash 数组)

标签 shell sh busybox quoting ash

使用 Bash's arrays ,我可以将列表存储到数组变量中并迭代元素,同时将包含空格或特殊字符的带引号的字符串保存在一起:

LIST=(--foo --bar --baz "test 1 2 3")
for item in "${LIST[@]}"; do
    echo "$item"
done

输出是:
--foo
--bar
--baz
test 1 2 3

我有一个使用此功能的脚本,但不幸的是需要将其移植以使用 Busybox 的 ash(不支持数组)。我试图找出一种存储列表的好方法,其中某些项目可能会有空格,同时仍然保留列表中正确数量的元素。

这不起作用,例如(错误地将 test 1 2 3 拆分为单独的项目):
LIST='--foo --bar --baz "test 1 2 3"'
for item in $LIST; do
    echo "$item"
done

输出是:
--foo
--bar
--baz
"test
1
2
3"

idea I found on the Busybox mailing list是使用 set --替换位置参数:
set -- --foo --bar --baz "test 1 2 3"
for item in "$@"; do
    echo "$item"
done

输出正确:
--foo
--bar
--baz
test 1 2 3

但是,此构造破坏了此脚本也使用的位置参数列表 ( $@ )。

有没有什么合理的方法可以让我吃蛋糕,也可以吃它,并在非 Bash 中模拟多个任意数组 sh变种?

最佳答案

你可以用 \n 声明一个变量在里面:

list='--foo\n--bar\n--baz\n"test 1 2 3"'

# then iterate it using
echo -e "$list" | while read -r line; do echo "line=[$line]"; done

输出:
line=[--foo]
line=[--bar]
line=[--baz]
line=["test 1 2 3"]

关于shell - 如何在 Bourne shell 的变量中存储带引号的字符串列表? (没有 Bash 数组),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38210226/

相关文章:

parsing - 一种简单的方法来区分日志文件,忽略时间戳?

linux - linux 操作系统如何让应用程序从管道读取

linux按单词过滤php结果并写入文件

c++ - 如何知道我使用的Linux操作系统是否有特定的系统调用?

c - 可执行文件在编译机上运行,​​而不是在第二台机器上运行

android/busybox/termux 测试环境

mysql - 如何使用shell脚本访问mysql数据库?

ruby-on-rails-3 - Heroku 重启 = 找不到资源?

linux - 运行 run.sh 时出错(linux)

linux - 如何使用 bash 将未知数量的源文件名拆分为指定数量的输出文件