这是提示:
编写一个Korn shell脚本(并在此显示它的代码),它将确定目录中哪个文件具有最大行数(这可能与具有最大字节数的文件不同)。在确定具有最大行数的文件后,脚本将打印出文件名和行数。该脚本必须只关注文件并忽略子目录。命令
wc
可能会有所帮助。不要编写此脚本以交互方式执行。要求:
脚本必须允许无参数或1参数。
- 如果指定了零参数,则默认情况下脚本将检查当前目录中的文件。
- 如果指定了1个参数,则参数必须是a的名称 目录。然后,该脚本将检查指定的文件 目录。
醇>脚本必须能够处理以下错误情况:
- 指定了多个参数。
- 指定的参数不是目录。
醇>脚本文件名必须为:
maxlines.sh
。 脚本权限应为705
。
这是我的代码:
#!/bin/ksh
if [ $# -gt 1];then
echo "There must be 0 or 1 arguments"
exit
fi
if [ -d "$1" ];then
cd $#
fi
max=0
for file in *
do
lines=$(( $( wc -l < "$file" ) ))
if [ $max -lt $lines ];then
max=$lines
fi
done
任何建议都将不胜感激。我是Linux的新手,所以这非常令人沮丧。当我运行它时输出如下:
./maxlines.sh[2]: [: ']' missing
./maxlines.sh[9]: cd: 1: [No such file or directory]
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
wc: standard input: Is a directory
答案 0 :(得分:0)
正如@JeremyBrooks已经解释过的那样,你的脚本中有很多错误,但你并没有走错路。
这是我的修复:
#!/bin/ksh
if [ $# -gt 1 ];then
echo "There must be 0 or 1 arguments"
exit
fi
if [ -d "$1" ]
then
cd $1
fi
max=0
for file in $(find . -name "*" -type f)
do
lines=$(( $( wc -l < "$file" ) ))
if [ $max -lt $lines ];then
max=$lines
maxFile=$file
fi
done
echo "file[$maxFile] - max[$max]"
使用for file in $(find . -name "*" -type f)
,您只能获得文件;在您以前的版本中,您还将获得目录,但您想要计算文件行。
防止排除目录的另一种方法是for file in $(ls -l * | grep -v "^d"|awk '{print $9}'
,但这并不像find
那么快。
您在获得最大行号时也忘了保留文件名,因此在if
中您必须添加maxFile=$file
。
然后不要忘记在echo "file[$maxFile] - max[$max]"
之后打印出结果:for
。
答案 1 :(得分:0)
您还可以尝试将命令与管道组合:
wc -l * 2>/dev/null| grep -v total | sort -n | tail -1 | sed -r 's/\s*([0-9]*) (.*)/\2 has \1 lines./'
您仍应处理参数(关于您拥有的参数,但在[
和]
周围的if语句中使用空格)。如何处理没有文件的目录:
output=$(same_command_as_above)
if [ -z "${output}" ]; then ...