[英]How to use a variable to index ${array[*]} in bash?
首先抱歉,因為我的英語可能不好。 我想使用變量來索引數組中的元素,或者使用相同的變量來索引所有元素。 例如:
...
var1="1"
var2="*"
array=(one two three for five)
for elem in ${array[$var1]}
do
echo $elem
done
當我在$ {array [$ var1]}中使用var1進行索引時,它可以正常工作,但如果我使用var2無法正常工作,我會收到此錯誤:
./ed.sh line XXX *: syntax error: operand expected (error token is "*")
我很確定錯誤與*通配符擴展有關,但我沒有找到幫助我解決這個問題的答案。 那么,我該怎么做呢?
*
和@
不被視為數組中的常規元素。 迭代鍵時不會列出它們,並且在通過索引變量間接擴展時不會考慮它們。
bash 源代碼有一個函數chk_atstar
,用於檢查是否正在使用[@]
或[*]
,你可以看到它是按字面意思完成的,而不是通過任何擴展:
else if (valid_array_reference (name, 0))
{
temp1 = mbschr (name, '[');
if (temp1 && temp1[1] == '@' && temp1[2] == ']')
{
如果你真的想這樣做,你可以通過變量間接:
arr=(one two three)
index='*'
var="arr[$index]"
echo "${!var}"
雖然你可能最好不要試圖將這些特殊的數組訪問模式視為數組元素。
我不建議這樣做,但為了完整起見,您可以通過使用eval
欺騙擴展訂單來實現此目的:
eval items=\${array[$var2]}
for elem in $items
do
echo $elem
done
這有問題。 eval
通常發音為“evil”,因為從變量運行代碼可能會產生安全隱患。 通常有一種比使用eval
更好的方法。 在這種情況下,您應該考慮一下設計。
如果元素包含嵌入的空格,也會出現問題。 加:
array+=('at the end')
陣列聲明后,你會明白我的意思。
編輯:經過一番考慮,這是一種沒有 eval
,它支持嵌入的空格或制表符(但不支持嵌入的換行符)。 漂亮不是:
display_it() {
if [[ $1 = '*' ]]; then
oldIFS="$IFS"
IFS=$'\n'
echo "${array[*]}"
IFS="$oldIFS"
else
echo "${array[$1]}"
fi
}
var1="1"
var2="*"
array=(one two three for five)
array+=('at the end')
while read -r elem
do
echo $elem
done < <(display_it "$var2")
顯示:
one
two
three
for
five
at the end
在循環結束時,您將看到進程替換 ,我調用函數display_it
。 讀取的每個項目由換行符分隔,因此在函數中交換內部字段分隔符( IFS
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.