当前位置:  开发笔记 > 编程语言 > 正文

如何将星号传递给bash脚本中的ls命令

如何解决《如何将星号传递给bash脚本中的ls命令》经验,为你挑选了2个好方法。

嗨...这里需要一点帮助......

我尝试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



1> choroba..:

*在解析命令行时,shell会扩展星号.换句话说,您的脚本没有获得包含星号的参数,它获取文件列表作为参数.您的脚本仅适用$1于第一个参数.它应该适用"$@".



2> Cong Ma..:

这是因为检索$1时假定外壳没有展开*

事实上,当*(或其它水珠)匹配时,其展开,并分成由段$IFS,然后它被传递$1$2

如果您仅检索了第一个文件,那么您很幸运。当第一个文件的路径包含空格时,会出现错误,因为您只获得空格之前的第一段。

认真阅读本文章,尤其是本文章。真。


而且请不要做类似的事情

CMD=whatever you get from user input; $CMD;

你乞求麻烦。不要执行用户的任意字符串。

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有