我已经在目录中编写了 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