Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays bash数组名称中的变量_Arrays_Bash - Fatal编程技术网

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