我有兩個命令。第一個,當存盤在一個腳本變數中時,會有這樣的輸出:
one two three four five
第二條也給出了一個串列,但可能缺少第一條命令中的一些專案:
第二條也給出了一個串列,但可能缺少第一條命令中的一些專案。
one three five
我想讓我的腳本在第一條命令中有一個專案,但在第二條命令中沒有的情況下做一些事情。沒有一個專案會有空格(它們往往是kabab-format)。我怎樣才能在Bash中做到這一點?
uj5u.com熱心網友回復:
關于我的評論[1],我會像這樣處理:
- 在
上進行回圈。- 在
res1上回圈。- 如果當前值不存在于
res2中- 執行動作
- 如果需要,停止
for。
- 在
#!/bin/bash
res1=(一二三四五)
res2=(一三五)
for value in "${res1[@]}"; do>
if [[ ! "${res2[*]}" =~ "${value}">]; then
# Do action
echo "'$value' 不存在于res2"。
# Possibly stop for loop
break
fi
done
隨著break,這將顯示:
'two' does not exist in res2
如果沒有break,它將顯示:
'two' does not exist in res2
'四'不存在于res2中
uj5u.com熱心網友回復:
一種方法是使用當前的變數,并依靠單個值不包含嵌入的白色空間的事實:
$ var1='one two three four five'。
$ var2='one three five'printf "%s
" ${var1} | sort) <(printf "%s
" ${var2} | sort)
四
二
注意:不要將${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[]/span>
do
arr[${f}]=1 # '1'沒有任何意義,只是為了滿足賦值的要求,以便創建陣列條目。
完成了。
for f in ${var2} # delete ${var2} indices from arr[]/span>
do
unset arr[${f}]
done[/span>]
for i in "${!arr[@]} # display arr[] indices that remain
do
echo "${i}"/span>
done
# one-liners(無注釋)
for f in ${var1}; do arr[${f}]=1; done[/span
for f in ${var2}; do unset arr[${f}]; done[/span
for i in "${! arr[@]}"; do echo "${i}"; done
這就產生了:
two
四
注釋:
- 還是那句話,不要用雙引號包住
${var1}和${var2}的參考,即我們希望發生分詞 。
- 如果愿意的話,OP可以在一個
awk腳本中執行相同的添加/洗掉陣列操作 。
- 第一個回圈(從
${var1}中填充arr[])將消除${var1}中的重復部分,例如,var1='one one one'將導致一個單一的陣列條目。arr[one]=1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/308013.html
標籤:
