当我运行 bash 脚本时,数字变量出现在目录中

当我运行 bash 脚本时,数字变量出现在目录中

我已经在目录中编写了 Bash 脚本。当我运行它然后运行“ls”时,目录级别中会出现一个数字,然后我必须使用“rm”将其删除。

该 Bash 脚本的目的是将当前文件保存在目录中,然后logstore.txt获取存储的旧行数,numlines.txt然后找到分配给该文件的新行数numlines.txt,最后获取新行数与旧行数进行比较(服务器正在随着时间的推移添加新文件(如果您猜不出来),然后我对新旧行长度进行比较。

这是 .sh 文件中的代码。

ls /home/vcm > /home/vcm/logstore.txt
oldnumlines=$(cat /home/vcm/numlines.txt)
#log store takes the new ls of items and stores it as num lines after the old v$
cat logstore.txt | wc -l > /home/vcm/numlines.txt

newnumlines=$(cat /home/vcm/numlines.txt)

if [ ! "$newnumlines" > "$oldnumlines" ]
#[ "$a" -eq "$b" ]
#(( "$newnumlines" -le "$oldnumlines" ))
 then
   *do something*
 fi

为什么这个脚本要在目录中创建新变量?

答案1

以下是如何调试此类内容。我有你的脚本的简化版本。

$ cat var_dumper.bash
#!/bin/bash

var1=1
var2=2

if [ ! "$var1" > "$var2" ]; then
   echo "I'm inside the if/then"
fi

我们运行它:

$ ./var_dumper.bash
$ ls
var_dumper.bash  2

所以我们可以看到你2显示为一个文件。那是你的问题。

调试

为了调试 shell 脚本,我总是从-x切换到 Bash 开始。您可以像这样运行脚本:

$ bash -x ./var_dumper.bash
+ var1=1
+ var2=2
+ '[' '!' 1 ']'

这告诉我们它的失败之处。条件if。那么这有什么问题呢?那么第一个线索应该是>.在 Bash 的其他用法中,这是一个重定向运算符,因此这可能会生成正在写入的文件。

因此,让我们将您的示例重新编写为单个可执行文件:

$ var1=1 var2=2 [ "$var1" > "$var2" ] && echo success || echo failure
success

下一个线索应该是,为什么它返回成功,1 不大于 2。所以我们谷歌一下,我们发现要在 Bash 中比较整数,你不使用运算符>,你实际上应该使用这个运算符: -gt

$ var1=1 var2=2 [ "$var1" -gt "$var2" ] && echo success || echo failure
failure

既然你最初希望它被否定,我们可以把它放!回去:

$ var1=1 var2=2 [ ! "$var1" -gt "$var2" ] && echo success || echo failure
success

它有效。所以你更正后的if陈述将如下所示:

if [ ! "$var1" -gt "$var2" ]; then
   echo "I'm inside the if/then"
fi

那么出了什么问题>

在您的场景中您正在使用if [ .... ].这种形式的 if/then 是 POSIX 兼容版本。这个不支持>运营商。支持的形式是这样的,if [[ .... ]]。双括号版本功能更强大扩展测试命令。

所以作为替代方案:

$ cat var_dumper.bash
#!/bin/bash

var1=1
var2=2

if [[ ! "$var1" > "$var2" ]]; then
   echo "I'm inside the if/then"
fi

也可以工作:

$ bash -x var_dumper.bash
+ var1=1
+ var2=2
+ [[ ! 1 > 2 ]]
+ echo 'I'\''m inside the if/then'
I'm inside the if/then

参考

答案2

不使用>在数字测试中。因为它是一个重定向运算符。

他的执行始终为真(如果文件被写入):

$ if [ 2 > 30000 ]; then echo OK; else echo NO; fi
OK
$ ls
$ 30000
$ rm 30000

并且写入了30000个文件。

没有进行数字测试,而是进行了文件写入,返回 true

$ mkdir tmp
$ chmod -w tmp
$ cd tmp
$ if [ 2 > 30000 ]; then echo OK; else echo NO; fi
-bash: 30000: Permission non accordée
NO
$ cd ..
$ rmdir tmp

使用-gt:

$ if [ 2 -gt 30000 ]; then echo OK; else echo NO; fi
NO
$ ls

相关内容