Bash练习手册(一)

一、基础知识

参考网道Bash文档

二、特殊变量 —— BASH_SOURCE

在bash脚本中,BASH_SOURCE是一个特殊的变量,它是一个数组,其第一个元素是当前脚本的名称。看过上面的网道文档,你可能知道在bash脚本中"$0"这个脚本参数也是指脚本名称,那两者有什么区别吗?先来看看 “$0” 的例子:

root@lsp:~/code/shell$ cat test_0.sh
#!/bin/bash

echo $0
root@lsp:~/code/shell$ ./test_0.sh
./test_0.sh
root@lsp:~/code/shell$ sh test_0.sh
test_0.sh
root@lsp:~/code/shell$ source test_0.sh
-bash

可以看到,当通过source来执行脚本的时候,“$0” 是没法获取脚本文件的名称的,这也是BASH_SOURCE和脚本参数的区别所在。再来看看BASH_SOURCE表现如何:

root@lsp:~/code/shell$ cat bash_source.sh
#!/bin/bash

echo "${BASH_SOURCE[0]}"
root@lsp:~/code/shell$ ./bash_source.sh
./bash_source.sh
root@lsp:~/code/shell$ sh bash_source.sh
bash_source.sh
root@lsp:~/code/shell$ source bash_source.sh
bash_source.sh

由此可见,无论通过何种方式,我们都能得到脚本的名称,这在给别人提供的脚本中使用到脚本名称时特别有用,因为我们不知道使用脚本的人拥有什么样的习惯,这样能确保我们脚本的准确性。

三、使用场景

其实我们在脚本中使用脚本名称的场景不多,但是用到脚本所在的路径的情况相比之下就比较多了,那如何能知道脚本运行时所在的路径是什么呢?我们可以在脚本中采用 “pwd” 命令来获取当前执行脚本的目录,这没什么问题,但是存在一种特殊情况,那就是如果执行的脚本是一个链接(软或者硬),那这个时候pwd命令获得的路径就是链接文件所在的目录,而如果我们需要获取真实脚本所在的目录该如何做?

谈到链接,我们可以借助另外一个Linux命令:readlink 命令来获取链接指向的真正的文件所在的位置,但是简单的通过 "readlink 文件名"的方式得到的只是该链接指向的那个文件,而其指向的文件有可能还是一个链接,而且,该方式得到的也不是该链接文件的绝对路径,而要达到我们的目的,只需要加上 “-f” 参数即可:

root@lsp:~/code/shell/link-test$ ll
total 8
drwxrwxr-x 2 lsp lsp 4096 Sep  9 10:35 ./
drwxrwxr-x 3 lsp lsp 4096 Sep  9 10:35 ../
lrwxrwxrwx 1 lsp lsp   15 Sep  9 10:34 test_link.sh -> ../test_link.sh
root@lsp:~/code/shell/link-test$ readlink test_link.sh
../test_link.sh
root@lsp:~/code/shell/link-test$ readlink -f test_link.sh
/home/lsp/code/shell/test_link.sh

这样我们就能知道我们执行的脚本的真实绝对路径,进而通过 “dirname” 命令即可得到该脚本所在的目录:

root@lsp:~/code/shell/link-test$ cat test_link.sh
#!/bin/bash

current_dir=$(dirname $(readlink -f ${BASH_SOURCE[0]}))
echo "$current_dir"
root@lsp:~/code/shell/link-test$ source test_link.sh
/home/lsp/code/shell
root@lsp:~/code/shell/link-test$ sh test_link.sh
/home/lsp/code/shell
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值