1

我有一个 bash 函数,它接受一个参数,通过 JS Lint 运行它,然后将结果输出到桌面上的文件中。只要您在运行时位于 JS 文件的目录中,它就可以工作。但是,如果您将函数传递给它会阻塞的路径。jslint 是我的函数的名称。例子:

# This works
$ jslint script.js

# This doesn't work
$ jslint ~/dev/project/js/script.js

# Neither does this
$ jslint /Users/Jesse/dev/project/js/script.js

在我的函数中,当我最好使用正则表达式输出它时,我需要使用 $1 并修剪路径。请参阅下面的功能:

function jslint {
    /usr/local/bin/node /usr/share/node-jslint/node_modules/jslint/bin/jslint.js $1 > "~/Desktop/" + $1 + "-lint.txt"
}

这是我正在处理并尝试运行它的项目的示例错误:

-bash: /Users/Jesse/Desktop/Dropbox/dev/ourcityourstory.com/js/script.js-lint.txt: No such file or directory

4

2 回答 2

2

你不需要正则表达式。Bash 支持用于修剪前缀/后缀的简单 glob 模式。这可以用 来完成,它将变量中${1##*/}的所有内容修剪到最后一个。/

具体来说,有4种变体:

  1. ${var#pat}pat其视为 glob 并从 . 中修剪最短匹配前缀var

  2. ${var##pat}视为pat一个 glob 并从 . 中修剪最长的匹配前缀var

  3. ${var%pat}视为pat一个 glob 并从 . 中修剪最短匹配的后缀var

  4. ${var%%pat}视为pat一个 glob 并从 . 中修剪最长的匹配后缀var

在您的具体情况下,您可能想说

function jslint {
    /usr/local/bin/node /usr/share/node-jslint/node_modules/jslint/bin/jslint.js "$1" > "~/Desktop/" + "${1##*/}" + "-lint.txt"
}

(我还引用了变量,如果路径包含空格,这是必需的)

于 2013-03-25T21:48:25.690 回答
1

而不是regex-basename从文件路径参数的最后一个“/”输出字符串呢?

e.g. basename /usr/include/stdio.h  --> stdio.h
于 2013-03-25T21:47:51.333 回答