我承认以前这里也问过类似的问题,但我见过的所有问题都比我想要实现的要简单。最好只使用 Bash 的解决方案。
我有一个变量,其中包含一个看起来像某种比较的字符串,我想将其拆分为一个数组。以下是一些示例,包括我希望如何拆分它们:
var='name="value"' # arr=([0]=name [1]='=' [2]=value)
var="name != '!value='" # arr=([0]=name [1]='!=' [2]='!value=')
var='"na=me" = value' # arr=([0]=na=me [1]='=' [2]=value)
var='name >= value' # arr=([0]=name [1]='>=' [2]=value)
var='name' # arr=([0]=name)
var='name = "escaped \"quotes\""' # arr=([0]=name [1]='=' [2]=escaped\ \"quotes\")
var="name = \"nested 'quotes'\"" # arr=([0]=name [1]='=' [2]=nested\ \'quotes\')
var="name = 'nested \"quotes\"'" # arr=([0]=name [1]='=' [2]=nested\ \"quotes\")
您明白了吧。两边(或两边都不用)都可以用单引号或双引号引起来。可能会有转义引号或嵌套引号。它们之间的运算符可以是预定义的任何集合,但它们也可以包含在带引号的字符串中。可能有空格,也可能没有空格。可能根本没有运算符。
我必须解析很多行,因此我不想每次都派生出一个新进程,这就是为什么我更喜欢只使用 Bash 的解决方案。这是对现有 Bash 脚本的补充,不需要移植到其他 shell,并且它在 Bash 5.2 上运行,所以我可以使用可能有用的现代 Bash 功能。
IFS=\" read -a arr <<<"$var"
很好,因为它知道如何处理转义引号,如果我只需要处理单引号或双引号而不是两者,我就可以让它工作。就目前而言,我只是希望我不必在 shell 脚本中编写整个标记器算法,并且有一些我尚未考虑过的功能组合可以可靠地解析它。