第一章:The Missing Code Library--1.在系统路径PATH中寻找程序
2012-11-27 14:59
435 查看
每个章节中的脚本独立成文。
代码已测试过,Bash版本:GNU bash, version 3.00.15(1)-release (i686-asianux-linux-gnu)
使用环境变量的Shell脚本,有一个隐藏的危险:它们可能部分正确的指向不存在的程序。比如你决定使用环境变量PAGER来灵活的演示脚本输出,而不是通过编写一个特殊的工具,那么如何确定PAGER这个值已经设置正确了呢?毕竟它不是一个有效的程序,你的脚本可能会崩溃。
下面的这个脚本表明了在系统路径中,如何通过测试来确定一个给定的程序能否查找得到。同时,它也很好的演示了一系列不同的脚本技术,包括脚本函数和变量切片(slicing)。
第一个脚本
inpath.sh ---- 在系统路径PATH中寻找程序
inpath.sh
测试的3种情况:
1.程序存在:
输出:python found in PATH
2.程序存在,但不在PATH上:
输出:test.sh not found in PATH
3.程序不存在,但该程序有一个完整的包含路径的名字:
输出:/usr/bin/python4 not found or not executable
其中,python大家都知道的,test.sh是一个可执行文件,python4估计这几年都不会有的,哈哈。
分析下上面的脚本
上面代码中最不常用的地方可能就是:
它是POSIX的变量切片方法。它有2个嵌套,内部嵌套 ${var#?},取得除变量var第一个字母外的剩余内容,其中?是一个正则表达式,表示通配一个字符。外层 ${var%pattern},生成一个除去右匹配pattern后的剩余子串。在此例中,剩下的就是字符串的第一个字母。
check-ForCmdInPath可以区分是一个程序还是一个包含有路径的文件名。方法是判断第一个字母是不是斜线“/”。
如果上面的切片方法使用起来有难度的话,可以使用另一种Bash和Ksh支持的方法,子串函数
比如,${varname:1:1}就是产生一个只有第一个字母的子串。注意,Shell中的这种用法,字符串下标是从1开始的。当然了,如果这2种技术你都不爱用的话,但是又想只取第一个字母,可以用cut命令:
代码已测试过,Bash版本:GNU bash, version 3.00.15(1)-release (i686-asianux-linux-gnu)
使用环境变量的Shell脚本,有一个隐藏的危险:它们可能部分正确的指向不存在的程序。比如你决定使用环境变量PAGER来灵活的演示脚本输出,而不是通过编写一个特殊的工具,那么如何确定PAGER这个值已经设置正确了呢?毕竟它不是一个有效的程序,你的脚本可能会崩溃。
下面的这个脚本表明了在系统路径中,如何通过测试来确定一个给定的程序能否查找得到。同时,它也很好的演示了一系列不同的脚本技术,包括脚本函数和变量切片(slicing)。
第一个脚本
inpath.sh ---- 在系统路径PATH中寻找程序
inpath.sh
if [ $# -ne 1 ]; then echo "Usage: $0 commmand" >&2 exit 1 fi checkForCmdInPath "$1" case $? in # $?是上个命令或是脚本的退出码 0)echo "$1 found in PATH";; 1)echo "$1 not found or not executable";; 2)echo "$1 not found in PATH";; esac exit 0
测试的3种情况:
1.程序存在:
inpath.sh python
输出:python found in PATH
2.程序存在,但不在PATH上:
inpath.sh test.sh
输出:test.sh not found in PATH
3.程序不存在,但该程序有一个完整的包含路径的名字:
inpath.sh /usr/bin/python4
输出:/usr/bin/python4 not found or not executable
其中,python大家都知道的,test.sh是一个可执行文件,python4估计这几年都不会有的,哈哈。
分析下上面的脚本
上面代码中最不常用的地方可能就是:
${var%${var#?}}
它是POSIX的变量切片方法。它有2个嵌套,内部嵌套 ${var#?},取得除变量var第一个字母外的剩余内容,其中?是一个正则表达式,表示通配一个字符。外层 ${var%pattern},生成一个除去右匹配pattern后的剩余子串。在此例中,剩下的就是字符串的第一个字母。
check-ForCmdInPath可以区分是一个程序还是一个包含有路径的文件名。方法是判断第一个字母是不是斜线“/”。
如果上面的切片方法使用起来有难度的话,可以使用另一种Bash和Ksh支持的方法,子串函数
${varname:start:size}
比如,${varname:1:1}就是产生一个只有第一个字母的子串。注意,Shell中的这种用法,字符串下标是从1开始的。当然了,如果这2种技术你都不爱用的话,但是又想只取第一个字母,可以用cut命令:
$(echo $var | cut -c1)
相关文章推荐
- 第一章:The Missing Code Library--1.在系统路径PATH中寻找程序
- 第一章:The Missing Code Library--6.合法化浮点数输入
- 第一章:The Missing Code Library--5.合法化整型输入
- 第一章:The Missing Code Library--4.优雅的表示大数
- 第一章:The Missing Code Library--2.合法化输入
- 第一章:The Missing Code Library--3.正常化日期格式
- 第一章:The Missing Code Library--6.合法化浮点数输入
- 第一章:The Missing Code Library--7.合法化日期格式
- 第一章:The Missing Code Library--10.锁定文件
- 第一章:The Missing Code Library--2.合法化输入
- 第一章:The Missing Code Library--3.正常化日期格式
- 第一章:The Missing Code Library--5.合法化整型输入
- 第一章:The Missing Code Library--8.避免不合要求的echo方法
- 第一章:The Missing Code Library--13.调试Shell脚本
- 第一章:The Missing Code Library--12.建立一个Shell脚本库
- 第一章:The Missing Code Library--11.ANSI颜色序列
- 第一章:The Missing Code Library--9.一个任意精度浮点计算器
- 第一章:The Missing Code Library--8.避免不合要求的echo方法
- 第一章:The Missing Code Library--4.优雅的表示大数
- 第一章:The Missing Code Library--9.一个任意精度浮点计算器