String 拆分包含'&&';

String 拆分包含'&&';,string,bash,split,ampersand,String,Bash,Split,Ampersand,我有这样一个bash脚本: #!/bin/bash params="path=/me & you/folder/file.json&&user=Bob" splitParams=(${params//&&/ }) for i in "${!splitParams[@]}" do echo "$i: ${splitParams[i]}" done params="path=/me & you/folder/file.json&&

我有这样一个bash脚本:

#!/bin/bash

params="path=/me & you/folder/file.json&&user=Bob"
splitParams=(${params//&&/ })

for i in "${!splitParams[@]}"
do
    echo "$i: ${splitParams[i]}"
done
params="path=/me & you/folder/file.json&&user=Bob"
while IFS=  read -r -d $'\0'
do
  splitParams+=("$REPLY")
done < <(echo "${params}" | awk -F'&&' '{ for (i=1;i<=NF;i++) printf("%s\0",$i); }')

for i in "${!splitParams[@]}"
do
    echo "$i: ${splitParams[i]}"
done
它产生:

0: path=/me
1: &
2: you/folder/file.json
3: user=Bob
但当我在shell中键入em时:

➜  params="path=/me & you/folder/file.json&&user=Bob"
➜  splitParams=(${params//&&/ })
➜  echo $splitParams
path=/me & you/folder/file.json user=Bob
0: path=/me & you/folder/file.json
1: user=Bob
我希望脚本的输出类似于我在shell中键入时的输出:

➜  params="path=/me & you/folder/file.json&&user=Bob"
➜  splitParams=(${params//&&/ })
➜  echo $splitParams
path=/me & you/folder/file.json user=Bob
0: path=/me & you/folder/file.json
1: user=Bob

您可以使用类似以下内容:

#!/bin/bash

params="path=/me & you/folder/file.json&&user=Bob"
splitParams=(${params//&&/ })

for i in "${!splitParams[@]}"
do
    echo "$i: ${splitParams[i]}"
done
params="path=/me & you/folder/file.json&&user=Bob"
while IFS=  read -r -d $'\0'
do
  splitParams+=("$REPLY")
done < <(echo "${params}" | awk -F'&&' '{ for (i=1;i<=NF;i++) printf("%s\0",$i); }')

for i in "${!splitParams[@]}"
do
    echo "$i: ${splitParams[i]}"
done

echo$splitParams
仅打印第一个元素。使用
declare-p
查看数组中的确切内容:

$ declare -p splitParams
declare -a splitParams=([0]="path=/me" [1]="&" [2]="you/folder/file.json" [3]="user=Bob")
那么,现在如何在
&&
处拆分字符串,而不让空格把事情搞砸呢?好吧,依赖shell来完成这项工作很容易出错。当输入字符串已经包含空格时,将
&&
更改为空格并在空格上拆分会遇到问题

更好的方法是将分隔符更改为换行符。然后,不要使用
array=($string)
$string
分开,而是使用
readarray
这样空格就不会触发拆分,而只触发换行

$ readarray -t splitParams < <(sed 's/&&/\n/g' <<< "$params")
$ declare -p splitParams
declare -a splitParams=([0]="path=/me & you/folder/file.json" [1]="user=Bob")

$readarray-t splitParams<您可以使用awk实现此目的,但请记住,splitParams不能在awk之外访问。我们将使用awk的拆分功能:

拆分([要处理的字符串],[结果数组],[Delimeter])


splitParams=(${params/&&&&/})
首先将所有
&&&&
替换为一个空格,然后将每个空格处的字符串标记化/拆分为一个数组。在脚本和命令行中都会发生同样的情况。直接打印此数组(就像在命令行上那样)将在一行上用一个空格连接所有元素。当然,在数组上循环(就像您在脚本中所做的那样)会将每个元素打印在单独的一行上;执行回显“$i:${splitParams[$i]}”;完成
。顺便说一下,脚本中有一个错误,它应该是
“$i:${splitParams[$i]}”
,而不是
“$i:${splitParams[i]}”
。实际上我的代码中没有使用任何GNU AWK扩展。并且可以与UNIX awk(传统的
 path=/me & you/folder/file.json
  user=Bob