第四章、基础shell编程
shell脚本和函数:
注意子shell
函数:
两种形式,如下
function functname
{
shell commands
}
或
functname ()
{
shell commands
}
declare -f 找到登录会话里的函数(里面好多东西呢)
declare -F 只显示那些函数的名字
shell变量:
最重要的内置变量称为位置参数
$0 表示文件名的名字
$1 表示第一个位置参数。。。。
$@ 匹配后面跟着的所有位置参数
$# 保存位置参数的数目
注意$@和$*的区别(其实我现在还搞不清楚,照抄书的)
“$*”是包含所有参数位置的单一字符串,由环境变量IFS中的第一个字符分隔。IFS默认为空格、TAB和NEWLINE。另一方面,“$@”等价于"$1" "$2"....."$N",这里N为位置参数数目,等价于N个单独的由空格分隔的双引号字符串。如果没有参数,“$@”扩展为空。
echo "Alice: $@"
echo "$0: $1 $2 $3 $4"
echo "$# arguments"
函数变量的范围:
假设有一个脚本称为ascript
function afunc
{
echo in function: $0 $1 $2
var1="in function"
echo var1: $var
}
var1="outside function"
echo var1: $var1
echo $0: $1 $2
afunc funcarg1 funcarg2
echo var1: $var1
echo $0: $1 $2
如果输入ascript arg1 arg2会有一下的输出:
var1: outside function
ascript: arg1 arg2
in function: ascript funcarg1 funcarg2
var1: in function
var1: in function
ascript: arg1 arg2
函数afunc将变量var1从函数外变成函数内,而这以改变对函数外是可知的。$1和$2在函数内和主脚本中有不同的取值。但$0是不会改变的。
将上一个例子扩展,将函数内的var1设为局部变量:
function afunc
{
local var1
echo in function: $0 $1 $2
var1="in function"
echo var1: $var
}
运行ascript arg1 arg2的输出结果如下:
var1: outside function
ascript: arg1 arg2
in function: ascript funcarg1 funcarg2
var1: in function
var1: outside function
ascript: arg1 arg2
问题:
为什么元素“$*”用IFS的第一个字符而不是用空格分隔呢?
因为是为了输出的灵活性。下面是一个打印用逗号分隔的位置参数列表,脚本为:
IFS=,
echo "$*"
但在脚本里面改变IFS是很危险的
问题:
为什么“$@”用作N个独立的双引号引用字符串?
目的是允许你在此分别使用他们。
阅读(1510) | 评论(0) | 转发(0) |