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

エイリアス拡張は、単にテキスト置換とシェルによる別の解析ラウンドです。

入ると

findRoute checkout

まず、次に展開してください。

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

結果は再びシェルコードに解析される。ここのシェルコードは無効です。

ここではスクリプトまたは関数を使用できます。良い:

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

ほとんどの実装はブロック全体を読み取るheadため、3行だけを出力しても3行以上を読み取ることができることに注意してください。headつまり、grep部分は見えません。

sedGNU実装がある場合はhead -n3thisに置き換えることができますsed -u 3qsedここでは、入力は一度に1バイトずつ読み取られ、3番目の改行文字を通過するのを防ぎます。

または、次のものを使用できますawk

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

注意する(Beware)$1は次のように解釈されます。拡大するgrep -E代わりに正規表現(例:for)基本的な1つ(ありますかgrep-E)部分文字列検索(例grep -F:)の場合は、次のように置き換えます。

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

関連情報