bash:意外标记“foo”附近出现语法错误

bash:意外标记“foo”附近出现语法错误

为了简单起见,我尝试使用别名来指定一个命令:

php artisan route:list | (head -n 3; grep checkout)

该命令显示该表的标题并搜索路线。结果如下:

+--------+----------+--------------------------------------------+----------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+
| Domain | Method   | URI                                        | Name                                               | Action                                                                        | Middleware                                           |
+--------+----------+---------------------------------------------+----------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+
|        | POST     | profile/auctions/checkout                  | user-portal-profile-auctions-checkout              | xxxxxxxxxxxxxxxx                   | web,auth                                             |
|        | POST     | profile/deals/checkout                     | user-portal-profile-deals-checkout                 | xxxxxxxxxxxxxx                     | web,auth                                             |
|        | POST     | profile/quotes/checkout                    | user-portal-profile-quotes-checkout                | xxxxxxxxxxxxxxx                    | web,auth                                             |

这就是我的~/.bash_profile

alias findRoute='php artisan route:list | (head -n 3; grep $1)'

但我不断收到此错误:

bash: syntax error near unexpected token `checkout'

是什么赋予了?为什么它不接受我的论点?

我尝试在我传递的参数中使用单引号和双引号。

我尝试在别名中使用单引号和双引号。没有什么变化。

答案1

别名扩展只是文本替换,然后由 shell 进行另一轮解析。

当你进入

findRoute checkout

首先扩展到:

php artisan route:list | (head -n 3; grep $1) checkout

该结果再次被解析为 shell 代码。这里的 shell 代码无效。

您可能想在此处使用脚本或函数。喜欢:

findRoute() {
  php artisan route:list | {
    head -n 3
    grep -e "$1"
  }
}

现在,请注意head可能会读取超过 3 行,即使它只输出 3 行,因为大多数head实现都是通过整个块读取的。这意味着grep看不到那部分。

如果您sed是 GNU 实现,则可以替换head -n3sed -u 3qsed其中一次读取输入一个字节,以免读取超过第三个换行符。

或者,您可以使用awk

findRoute() {
  php artisan route:list |
    PATTERN=$1 awk 'NR <= 3 || $0 ~ ENVIRON["PATTERN"]'
}

Beware$1然后被解释为扩展正则表达式(如 for grep -E)而不是基本的一个(有grep没有-E)。对于子字符串搜索(如grep -F),替换为:

findRoute() {
  php artisan route:list |
    PATTERN=$1 awk 'NR <= 3 || index($0, ENVIRON["PATTERN"])'
}

相关内容