我有一个简单的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
问题是这个工作在我的终端和脚本中但并非总是如此。我有错误的目标文件中的内容文件。这是我从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
有人知道问题可能来自哪里吗? 谢谢你的阅读。
答案 0 :(得分:4)
<
执行字符串比较。要执行数字比较,请使用-lt
:
if [ "$nblines" -lt 10 ]; then
您是否要在此使用[[
或[
(他们应该这样做),但请注意,POSIX未指定[[
,因此您需要脚本将不那么便携。在这种情况下,没有必要引用你的变量,但这是一个很好的习惯。
在bash中,您可以在处理数字时使用((
和))
获得更熟悉的语法:
if (( nblines < 10 )); then
您不需要在变量名之前使用$
,因为在算术上下文中,任何字符都将被假定为引用变量。
顺便问一下,你为什么要使用let
?试试nblines=$(wc -l < file)
(同时保存对cat
无用的使用)。
答案 1 :(得分:1)
在-lt
if
let nblines=$(cat file | wc -l)
if [[ $nblines -lt 10 ]]; then
cat file >> A
else
cat file >> B
fi
答案 2 :(得分:0)
尝试:
if [ $nblines -lt 10 ]; then
答案 3 :(得分:0)
为什么不
[[ $(wc -l < file) -lt 10 ]] && cat file >> A || cat file >> B
或
[[ $(wc -l < file) -lt 10 ]] && x=A || x=B
cat file >> "$x"