2017-08-30 58 views
0

我試圖編寫一個腳本讀取一個文件(多行) 這是「#」分開,並將它們放入一個數組中我可以匹配一些值。bash - 如何正確讀取輸入文件中的值在一個數組中

例輸入文件:

us-east#1-1#abcdefg1234Ad 
us-west#1-3#654kjhytgr 
us-east#1-4#lkjhg765 

我想要做的就是通過每行 閱讀並給我根據我的輸入參數($ 1)的比賽。 我被卡住,因爲它只是評估第一行。

這裏是我的代碼:(執行:./myscript.sh美東1-3

#!/usr/local/bin/bash 
set -x 
cluster=$1 

KEY=./.keyfile 

while IFS=# 
declare -a arr=($(< $KEY)); do 
if [[ ${arr[0]}-${arr[1]} == $1 ]]; then 
    echo "We have a match" 
else 
    echo "No match" 
    exit 1 
fi 
done 

set +x 
+0

您可以使用「readarray arr

回答

2

我卡作爲其僅僅只評估第一線。

因爲你else塊你有exit聲明,想如果線路不匹配,循環將被終止由於exit 1,所以進一步的迭代不會發生。

閱讀第一行後,us-east-1-1不等於us-east-1-3,布爾false,所以在你else塊你有exit語句,所以終止

+ cluster=us-east-1-3 
+ KEY=./file 
+ IFS='#' 
+ arr=($(< $KEY)) 
+ declare -a arr 
+ [[ us-east-1-1 == us-east-1-3 ]] 
+ echo 'No match'     
No match 
+ exit 1 

您可以修改像下面這樣你就會少用資源,逐行讀取,而不是讀整個文件到陣列

[[email protected] tmp]$ cat t.sh 
#!/usr/bin/env bash 

set -x 
cluster="$1" 

while IFS=# read -r field1 field2 restother; do 
if [[ "$field1-$field2" == $1 ]]; then 
    echo "We have a match" 
else 
    echo "No match" 
fi 
done < "file" 

set +x 

輸出when cluster=us-east-1-3

[[email protected] tmp]$ bash t.sh us-east-1-3 
+ cluster=us-east-1-3 
+ IFS='#' 
+ read -r field1 field2 restother 
+ [[ us-east-1-1 == us-east-1-3 ]] 
+ echo 'No match' 
No match 
+ IFS='#' 
+ read -r field1 field2 restother 
+ [[ us-west-1-3 == us-east-1-3 ]] 
+ echo 'No match' 
No match 
+ IFS='#' 
+ read -r field1 field2 restother 
+ [[ us-east-1-4 == us-east-1-3 ]] 
+ echo 'No match' 
No match 
+ IFS='#' 
+ read -r field1 field2 restother 
+ set +x 

輸出when cluster=us-west-1-3

[[email protected] tmp]$ bash t.sh us-west-1-3 
+ cluster=us-west-1-3 
+ IFS='#' 
+ read -r field1 field2 restother 
+ [[ us-east-1-1 == us-west-1-3 ]] 
+ echo 'No match' 
No match 
+ IFS='#' 
+ read -r field1 field2 restother 
+ [[ us-west-1-3 == us-west-1-3 ]] 
+ echo 'We have a match' 
We have a match 
+ IFS='#' 
+ read -r field1 field2 restother 
+ [[ us-east-1-4 == us-west-1-3 ]] 
+ echo 'No match' 
No match 
+ IFS='#' 
+ read -r field1 field2 restother 
+ set +x 

您可以使用awk這種類型的宗旨,合理,速度會更快

下面是一些例子

$ cat file 
us-east#1-1#abcdefg1234Ad 
us-west#1-3#654kjhytgr 
us-east#1-4#lkjhg765 

輸出(當cluster="us-east-1-3"

$ awk -F'#' -v cluster="us-east-1-3" '{ print (cluster==$1"-"$2)? "We have a match": "No match"}' file 
No match 
No match 
No match 

輸出(當cluster="us-west-1-3"

$ awk -F'#' -v cluster="us-west-1-3" '{ print (cluster==$1"-"$2)? "We have a match": "No match"}' file 
No match 
We have a match 
No match 
+1

很好的輸入將密鑰文件中的數據讀入數組arr中。我很感激並感謝您使用'awk'顯示另一個解決方案。我可以使用它。 – noober

+0

@noober,歡迎您 –

1

我阿克沙伊同意,這是與AWK解決了良好的問題。但是,如果你真的想單獨殼裏做它,它並不難:

#!/usr/bin/env bash 

cluster="$1" 
keyfile=keyfile.txt 

ret=0 
while IFS='#' read -r one two three; do 
    if [[ "${one}-${two}" = "$cluster" ]]; then 
    echo "match" 
    else 
    echo "no match" 
    ret=1 
    fi 
done < "$keyfile" 

exit $ret 

的主要區別是,這是使用read處理輸入流是交給了while循環,而不是重 - 爲循環的每次運行評估$(< $keyfile)表達式(我期望這會爲每次運行提供第一行)。

+0

修復了我當前的腳本,我會考慮使用'awk'來解決這個問題。謝謝。 – noober

相關問題