簡體   English   中英

我如何在bash中使用變量作為數組名稱

[英]how can I use a variable as an array name in bash

我目前正在處理一個從stdin接收輸入的腳本,然后將輸入的行逐行加載到數組中以進行進一步處理。 盡管如果直接設置數組名稱,數組可以正常工作,但是當我嘗試使用變量作為數組名稱時,我無法使數組部分正常工作,代碼本身如下:

input=$(</dev/stdin)
# back up the field separator for later
OLDIFS=$IFS
# set the field separator to newline
IFS=$'\n'
# populate an array from that variable, as delimited by the IFS
lines=($input)

這就是我試圖將數組名稱設置為變量的方法

arrayname="something"
eval $arrayname=($input)

但是不幸的是,當我運行它時,出現以下錯誤:

./f.sh: line 53: syntax error near unexpected token `('
./f.sh: line 53: `                      eval $arrayname=($input)'

說完所有這些,我想知道是否有人會知道我能做些什么才能使這項工作正確進行? 謝謝!

除了使用IFS (在您的情況下沒有用)(即使我是IFS的狂熱愛好者,我傾向於僅在必要時使用它!)之外,還有一種更好,更有效的方式將文件加載到陣列。 順便說一句,它並不是很出名:它是命令mapfile (在運行bash的終端中鍵入help mapfile獲取更多信息)。

因此,

mapfile lines

將從標准輸入中讀取並將每行存儲在數組lines 這還將存儲尾隨換行符,因此,如果要修剪它,請使用-t選項:

mapfile -t lines

要打印陣列,每項一行,請使用:

printf '%s\n' "${lines[@]}"

(請注意"${lines[@]}"的引用)。

請注意,使用eval是邪惡的!

您的主要問題是使用變量作為數組名稱。 bash在其他語言中沒有所謂的指針。 如果不使用eval ,將很難使用存儲在變量中的數組名稱(除非您使用一些小技巧)。 但是,正如我已經說過的那樣, eval是邪惡的。 也許您應該花更多的時間來考慮您的設計,可能還有另一種(更好的)方法來實現您想要的目標。

使用間接:

men=(Jack John Joe)
women=(Zoe Zelda Zanna)
gender=women[@]
echo ${!gender}
read -a arr
printf '%s\n' ${arr[@]}

解決方案嗎?

暫無
暫無

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

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