从Unix中读取文件时出错

时间:2015-11-18 08:37:22

标签: bash unix

我是Unix新手,需要某些代码的帮助 我的if条件很奇怪。

假设我的数据如下 -

name1 place1 date1
name2 place2 date2
name3 place3 date3
name4 place4 date4
name5 place5 date5

这就是我最初的做法 -

SRC_PATH="/app/Informatica9.5.1/server/infa_shared/0149icadd/SrcFiles"
rm -f temp_con_total
cat $SRC_PATH/Control_Total.txt > temp_con_total
echo $SRC_PATH
i=0
while read line 
do
echo $line
if [[[ $i -ge 0 ]]];
then
    file_name=`echo -e $line | cut -d ' ' -f 2`
    file_size=`echo -e $line | cut -d ' ' -f 3`
    file_size=$(( $file_size ))

    actual_size=`cat $SRC_PATH/$file_name | wc -l`
    actual_size=`echo -e $actual_size | cut  -d ' ' -f 1`
    actual_size=$(( $actual_size - 1 ))

    echo $file_name
    echo $file_size
    echo $actual_size
fi  
i=$(( i + 1 ))
done < temp_con_total

在这种情况下,它只给了我前2条记录。

后来,我从if条件中删除了一组括号 -

if [ $i -ge 0 ];

在这种情况下,它只给了我第一行。 后来我把三个括号,如下 -

if [[[ $i -ge 0 ]]];

现在,它确实给了我所有行但是在每行之后它也给了我错误如下:

name1 place1 date1
loop.sh[10]: [[[: not found [No such file or directory]
name2 place2 date2
loop.sh[10]: [[[: not found [No such file or directory]
name3 place3 date3
loop.sh[10]: [[[: not found [No such file or directory]
name4 place4 date4
loop.sh[10]: [[[: not found [No such file or directory]
name5 place5 date5
loop.sh[10]: [[[: not found [No such file or directory]

有人可以帮我这个吗?为什么会这样? loop.sh是我的脚本的名称

我需要输出的是,文件中的所有行如下 -     name1 place1 date1     name2 place2 date2     name3 place3 date3     name4 place4 date4     name5 place5 date5

我想知道打印每一行后为什么会出错? loop.sh[10]: [[[: not found [No such file or directory] 括号的数量如何影响代码?

1 个答案:

答案 0 :(得分:0)

Bash不使用方括号。反正不是括号。它看起来确实如此,但它没有。

有一个名为[的命令(它的名称,一个左括号)与test命令非常相似。该命令采用一系列命令行参数,就像任何其他命令一样,并且它期望最后一个参数将是一个右括号],但是没有完成实际的括号处理。这就是为什么你总是用一个分号;跟随结束括号来完成命令。如果您查看/bin(或/usr/bin?),您会看到/bin/[作为文件存在。

同样,还有一个名为[[的命令(同样,它的名称,两个左括号)。这与[命令的想法相同,但功能略有不同。这个文件通常没有/bin中的文件。

这两个命令都是作为bash内置实现的,为了[的效率,我认为[[必须是,但这不会影响语法。

没有名为[[[的命令,因此&#34;没有这样的文件或目录&#34;。

至于你的脚本,if完全没有意义,因为你测试$i是否大于或等于零,当它无法做到时。我认为这应该做你想要的:

SRC_PATH="/app/Informatica9.5.1/server/infa_shared/0149icadd/SrcFiles"
rm -f temp_con_total
cp $SRC_PATH/Control_Total.txt temp_con_total
echo $SRC_PATH
while read line 
do
    echo $line
    file_name=`echo -e $line | cut -d ' ' -f 2`
    file_size=`echo -e $line | cut -d ' ' -f 3`

    actual_size=`cat $SRC_PATH/$file_name | wc -l | cut  -d ' ' -f 1`
    (( actual_size-- ))

    echo $file_name
    echo $file_size
    echo $actual_size
done < temp_con_total