任何人都可以看看我的bash脚本吗?我试图使用bash脚本查找文件中最长的行,所以我写了这个。
#!/bin/bash
#Francesco Foschi length of a row in a file
let n=0
let max_length=0
while read row
do
length=$(echo -n $row | wc -c)
if[ ${#length} -gt ${#max_length} ]
then
let max_length=${#length}
fi
echo "$n row is $length charachters long"
echo "$row"
let n=n+1
done < $1
echo "longest line is $max_length charachters long"
exit 0
每次尝试运行控制台时,都会说我在意外的 then 标记附近有语法错误。我在做什么错??
fedora28的BTW运行
答案 0 :(得分:2)
尝试一下:
#!/bin/bash
#Francesco Foschi length of a row in a file
let n=0
let max_length=0
while read row
do
length=$(echo -n $row | wc -c)
if [ ${length} -gt ${max_length} ]
then
let max_length=${length}
fi
echo "$n row is $length charachters long"
echo "$row"
let n=n+1
done < $1
echo "longest line is $max_length charachters long"
exit 0
答案 1 :(得分:2)
GNU wc
内置了以下功能:
-L, --max-line-length
print the maximum display width
答案 2 :(得分:1)
普通打击
#!/bin/bash
max=-1
while IFS= read -r line; do
[[ ${#line} -gt $max ]] && max=${#line}
done < "$1"
echo "longest line is $max chars long"
此惯用法用于逐字准确地读取行:IFS= read -r line
演示:
使用前导/后缀空格和反斜杠创建文件
$ echo ' h\bHello ' > file
此文件的大小为10个字节(不计算结尾的换行符)。
用普通的read var
$ read line < file; printf %s "$line" | od -c
0000000 h b H e l l o
0000007
仅7个字符:缺少反斜杠和空格
添加-r
选项以供读取:
$ read -r line < file; printf %s "$line" | od -c
0000000 h \ b H e l l o
0000010
现在我们有8个字符(“ 0000010”为八进制),但仍然缺少空格。
添加IFS=
变量分配:
$ IFS= read -r line < file; printf %s "$line" | od -c
0000000 h \ b H e l l o
0000012
10个字符(八进制12个字符):现在,我们已经确切地将$ line中的内容写到了文件中。
必须一直写IFS= read -r line
是很痛苦的,但是bash给程序员带来了很大的痛苦。