我有一个输入文本文件,如下所示:
# string name | String type (x,y,or z)
name_1 | x
name_2 | y
name_3 | 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。
注意:
任何帮助/解释将不胜感激, 预先感谢
答案 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。