Arrays bash数组名称中的变量
我有以下代码:Arrays bash数组名称中的变量,arrays,bash,Arrays,Bash,我有以下代码: #!/bin/sh ... for cnumber in `seq $CNUMBER`; do declare -a CAT$cnumber let i=0 while IFS=$'\n' read -r line_data; do CAT$cnumber[i]="${line_data}" ((++i)) done < input_file_$cnumber done #/垃圾箱/垃圾箱 ... 对于'
#!/bin/sh
...
for cnumber in `seq $CNUMBER`; do
declare -a CAT$cnumber
let i=0
while IFS=$'\n' read -r line_data; do
CAT$cnumber[i]="${line_data}"
((++i))
done < input_file_$cnumber
done
#/垃圾箱/垃圾箱
...
对于'seq$cnumber'中的cnumber;做
声明-一只猫$cnumber
设i=0
而IFS=$'\n'读取-r行\u数据;做
类别$cnumber[i]=“${line_data}”
(++i))
完成
如果我使用不带变量$cnumber的数组名,它就会工作
但我想创建多个阵列(CAT0、CAT1、CAT2等)并读取行:
从文件“输入文件”到数组“CAT0”从文件“输入文件”到数组“CAT1”
从文件“输入文件”到数组“CAT2”
等等 在数组名(CAT1)和输入文件名中使用
$cnumber
变量的语法是什么
for cnumber in `seq $CNUMBER`; do
declare -a CAT$cnumber
let i=0
while IFS=$'\n' read -r line_data; do
eval CAT$cnumber[i]='"${line_data}"'
((++i))
done < input_file_$cnumber
done
在回答下面的Etan Reisner的评论时,我添加了另一个避免“eval”的解决方案,而是使用bash 4.3版或更高版本中提供的引用。在这种情况下,出于Etan指出的原因,以及我的观点,使用参考文献更为可取,因为它更为自然:
for cnumber in `seq $CNUMBER`; do
declare -a CAT$cnumber # be sure the array is declared before ...
declare -n ref=CAT$cnumber # ... you declare ref to reference the array
let i=0
while IFS=$'\n' read -r line_data; do
ref[$i]="${line_data}"
((++i))
done < input_file_$cnumber
done
用于'seq$cnumber'中的cnumber;做
declare-CAT$cnumber#确保在。。。
声明-n ref=CAT$cnumber#。。。您可以声明ref来引用数组
设i=0
而IFS=$'\n'读取-r行\u数据;做
ref[$i]=“${line_data}”
(++i))
完成
首先,您的shebang需要
#!/bin/bash
因为declare
是一个内置的bash
接下来,使用declare
定义数组元素
for cnumber in `seq $CNUMBER`; do
declare -a CAT$cnumber
let i=0
while IFS=$'\n' read -r line_data; do
declare "CAT$cnumber[$i]=${line_data}"
((++i))
done < input_file_$cnumber
done
用于'seq$cnumber'中的cnumber;做
声明-一只猫$cnumber
设i=0
而IFS=$'\n'读取-r行\u数据;做
声明“CAT$cnumber[$i]=${line_data}”
(++i))
完成
尝试输入数字,即CAT{$cnumber}。让我知道它是否有效我想你的意思是CAT${cnumber}
应该指出,除非非常小心地控制变量,否则使用eval
会带来严重的安全隐患。给出这个代码段,除非CAT###
数组需要在循环之外持久化,否则使用这样的构造变量名可能完全没有意义。此外,此处的间接引用可能也会起作用,而且更安全。
for cnumber in `seq $CNUMBER`; do
declare -a CAT$cnumber
let i=0
while IFS=$'\n' read -r line_data; do
declare "CAT$cnumber[$i]=${line_data}"
((++i))
done < input_file_$cnumber
done