我有两个命令。第一个,当存储在脚本变量中时,给出如下输出:
one two three four five
第二个也给出了一个列表,但可能缺少第一个命令中的一些项目:
one three five
如果某个项目在第一个命令中但不在第二个命令中,我希望我的脚本执行某些操作。所有项目都没有空格(它们往往是kabab-format
)。我怎样才能在 Bash 中做到这一点?
一种使用当前变量并依赖于单个值不包含嵌入空格这一事实的方法:
$ var1='one two three four five'
$ var2='one three five'
$ comm -23 <(printf "%s\n" ${var1} | sort) <(printf "%s\n" ${var2} | sort)
four
two
注意:千万不能包裹${var1}
,并${var2}
引用在双引号,即我们要喂养时出现的单词拆分printf
电话
使用关联数组跟踪唯一值的另一个想法:
var1='one two three four five'
var2='one three five'
unset arr
declare -A arr
for f in ${var1} # use ${var1} values as indices for arr[]
do
arr[${f}]=1 # '1' has no meaning other than to fill requirement of assigning a value in order to create the array entry
done
for f in ${var2} # delete ${var2} indices from arr[]
do
unset arr[${f}]
done
for i in "${!arr[@]}" # display arr[] indices that remain
do
echo "${i}"
done
# one-liners (sans comments)
for f in ${var1}; do arr[${f}]=1; done
for f in ${var2}; do unset arr[${f}]; done
for i in "${!arr[@]}"; do echo "${i}"; done
这会产生:
two
four
笔记:
${var1}
,并${var2}
引用在双引号,即,我们希望发生词的拆分awk
脚本中执行相同的添加/删除数组操作arr[]
from ${var1}
)将消除 from 的重复项${var1}
,例如,var1='one one one'
将导致单个数组条目:arr[one]=1
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句