嗨...这里需要一点帮助......
我尝试dir
使用bash脚本在Linux中模拟DOS' 命令.基本上它只是一个ls
带有一些参数和摘要信息的包装命令.这是脚本:
#!/bin/bash # default to current folder if [ -z "$1" ]; then var=.; else var="$1"; fi # check file existence if [ -a "$var" ]; then # list contents with color, folder first CMD="ls -lgG $var --color --group-directories-first"; $CMD; # sum all files size size=$(ls -lgGp "$var" | grep -v / | awk '{ sum += $3 }; END { print sum }') if [ "$size" == "" ]; then size="0"; fi # create summary if [ -d "$var" ]; then folder=$(find $var/* -maxdepth 0 -type d | wc -l) file=$(find $var/* -maxdepth 0 -type f | wc -l) echo "Found: $folder folders " echo " $file files $size bytes" fi # error message else echo "dir: Error \"$var\": No such file or directory" fi
问题是当参数包含星号(*)时,ls
脚本内的行为ls
与提示中给出的直接命令的行为不同.该脚本仅返回第一个文件,而不是返回整个文件列表.请参阅下面的视频,了解实际比较情况.我不知道它为什么会这样.
任何人都知道如何解决它?谢谢.
视频:行动中的问题
更新:
问题已经解决了.谢谢大家的答案.现在我的脚本按预期工作了.观看视频:http://i.giphy.com/3o8dp1YLz4fIyCbOAU.gif
*
在解析命令行时,shell会扩展星号.换句话说,您的脚本没有获得包含星号的参数,它获取文件列表作为参数.您的脚本仅适用$1
于第一个参数.它应该适用"$@"
.
这是因为检索$1
时假定外壳没有展开*
。
事实上,当*
(或其它水珠)匹配时,其展开,并分成由段$IFS
,然后它被传递$1
,$2
等
如果您仅检索了第一个文件,那么您很幸运。当第一个文件的路径包含空格时,会出现错误,因为您只获得空格之前的第一段。
认真阅读本文章,尤其是本文章。真。
而且请不要做类似的事情
CMD=whatever you get from user input; $CMD;
你乞求麻烦。不要执行用户的任意字符串。