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

时间:2014-09-22 22:24:37

标签: regex linux bash

所以我正在编写一个bash脚本,它计算目录中的文件数并输出一个数字。该函数采用目录参数以及可选的文件类型扩展参数。

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

dir=$1
[[ $# -eq 2 ]] && ext="*.$2" || ext="*"

当我尝试运行以下行时,遇到了我遇到的问题:

echo $(find $dir -maxdepth 1 -type f -name $ext | wc -l)

当我提供第二个文件类型参数时,从终端运行脚本,但是当我没有提供时,它会失败。

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所述。我尝试使用单引号,双引号和反斜杠来逃避星号,但似乎没有任何效果。特别有趣的是,当我尝试直接通过终端运行时,它的工作非常好。

harrison@Luminous:~$ echo $(find Documents/ -maxdepth 1 -type f -name "*" | wc -l)
6

2 个答案:

答案 0 :(得分:4)

简化为:

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

name=${2+*.$2}        #if $2 is set use *.$2 for name
find "${1:-.}" -name "${name:-*}" -print   #use quotes

另外,正如@John Kugelman所说,你可以使用:

 name=${2+*.$2}
 find "${1:-.}" ${name:+-name "$name"} -print

find . -name "*" -printfind . -print相同,因此如果未设置$name,则无需指定-name "*"

答案 1 :(得分:0)

试试这个:

dir="$1"
[[ $# -eq 2 ]] && ext='*.$2' || ext='*'

如果这不起作用,您只需切换到if语句,在分支中使用-name模式,而在另一个模式中则不使用。{/ p>

还有几点:

  • 那些不是正则表达式,而是 shell模式
  • echo $(命令)等同于命令