這是我的 bash 腳本陳述句串列 -
cert_list=$(keytool -list -rfc -keystore /data/cert/mykeystore.jks -storepass mypasswd -noprompt | grep -i 'Entry type:\|Alias name:')
echo "OUTPUT IS:$cert_list"
IFS=$'\n' StringArray=(${cert_list//$'\n'/ })
for val in ${StringArray[@]}; do
echo "##: $val"
done
輸出是 -
Alias name: root
Entry type: trustedCertEntry
Alias name: tomcat
Entry type: PrivateKeyEntry
##: Alias name: root Entry type: trustedCertEntry Alias name: tomcat Entry type: PrivateKeyEntry
我期待回圈輸出像 -
##: Alias name: root
##: Entry type: trustedCertEntry
##: Alias name: tomcat
##: Entry type: PrivateKeyEntry
uj5u.com熱心網友回復:
主要問題是這一行:
IFS=$'\n' StringArray=(${cert_list//$'\n'/ })
該${cert_list//$'\n'/ }部分獲取證書串列,并用空格替換其中的所有換行符,使其全部成為一條長行(并且由于它在換行符上拆分,因此當它作為陣列存盤時,它變成了一個長元素)。
第二個問題是IFS=$'\n'分配是永久性的,以后可能會引起麻煩;最好這樣改IFS后盡快恢復正常。
我建議使用readarray(aka mapfile) 來執行此操作:
readarray -t StringArray <<<"$cert_list"
此外,在回圈 ( for val in ${StringArray[@]}; do) 中,缺少引號意味著陣列的每個元素都將被分詞(并且可能擴展為檔案名通配符)。這碰巧不會在這里造成麻煩,因為IFS它搞砸了,但最好用雙引號正確修復它:
for val in "${StringArray[@]}"; do
uj5u.com熱心網友回復:
- 用于
mapfile將換行符分隔的字串拆分為陣列。 - 不要忘記
${StringArray[@]}用雙引號將陣列變數括起來。
那么請嘗試:
mapfile -t StringArray <<< "$cert_list"
for val in "${StringArray[@]}"; do
echo "##: $val"
done
輸出:
##: Alias name: root
##: Entry type: trustedCertEntry
##: Alias name: tomcat
##: Entry type: PrivateKeyEntry
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/418629.html
標籤:
