如何确定脚本本身中的Bash脚本文件的名称?

就像如果我的脚本在文件runme.sh中,那么我如何让它显示“您正在运行runme.sh”消息而不硬编码?


当前回答

如果你调用shell脚本喜欢

/home/mike/runme.sh

$0是全名

 /home/mike/runme.sh

Basename $0将获得基本文件名

 runme.sh

你需要把这个基本的名字放到一个变量里,比如

filename=$(basename $0)

并添加额外的文本

echo "You are running $filename"

你的脚本就像

/home/mike/runme.sh
#!/bin/bash 
filename=$(basename $0)
echo "You are running $filename"

其他回答

me=`basename "$0"`

对于读取symlink1,这通常不是你想要的(你通常不想以这种方式迷惑用户),尝试:

me="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")"

在我看来,这会产生令人困惑的输出。“我跑了foo.sh,但它说我跑了bar.sh!?”一定是虫子!”此外,使用不同名称的符号链接的目的之一是根据其名称提供不同的功能(例如某些平台上的gzip和gunzip)。


1也就是说,为了解析符号链接,当用户执行foo.sh时,它实际上是一个到bar.sh的符号链接,你希望使用解析的名称bar.sh而不是foo.sh。

如果脚本名中有空格,更可靠的方法是使用"$0"或"$(basename "$0")"-或MacOS: "$(basename \"$0\")"。这可以防止名称以任何方式被破坏或解释。一般来说,在shell中始终使用双引号作为变量名是一种良好的实践。

以下是我从Dimitre Radoulov的回答中得到的灵感(顺便说一下,我给他的回答投了赞)。

script="$BASH_SOURCE"
[ -z "$BASH_SOURCE" ] && script="$0"

echo "Called $script with $# argument(s)"

不管你如何调用你的脚本

. path/to/script.sh

or

./path/to/script.sh

在bash中,您可以使用$0获取脚本文件名。通常$1,$2等用于访问CLI参数。类似地,$0是访问触发脚本的名称(脚本文件名)。

#!/bin/bash
echo "You are running $0"
...
...

如果你使用/path/to/script.sh这样的路径调用脚本,那么$0也会给出带有路径的文件名。在这种情况下,需要使用$(basename $0)来获取脚本文件名。

由于一些注释询问没有扩展名的文件名,这里有一个示例如何完成:

FileName=${0##*/}
FileNameWithoutExtension=${FileName%.*}

享受吧!