文章目录

  • 切换或得到shell脚本文件所在目录的完整路径(绝对路径)
  • $( dirname “$0“ ) 不推荐使用
  • dirname
  • $() 和 ${}
  • ${BASH_SOURCE[0] 推荐使用


切换或得到shell脚本文件所在目录的完整路径(绝对路径)

$( dirname “$0“ ) 不推荐使用

demo:

SCRIPT_PATH="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )"
cd "$SCRIPT_PATH/.." || exit

在linux中,dirname命令可以返回文件所在的目录。$0表示Shell本身的文件名。
因此此写法的作用为:
这个语句的作用是获取shell脚本所在目录的绝对路径,然后切换到 脚本 所在的目录。

这个脚本是有缺陷的,例如:脚本A source 了另一个⽬目录下的脚本B, 然后脚本B尝试使⽤用此法获取路路径时得到的是A的路路径

脚本中引用脚本推荐使用 ${BASH_SOURCE[0]

dirname

dirname的功能是去掉文件路径名中的从右往左数的第一个/及其之后的所有文字,查看dirname的help信息可以看到如下的例子

[root@dev workspace]# dirname --help
Usage: dirname [OPTION] NAME...
Output each NAME with its last non-slash component and trailing slashes
removed; if NAME contains no /'s, output '.' (meaning the current directory).

  -z, --zero     end each output line with NUL, not newline
      --help     display this help and exit
      --version  output version information and exit

Examples:
  dirname /usr/bin/          -> "/usr"
  dirname dir1/str dir2/str  -> "dir1" followed by "dir2"
  dirname stdio.h            -> "."

GNU coreutils online help: <https://www.gnu.org/software/coreutils/>
Full documentation at: <https://www.gnu.org/software/coreutils/dirname>
or available locally via: info '(coreutils) dirname invocation'
[root@dev workspace]#

"."表示当前路径

SCRIPT_PATH="$( cd "$( dirname "$0" )" >/dev/null 2>&1 && pwd )"

结合上面基础,此时$(dirname $0)的结果就是.,那么cd $(dirname $0)就是cd . ,之后运行pwd,此时获得的就是脚本所在的绝对路径了。

注意:dirname获取的是去掉文件路径名中的从右往左数的第一个/及其之后的所有文字。 我们在使用时,和我们调脚本的方式息息相关,我们使用绝对路径直接调脚本,还是进入第特定目录,再调脚本显示结果很大不一样。

工作中,我们有时候直接全路径调某个脚本没有问题,进入到脚本所在目录调反而出现问题,就要注意检查这里。 可能我们的脚本里面引用了dirname获取的路径,但是由于我们的调用方式不一样,获取的路径就不一样。我们别写shell脚本时,可能很多地方用到了这个路径。

$() 和 ${}

  • 在 bash shell 中,shell脚本完成kvm虚机切换硬盘 shell脚本切换路径_shell脚本完成kvm虚机切换硬盘( )的理由:
  • 很容易与’ '(单引号)搞混。有时在一些奇怪的字形显示中,两种符号是一模一样的(直竖两点)。
  • 在多层次的复合替换中,须要额外的跳脱(`)处理,而$( )则比较直观。
    $( )的不足
  • ``基本上可在全部的unix shell中使用,若写成shell script移植性比较高。而$( )并不是每一种shell都能使用。
  • shell脚本完成kvm虚机切换硬盘 shell脚本切换路径_绝对路径_02var 与 ${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围
    示例如下:
[root@dev workspace]# A=B
[root@dev workspace]# echo $AB

[root@dev workspace]# echo ${A}B
BB
[root@dev workspace]#

${BASH_SOURCE[0] 推荐使用

我们可以在bash中使用以下命令获取所执行脚本文件的绝对路径

#!/bin/bash
DIR=$( cd "$(dirname "${BASH_SOURCE[0]}")" && pwd);
echo $DIR
  • BASH_SOURCE[0] - 等价于 BASH_SOURCE ,取得当前执行的 shell 文件所在的路径及文件名
  • dirname - 去除文件名中的非目录部分,仅显示与目录有关的部分
  • $() - 相当于 command, 即获取command命令的结果
  • && - 逻辑运算符号,只有当&&左边运行成功时才会运行&&右边的命令

${BASH_SOURCE[0]}表示bash脚本的第一个参数(如果第一个参数是bash,表明这是要执行bash脚本,这时"${BASH_SOURCE[0]}"自动转换为第二个参数

通过上面示例,得到shell脚本文件所在完整路径(绝对路径)及文件名(无论source,sh,.三种调用方式),且不改变shell的当前目录。

亲测,好用!