関数の内部からシェルスクリプトの名前を取得します。

関数の内部からシェルスクリプトの名前を取得します。

私がこれを持っているとしましょう:

#!/bin/sh
function show_help {
  cat<<%
Usage: $0 [-h]
%
}
# the following lines is pseudo-code
if argument contains "-h"
  show_help
otherwise
  do_stuff

実行すると、./test期待どおりにいくつかのタスクが実行されますが、実行すると./test -h生成されます。

Usage: show_help [-h]

しかし、私はそれを実現します。

Usage: ./test [-h]

それでは、関数を修正してshow_helpこれをどのように達成できますか?スクリプト自体を変更したくないので、SCRIPT_NAME=$0shebang行の下にしか追加しません。ソリューションがaやfunctionなどの一種の組み込み
変数であることを願っています。実際に存在しますか?$PWDpwd

ベストアンサー1

私はこれを再現できません。この質問には「/bash」タグが付けられています。

Bashの場合、$ 0は常にスクリプト名なので、/tmp/testにある場合

#!/bin/bash
function show_help {
cat <<%
Usage: $0 [-h]
%
}
show_help

それではbash /tmp/test私にくださいUsage: /tmp/test [-h]

getを使用すると、POSIX以外の方法で関数を宣言するときにkshが$ 0を設定するため、ksh93 /tmp/testgetを使用します。Usage: show_help [-h]

移植可能な関数宣言に切り替える

#!/bin/bash
show_help() {
cat <<%
Usage: $0 [-h]
%
}
show_help

Usage: /tmp/test [-h]kshとbashから入手できます。

だから元のスクリプトには多くのエラーがありました。#!/bin/shbashに関する質問であれば、関数宣言が正しくなく、#!/bin/bash最後の構文が間違っています。if

おすすめ記事