这将创建arr[0]=hy, arr[1]="hello man"
:
declare -a arr=(hy "hello man")
我将‘hy“hello man”’作为整个字符串存储在变量中,如下所示:
echo "$var"
hy "hello man"
我怎样才能将其拆分回数组?我试过了IFS= IFS=" " readarray
,但数组只会变成arr[0]="hy "hello man""
而不是arr[0]=hy, arr[1]="hello man"
所需阵列:
arr[0]=hy arr[1]="hello man"
用于测试目的:
arg () { printf "%d args:" "$#"; [ "$#" -eq 0 ] || printf " <%s>" "$@"; echo; }
arg hy "hello man"
2 args: <hy> <hello man>
但
var='hy "hello man"'
arg $t
1 arg: <hy "hello man">
是否有一个引用技巧可以帮助解决我的问题?
如果您
bash
是新手并且拥有loadable_builtins
其中包括dsv
,您可以尝试这样的事情。输出
根据OP要求的输出,修改的功能。
输出
enable -p
应该显示 loadable_builtindsv
help enable
help dsv
关于使用的一些解释
dsv
和替代方法sed
除了Jetchisel 的正确答案之外,还有一些细节。
由于某些安装没有安装内置函数,我发布了一个比
eval
使用更强大的替代方案sed
来解析正确提交的字符串。1.基本用法:
正如之前在其他帖子中评论的那样,
eval
是邪恶的!为了说明这一点,我将使用:然后
是的,对于这种用例,不需要
-S
切换。-g
2. 使用方法
运行后
help dsv
我阅读了很多解释,其中最有用的段落是:缩写:
3.
eval
关于邪恶如果您尝试使用此处发布的其他解决方案之一相同的字符串:
pmf 建议:
然后命令会将我的整个密码文件转储到数组中:
或者 Hamidreza Shafizadeh 建议的其他答案:
将渲染相同的数组!
所以你必须对变量的内容来源有信心!!!
4.替代使用
sed
。如果您没有安装bash-builtins,但仍需要一些安全性,则可以使用
sed
替换每个未用双引号括起来的逗号:4.1.
sed
在函数中使用。4.1b. 相同,清理引文
是的,用双引号括住整个数组声明(包括括号):
这将恢复所需的数组(
$var
但是里面的引号必须在语法上正确):相反,只在变量周围加上引号会将其变成单个元素:
导致“错误”的数组:
经过测试
GNU bash, version 5.2.37(1)-release (x86_64-pc-linux-gnu)
您可以按照 GNU awk 将记录拆分为字段的方式进行操作,
FPAT
方法是循环匹配正则表达式的字符串,该正则表达式要么是非空格的字符串,要么是可以包含空格的带引号的字符串,例如使用所有 bash 内置命令与其他一些答案不同,上面的答案不会扩展中的变量或命令
var
。例如:使用在填充时执行的其他答案注释:
$(date)
arr[]
而这个答案
$(date)
并没有被执行:上面的代码还允许在字符串中通过双击双引号进行转义,其方式与在 CSV 中转义的方式相同:
如果愿意的话,您可以简单地调整代码以将
""
s 转换为"
引号字符串内的 s。您可能还对今天发布的一个非常相似的问题的答案感兴趣 -使用 AWK 将字段捕获到使用空格的数组中,字符串除外。
您可以使用 eval 将字符串评估为数组赋值。
注意:eval 将字符串作为代码执行,因此如果输入不受信任(例如 var='my "Hello world." $(</etc/passwd)'),则可能被利用(感谢F. Hauri)。
输出:
但例如,如果 var 如下:
输出结果如下:
因此,如果您知道 var 中的内容,简单的方法是使用 eval,否则使用其他人建议的其他方法。