簡體   English   中英

Bash 腳本 - 變量連接

[英]Bash Scripting - Variable Concatenation

對 Linux 和 Bash 腳本完全陌生,我一直在嘗試以下腳本:

declare -a names=("Liam" "Noah" "Oliver" "William" "Elijah")
declare -a surnames=("Smith" "Johnson" "Williams" "Brown" "Jones")
declare -a countries=()
readarray countries < $2
i=5
id=1
while [ $i -gt 0 ]
do
  i=$(($i - 1))
  rname=${names[$RANDOM % ${#names[@]}]}
  rsurname=${surnames[$RANDOM % ${#surnames[@]}]}
  rcountry=${countries[$RANDOM % ${#countries[@]}]}
  rage=$(($RANDOM % 5))
  record="$id $rname $rsurname $rcountry"
  #record="$id $rname $rsurname $rcountry $rage"
  echo $record
  id=$(($id + 1))
done

上面的腳本產生以下結果:

1 Liam Williams Andorra
2 Oliver Jones Andorra
3 Noah Brown Algeria
4 Liam Williams Albania
5 Oliver Williams Albania

但是當行record="$id $rname $rsurname $rcountry"注釋並且行record="$id $rname $rsurname $rcountry $rage"處於活動狀態時,問題變得明顯,其中第二次執行的確切 output 是:

 4William Johnson Albania
 2Elijah Smith Albania
 2Oliver Brown Argentina
 0William Williams Argentina
 3Oliver Brown Angola

我正在讀取國家/地區的文件如下所示:

Albania
Algeria
Andorra
Angola
Argentina

你能解釋一下為什么會發生這種情況嗎?

您的國家/地區輸入文件具有 DOS 樣式的<cr><lf> (回車換行)行結尾。

當您從文件中讀取行時, countries數組的每個元素最終看起來像somename<cr> ,並且在打印時<cr>將 cursor 移回行首,因此$rage的內容最終被覆蓋行的開頭。

解決方法是將您的國家/地區輸入轉換為使用 Unix 樣式(僅限<lf> )行尾。 例如,您可以使用dos2unix <inputfile> > <outputfile>來執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM