1. ホーム
  2. shell

[解決済み] awk で複数の引数を shebang (つまり #!) で使うには?

2022-07-21 20:48:21

質問

私は ゴーク スクリプトを --re-interval を使ってシバキます。の "naive"なアプローチ。

#!/usr/bin/gawk --re-interval -f
... awk script goes here

は動作しません。なぜなら、gawk は最初の引数 "--re-interval -f" (空白の周りで分割されていない) で呼び出されるため、gawk はそれを理解できません。これを回避する方法はありますか?

もちろん、gawkを直接呼び出さず、第一引数を分割するシェルスクリプトに包むか、シェルスクリプトを作ってからgawkを呼び出し、そのスクリプトを別のファイルに入れればいいのですが、一つのファイルの中でこれを行う方法はないかと考えています。

shebang 行の動作はシステムによって異なります - 少なくとも Cygwin では、空白で引数を分割しません。私は、そのような振る舞いをするシステム上でどのように行うかを気にしているだけで、スクリプトが移植可能であることを意図しているわけではありません。

どのように解決するのですか?

これは、(g)awkでうまくいくようです。

#!/bin/sh
arbitrary_long_name==0 "exec" "/usr/bin/gawk" "--re-interval" "-f" "$0" "$@"


# The real awk program starts here
{ print $0 }

この #! が実行されます。 /bin/sh であるため、このスクリプトはまずシェルスクリプトとして解釈される。

最初、私は単純に "exec" "/usr/bin/gawk" "--re-interval" "-f" "$0" "$@" を試してみましたが、awk はこれをコマンドとして扱い、無条件に入力のすべての行を出力してしまいました。そのため、私は arbitrary_long_name==0 - は常に失敗することになっているのです。これを意味不明な文字列に置き換えることもできます。基本的に、私はシェルスクリプトに悪影響を与えないような awk の false-condition を探していたのです。

シェルスクリプトの中で arbitrary_long_name==0 という変数を定義しています。 arbitrary_long_name という変数を定義し、それを =0 .