我是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]
括号的数量如何影响代码?
答案 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