Bash 忽略我的条件: if [[ $variable < 10 ]]

Sen*_*ome 2 bash terminal if-statement conditional-statements

我有一个简单的 bash 脚本,其中如果行数低于 10,则文件的内容将复制到文件 A,否则内容将复制到文件 B

这里是代码:

# File A and B are created before, since I'm in a loop
# file content is different each time. I add it either to A or B corresponding the matching.
# I know I could use wc -l directly on the file too but I don't think the problem came from
# it since i've tested both.

let nblines=$(cat file | wc -l)

if [[ $nblines < 10 ]]; then
  cat file >> A
else
  cat file >> B
fi 
Run Code Online (Sandbox Code Playgroud)

问题是这在我的终端和脚本中有效,但并不总是如此。我的目标文件中有内容文件。这是我从 A 和 B 得到的:

# "nombre de ligne" is number of lines

test@test:~$ cat A
7 nombre de lignes
7 nombre de lignes
7 nombre de lignes
5 nombre de lignes
5 nombre de lignes
6 nombre de lignes
6 nombre de lignes
6 nombre de lignes
5 nombre de lignes
5 nombre de lignes
76 nombre de lignes
77 nombre de lignes
test@test:~$ cat B
114 nombre de lignes
102 nombre de lignes
131 nombre de lignes
121 nombre de lignes
121 nombre de lignes
105 nombre de lignes
105 nombre de lignes
120 nombre de lignes
120 nombre de lignes
102 nombre de lignes
102 nombre de lignes
9 nombre de lignes
104 nombre de lignes
104 nombre de lignes
105 nombre de lignes
105 nombre de lignes
102 nombre de lignes
102 nombre de lignes
102 nombre de lignes
102 nombre de lignes
109 nombre de lignes
105 nombre de lignes
105 nombre de lignes
Run Code Online (Sandbox Code Playgroud)

有人知道问题可能来自哪里吗?谢谢阅读。

Tom*_*ech 5

<执行字符串比较。要执行数值比较,请使用-lt

if [ "$nblines" -lt 10 ]; then
Run Code Online (Sandbox Code Playgroud)

是否要使用[[[取决于您(它们应该做同样的事情),但请注意[[POSIX 未指定,因此您的脚本的可移植性会较差。在这种情况下,应该没有必要引用变量,但无论如何这是一个好习惯。

在 bash 中,处理数字时可以使用((and获得更熟悉的语法:))

if (( nblines < 10 )); then
Run Code Online (Sandbox Code Playgroud)

您不需要$在变量名称之前使用,因为在算术上下文中,任何字符都将被假定为引用变量。

顺便问一下,你为什么使用let?尝试一下(也nblines=$(wc -l < file)省去了无用的使用)。cat