首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在终端中找到工作,但在bash脚本中失败

在终端中找到工作,但在bash脚本中失败
EN

Stack Overflow用户
提问于 2014-09-22 22:24:36
回答 2查看 378关注 0票数 0

因此,我正在编写一个bash脚本,它计算目录中的文件数量,并输出一个数字。函数接受一个目录参数和一个可选的文件类型扩展参数。

我使用以下行将dir变量设置为目录,将ext变量设置为表示要计数的所有文件类型的正则表达式。

代码语言:javascript
复制
dir=$1
[[ $# -eq 2 ]] && ext="*.$2" || ext="*"

当我试图运行以下行时,会遇到问题:

代码语言:javascript
复制
echo $(find $dir -maxdepth 1 -type f -name $ext | wc -l)

当我提供第二个文件类型参数时,从终端运行脚本可以工作,但如果不运行,则会失败。

代码语言:javascript
复制
harrison@Luminous:~$ bash Documents/howmany.sh Documents/ sh
3
harrison@Luminous:~$ bash Documents/howmany.sh Documents/
find: paths must precede expression: Desktop
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
0

我已经搜索了这个错误,并且我知道这是一个问题,因为shell扩展了我的通配符,解释了here。我试过用单引号、双引号和反斜杠来逃避星号,但似乎没有效果。特别有趣的是,当我尝试通过终端直接运行它时,它运行的非常好。

代码语言:javascript
复制
harrison@Luminous:~$ echo $(find Documents/ -maxdepth 1 -type f -name "*" | wc -l)
6
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-22 22:51:19

简化:

代码语言:javascript
复制
dir=${1:-.}           #if $1 not set use .
name=${2+*.$2}        #if $2 is set use *.$2 for name
name=${name:-*}       #if name still isnt set, use *

find "$dir" -name "$name" -print   #use quotes

代码语言:javascript
复制
name=${2+*.$2}        #if $2 is set use *.$2 for name
find "${1:-.}" -name "${name:-*}" -print   #use quotes

另外,正如约翰·库格曼所说,你可以使用:

代码语言:javascript
复制
 name=${2+*.$2}
 find "${1:-.}" ${name:+-name "$name"} -print

find . -name "*" -printfind . -print相同,所以如果没有设置$name,就不需要指定-name "*"

票数 4
EN

Stack Overflow用户

发布于 2014-09-22 22:37:10

试试这个:

代码语言:javascript
复制
dir="$1"
[[ $# -eq 2 ]] && ext='*.$2' || ext='*'

如果这不起作用,您可以切换到一个if语句,在该语句中,在分支中使用-name模式,而在另一个分支中不使用。

还有几点:

  • 这些不是正则表达式,而是shell模式。
  • echo $(命令)只相当于命令。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25984005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档