我正在编写一个脚本,以便从标准输入中获取最长和最短的行,但没有成功。
要调用程序,您应该使用以下内容:
LongShort.sh /tmp/filetest.txt
我的脚本目前看起来像这样。
#! /bin/bash LongShort.sh
longest=0
shortest=0
while read line
do
linelength=${#line}
if [ "$linelength" -gt "$longest" ]
then
$longest = $line
$longestlength = $linelength
elif [ "$linelength" -lt "$shortest" ]
then
$shortest = $line
$shortestlength = $linelength
fi
done < $2
echo $longestlength $longest
echo $shortestlength $shortest
有人看到了什么问题吗?
答案 0 :(得分:2)
您的脚本有几个问题:
longest
来存储最长的行,有时使用它来存储最长行 length <name>=<value>
,没有空格。使用左侧的$
符号(通常)是错误的,因为您试图将某些内容分配给存储在变量中的值。因此$longest = $line
之类的行应更改为longest=$line
shortest
初始化为0
,您可以确保永远不会找到最短的行,因为任何行的长度都不会短于0
。您需要将其初始化为至少与文件中最短行一样大的值。编辑:正如你自己指出的那样,最好将循环内部分成两个if
语句来捕获最短行是第一行的情况,或者所有行都是相同的长度。
这是我的版本:
#!/bin/bash LongShort.sh
# use *length variables to store the lengths
longestlength=0
shortestlength=5000 # initialize shortestlength to something big
while read line
do
linelength=${#line}
if [ $linelength -gt $longestlength ];
then
longest=$line # assign values properly
longestlength=$linelength
fi
if [ $linelength -lt $shortestlength ];
then
shortest=$line
shortestlength=$linelength
fi
done < $2
echo $longestlength $longest
echo $shortestlength $shortest
答案 1 :(得分:1)
printf '%s\n' a bb ccc dddd eeeee | awk '
NR==1{long=short=$0;next}
length($0) > length(long){long=$0}
length($0) < length(short){short=$0}
END{print "long=" long "|short=" short}
'
输出:
long=eeeee|short=a