Linux shell脚本,缩短脚本

Linux shell脚本,缩短脚本,linux,shell,Linux,Shell,我有以下脚本: #!/bin/sh cd $2 ls *.$1 | wc -l 我使用:./myct java测试运行它 其中java和test是我传递的参数 一般来说,我最近开始学习shell脚本,我喜欢玩它,所以我想知道是否有可能使这个脚本更短 谢谢这是我所知道的最简短的方法: #!/bin/sh ls $2/*.$1|wc -l 但是,我建议您将重点放在有效输入的可靠性检查和可维护性编写上,以便更清晰,而不是更简洁。考虑如果没有提供参数,将会发生什么,例如;您可能希望显示帮助消息而不是

我有以下脚本:

#!/bin/sh
cd $2
ls *.$1 | wc -l
我使用:./myct java测试运行它

其中java和test是我传递的参数

一般来说,我最近开始学习shell脚本,我喜欢玩它,所以我想知道是否有可能使这个脚本更短


谢谢

这是我所知道的最简短的方法:

#!/bin/sh
ls $2/*.$1|wc -l

但是,我建议您将重点放在有效输入的可靠性检查和可维护性编写上,以便更清晰,而不是更简洁。考虑如果没有提供参数,将会发生什么,例如;您可能希望显示帮助消息而不是错误消息。如果参数中有空格,此脚本也会失败。

如果文件名包含换行符,请参阅和/或您的参数包含全局字符google quoting shell变量,或者您的目录为空google nullglob或不存在,或者。。。使用bash获取当前目录中具有给定扩展名的文件计数的一种可靠方法是:

shopt -s nullglob
arr=( "$2"/*."$1" )
echo "${#arr[@]}"
例如:

$ ls tmp
 1.java   2.java  'a'$'\n''b.java'

$ cat tst.sh
echo "Wrong:"
ls $2/*.$1|wc -l

echo "Right:"
shopt -s nullglob
arr=( "$2"/*."$1" )
echo "${#arr[@]}"

$ ./tst.sh java tmp
Wrong:
4
Right:
3

这些问题更适合我们的情况。坦率地说:不。你的目标永远不应该是让代码尽可能短,而是让代码尽可能可读/bin/sh ls${2}/*.$1|wc-谢谢!为什么会有花括号呢?我可以写$2吗?@MikeL在这里你可以找到一个关于变量附近的括号和引号的好答案。花括号没有任何用处,但是所有的外壳变量/位置参数都必须引用ls$2/*.$1,除非你有一个特定的目的,不加引号,并且完全理解所有的含义和注意事项。但也可以看看为什么你根本不应该这样做。最后-不要命名文件或目录测试,因为这是一个内置命令的名称。好吧,我仍然认为它可能是文件夹中隐藏的文件,所以ls-a而不是ls更好,imho.OP没有提到这个要求。他只是想要一些类似的东西,但要短一些。如果目标目录中的文件名包含换行符,或者脚本参数包含全局字符,那么它也会失败,如果没有匹配的文件,或者。。。。我知道OP想要一种使现有脚本更简洁的方法,但他需要理解,他开始的内容以及任何更简洁的版本都不是一种合理的方法。我可以想出许多可能失败的原因。问题是为了最短的程序,比如一个,为了学习的目的,而不是为了制作一个健壮的程序。我指出了这一点,然后回答了问题。扩大问题的范围是不适当的。