Linux Shell 脚本获取当前目录和文件夹名
$ cat shell_curl_path_filename.sh
#!/bin/bash
project_path=$(cd `dirname $0`; pwd)
project_name="${project_path##*/}"
echo $project_path
echo $project_name
参数说明:
# 表示从左开始算起,并且截取第一个匹配的字符
## 表示从左开始算起,并且截取最后一个匹配的字符
% 表示从右开始算起,并且截取第一个匹配的字符
%% 表示从右开始算起,并且截取最后一个匹配的字符
运行结果:
$ pwd
/Users/homer/Desktop/blog_images
$
$ sh shell_curl_path_filename.sh
/Users/homer/Desktop/blog_images
blog_images
Linux Shell if 判断写成一行
示例:
[[ $? -eq 0 ]] &&echo "backup $i success" ||exit
# 判断上一个命令是否执行正确,退出状态码若为0,则执行 echo
否则会认为[[ $? -eq 0 ]] && echo "backup $i success" 这一段执行错误,就会退出
Linux Shell 脚本获取当前的函数名
在C/C++中,__FUNCTION__常量记录当前函数的名称。有时候,在日志输出的时候包含这些信息是非常有用的。
在Bash中,同样有这样一个常量 FUNCNAME,但是有一点区别是,它是一个数组而非字符串,其中数组的第一个元素为当前函数的名称。
可能初看有点难以理解,为什么FUNCNAME要是一个数组呢?
示例代码:
#!/bin/bash
function test_func()
{
echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
another_func
echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
}
function another_func()
{
echo "Current $FUNCNAME, \$FUNCNAME => (${FUNCNAME[@]})"
}
echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})"
test_func
echo "Out of function, \$FUNCNAME => (${FUNCNAME[@]})"
运行结果:
Out of function, $FUNCNAME => ()
Current test_func, $FUNCNAME => (test_func main)
Current another_func, $FUNCNAME => (another_func test_func main)
Current test_func, $FUNCNAME => (test_func main)
Out of function, $FUNCNAME => ()
得出结论:
更加准确地说,FUNCNAME是一个数组,但是bash中会将它维护成类似一个堆栈的形式。
与函数名常量 FUNCNAME 相似的另外一个比较有用的常量是 BASH_SOURCE,同样是一个数组,不过它的第一个元素是当前脚本的名称。
这在source的时候非常有用,因为在被source的脚本中,$0是父脚本的名称,而不是被source的脚本名称。而这时 BASH_SOURCE 就可以派上用场了。
示例代码:
# If the script is sourced by another script
if [ -n "$BASH_SOURCE" -a "$BASH_SOURCE" != "$0" ]
then
do_something
else # Otherwise, run directly in the shell
do_other
fi
唯一遗憾的是,这种做法会让脚本失去一些可移植性,因为不是所有的shell都支持这些常量。
例如:CentOS、RedHat、Ubuntu、Debian、MacOS 等常量不一定都一样,需做系统判断。
参考推荐: