String 拆分包含'&&';
我有这样一个bash脚本: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&&
#!/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