“shell编程”的上一篇文章很多知识点都没有提及,如果确实想学习shell脚本的各位看官们,推荐《Advanced Bash-Scripting Guide》,链接:http://www.tldp.org/LDP/abs/html/
1. 内置变量
内置变量包括$BASH, $FUNCNAME, $IFS, $REPLY, $*, $@, 其中最后两个的功能是类似的。
$BASH:Bash脚本解释器的路径;
$FUNCNAME:当前函数的名字;
$IFS:内部域分隔符,这个变量用来标明字符串边界,$IFS默认为空白(空格,制表符,换行符),但它也是可以被修改的,例如:
#!/bin/bash
output_args()
{
for arg
do echo "[$arg]"
done
}
echo; echo "IFS=\" \""
echo "-------"
IFS=" "
var=" a b c "
output_args $var
echo; echo "IFS=:"
echo "-----"
#这里用“:”替换了上面的“ ”
IFS=:
var=":a::b:c:::"
output_args $var
echo
exit 0
$REPLY:当没有参数变量提供给read命令时,这个变量会作为默认变量提供给read命令,也可以用于select菜单,但是只提供所选择变量的编号,而不是变量本身的值。在个别版本的Bash中,并不支持$REPLY;
$*, $@:列出所有的参数。$* 所有位置的参数都被看作是一个单词,$@ 每个参数都是一个独立的引用字符串。
2. 字符串
我们可以使用awk来处理字符串,Bash脚本也可以调用awk的字符串操作功能来代替自己的内建字符串操作。
#!/bin/bash
String=1234abcd
# 注意不同的字符串索引系统:
# Bash的第一个字符是从'0'开始记录的.
# Awk的第一个字符是从'1'开始记录的.
echo ${String:2:4} # 位置 3, 4 个字符长
# 34ab
# awk中等价于${string:pos:length}的命令是substr(string,pos,length).
echo | awk '
{
print substr("'"${String}"'",3,4) # 34ab
}
'
# 使用一个空的"echo"通过管道传递给awk一个假的输入,
#+ 这样就不必提供一个文件名给awk.
exit 0
3. 子串的删除及替换
${#var}
字符串长度(变量$var的字符个数)。对于数组来说,${#array}表示的是数组中第一个元素的长度。
${var#Pattern}, ${var##Pattern}
从变量$var的开头删除最短或最长匹配$Pattern的子串。“#”表示匹配最短,“##”表示匹配最长。
${var%Pattern}, ${var%%Pattern}
从变量$var的结尾删除最短或最长匹配$Pattern的子串。“%”表示匹配最短,“%%”表示匹配最长。
${var:pos}
变量var从位置pos开始扩展, 也就是pos之前的字符都丢弃。
${var:pos:len}
变量var从位置pos开始,并扩展len个字符。
${var/Pattern/Replacement}
使用Replacement来替换变量var中第一个匹配Pattern的字符串。
${var//Pattern/Replacement}
全局替换。所有在变量var匹配Pattern的字符串,都会被替换为Replacement。
${var/#Pattern/Replacement}
如果变量var的前缀匹配Pattern,那么就使用Replacement来替换匹配到Pattern的字符串。
${var/%Pattern/Replacement}
如果变量var的后缀匹配Pattern,那么就使用Replacement来替换匹配到Pattern的字符串。
4. 变量类型
使用declare或者typeset可以指定变量的类型。
类型 | 说明 |
-r | 只读 |
-i | 整形 |
-a | 数组 |
-f | 函数 |
-x | export |
#!/bin/bash
func1 ()
{
echo This is a function.
}
declare -f # 列出前面定义的所有函数.
exit 0
为了进一步了解shell,下一篇文章将实现一个简单的Linux系统信息监控脚本。