读取文本文件以填充bash中的数组

时间:2018-08-07 14:56:15

标签: bash list

我有一个输入文本文件,如下所示:

# string name           |       String type (x,y,or z)

name_1                  |               x
name_2                  |               y
name_3                  |               z

我想阅读并填写

  • 包含所有字符串名称的全局数组
  • 取决于字符串类型的三个数组(例如 list_x list_y list_z

这是我的剧本:

# Array initialization
list_global=();list_x=();list_y=();list_z=()
# Remove blank lines if there are some
sed -i '/^[[:space:]]*$/d' input_tab.txt
# Reading file
while read line
do
        name=$(echo $line |awk -F "|" '{print $1}'|sed 's/ //g')
        type=$(echo $line |awk -F "|" '{print $2}'|sed 's/ //g')
        # Checking data are correctly read
        printf "%6s is of type %2s \n" "$name" "$type"

        # Appending to arrays
        list_global+=("$name")

        if [ "$type"==x ]
        then
                list_x+=("$name")
        elif [ "$type"==y ]
        then
                list_y+=("$name")
        elif [ "$type"==z ]
        then
                list_z+=("$name")
        fi

done < input_tab.txt
# Print outcome
echo global_list ${list_global[@]}
echo -e "\n \n \n "

echo list_x ${list_x[@]}
echo list_y ${list_y[@]}
echo list_z ${list_z[@]}

这将产生以下输出

name_1 is of type  x
name_2 is of type  y
name_3 is of type  z
global_list name_1 name_2 name_3


list_x name_1 name_2 name_3
list_y
list_z

意味着我的输入文件已正确读取,并且我填充数组的方式有效。 我无法理解为什么它会系统地满足经历的第一个“如果”。如果我首先测试 if [“ $ type” == z] ,那么所有内容都将移至list_z。

注意:

  • 使用开关/案例代替if会导致相同的结果
  • 我运行bash 4.1.2

任何帮助/解释将不胜感激, 预先感谢

2 个答案:

答案 0 :(得分:1)

此代码将解决问题,实际上是语法的问题,我所更改的是if条件而不是:

 relevantOverrides:update val:163390j from relevantOverrides where security = 18767

现在看起来像:

if [ "$type"==x ]

因此,在您的情况下,使用您的语法时,if条件将始终评估为true,这就是为什么将其全部赋予第一个列表的原因。

if [ "$type" == "x" ]

输出将是:

# Array initialization
list_global=();list_x=();list_y=();list_z=()
# Remove blank lines if there are some
sed -i '/^[[:space:]]*$/d' remo.txt
# Reading file
while read line
do
        name=$(echo $line |awk -F "|" '{print $1}'|sed 's/ //g')
        type=$(echo $line |awk -F "|" '{print $2}'|sed 's/ //g')
        # Checking data are correctly read
        printf "%6s is of type %2s \n" "$name" "$type"

        # Appending to arrays
        list_global+=("$name")

        if [ "$type" == "x" ]
        then
                list_x+=("$name")

        elif [ "$type" == "y" ]
        then
                list_y+=("$name")

        elif [ "$type" == "z" ]
        then
                list_z+=("$name")
        fi

done < remo.txt
# Print outcome
echo global_list ${list_global[@]}
echo -e "\n \n \n "

echo list_x ${list_x[@]}
echo list_y ${list_y[@]}
echo list_z ${list_z[@]}

答案 1 :(得分:0)

==必须用空格包围,以便test接收三个单独的参数:"$type"'==''x'。否则,test仅接收一个参数"$type==x",在这种情况下它将测试字符串是否为非空。

编辑:如评论中所述,您可以使用=代替==,其效果相同,但并不特定于Bash。