#dirname "$(dirname "$(readlink -f "$(which javac || which java)")")"
root@devops:~# ls /usr/local/
bin/ games/ jdk/ lib/ openresty/ share/
etc/ include/ jdk1.8.0_171/ man/ sbin/ src/
root@devops:~# ls /usr/local/
bin etc games include jdk jdk1.8.0_171 lib man openresty sbin share src
root@devops:~# which javac
/usr/local/jdk/bin/javac
root@devops:~# readlink -f $(which javac)
/usr/local/jdk1.8.0_171/bin/javac
set
是BASH内置的命令,如果不提供选项给set
,默认情况下会打印所有的变量和函数的名称和值。
常用的选项:
-u
或者-o nounset
: 执行脚本时遇到的不存在的变量时报错,默认情况下BASH会自动忽略set -x
或者-o xtrace
: 用来在运行结果之前,先输出执行的那一行命令。一般在调试脚本时候很有用-e
: 根据返回值判断命令是否运行成功。只要脚本发生错误,就终止执行。但是对于管道命令来说就不是很好用了。因为管道命令是把最后一个命令的返回值当做整理命令的返回值+e
: 关闭-e
选项,为了针对特殊的场景,比如有些返回值为非零的时候才执行脚本时候可以使用。set -o pipefail
: 只要有一个子命令失败,整个管道命令就失败了。一般建议将以上四个删除放在BASH的头部使用
#!/bin/bash
set -eux
set -p pipefail${YOUR_COMMAND}
变量 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是,第二个参数是2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(“ “)包含时,与 $* 稍有不同 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |