分类: LINUX
2011-12-08 20:43:55
export,readonly,unset,env管理变量
readonly可以使变量成为只读模式,从而禁止改变变量的值,可用于在shell中创建常量。
export用于修改或打印环境变量。环境是一个名称与值的简单列表,可供所有执行中的程序使用。新的进程会从其父进程继承环境,export则可以将新变量添加到环境中。
unset从当前shell删除变量与函数。
env为在命令行执行程序的环境提供更细致的控制。
如: readonly hours_per_day=24 seconds_per_hour=3600 days_per_week=7
export PATH=$PATH:/usr/local/bin
export –p 显示当前的环境
unset hours_per_day 删除hours_per_day变量
env –i name=value… command arguments
忽略继承的环境,只使用命令行的环境执行command
参数展开
参数展开是shell提供变量值在程序中使用的过程。
默认情况下,未定义的变量会展开为null(空的)字符串。
如: rm –rf /$program 如果program未被定义,则会引发灾难。
Ÿ 展开运算符
1. 替换运算法
${varname:-word} 如果varname存在且非null,则返回其值,否则返回word;可用于当变量未定义则返回默认值的情况。
${varname:=word} 如果varname存在其非null,则返回它的值,否则设置varname为word,并返回其值;可用于当变量未设置则设置其为默认值的情况。
${varname:?message} 如果varname存在且非null,则返回它的值,否则显示varname:message,并退出当前的命令或脚本。可用于捕捉变量未设置引发的错误,message为提示消息。
${varname:+word} 如果varname存在且非null,则返回word,否则返回null;可用于测试变量的存在性。
2. 模式匹配运算符
令path=/home/tolstoy/mem/long.file.name
${variable#pattern} 如果模式匹配与变量的开头处,则删除匹配的最短部分,并返回剩下的部分。如${path#/*/}返回tolstoy/mem/long.file.name。
${variable##pattern}如果模式匹配与变量的开头处,则删除匹配的最长部分,并返回剩下的部分。如${path##/*/}返回long.file.name。
${variable%pattern} 如果模式匹配于变量的结尾处,则伤处匹配的最短部分,并返回剩下的部分。如${path%.*}返回tolstoy/mem/long.file。
${variable%%pattern} 如果模式匹配于变量的结尾处,则伤处匹配的最短部分,并返回剩下的部分。如${path%%.*}返回tolstoy/mem/long。
Ÿ 特殊变量
# 目前进程的参数个数;
@ 传递给当前进程的命令行参数,等同于”$1” “$2” …
* 传递给当前进程的命令行参数,等同于”$1 $2 …”
? 前一进程的退出状态
$ shell进程的进程编号
0 shell程序的名称
! 最近一个后台命令的进程编号
HOME 当前用户根目录
IFS 内部的字段分隔器,一般设为空格,制表符或换行符
LANG 当前locale 的默认名称
PATH 命令的查找路径
PPID 父进程的进程编号
PWD 当前工作目录
PS1 主要的命令提示符字符串,默认为$
PS2 行继续的提示符,默认为>
PS4 以set –x设置的执行跟踪的提示字符串
Ÿ 算术展开
shell的算术运算符与C语言里的差不多,优先级与结合性也相同。
shell将置于$((…))中的内容解释为数学运算。
如: echo $((3 && 4)) 输出1
echo $((3 * 100)) 输出300
&&,||均为快捷运算符,当测试表达式的值确定后就停止执行。
Ÿ 退出状态
每一条命令,不管是内置的,shell函数,还是外部的,当它退出时,都会返回一个小的整数值给引用它的程序,该值即代表程序的退出状态。通常0表示成功,即程序执行完成且未遭遇任何问题。
POSIX的结束状态
0 命令成功地退出
1-125 命令不成功第退出。特定的退出值的含义,是由单个单独的命令定义的。
126 命令找到了,但文件无法执行
127 命令找不到
>128 命令因收到信号而死亡
exit可用于从shell脚本返回一个退出状态给脚本的调用者
Ÿ if-elif-else-fi语句用于判断
if 测试条件1
then 执行动作1 #可以是多条语句
elif 测试条件2
then 执行动作2 #可以是多条语句
……
elif 测试条件n
then 执行动作n #可以是多条语句
else
执行动作 #可以是多条语句
fi
Ÿ test命令
test expreesion 或者 [ expression ](两边有空格)
test string 或 [ string ] : string不为null
test –b file 或 [ -b file ]: file是块设备文件
详细的说明参见man test
Ÿ case语句
case $varname in
pattern1) 与pattern1匹配
… 执行命令
;;
pattern2) 与pattern2匹配
… 执行命令
;;
*) 默认情况
.. 执行命令
;;
esac
Ÿ for循环
for循环用于重复整个对象列表,依次执行每一个独立对象的循环内容。
如:for var in a.xml b.xml c.xml
do echo $var
done
该循环输出每一个xml文件的名字,如果没有指定列表的内容,则shell循环遍历整个命令行参数。
如:for var in
do
****多每一个参数进行的处理
done
Ÿ while, until循环,break,continue
while conditon until conditon
do do
statements statements
done done
while循环:只要condition是成功退出或为真,while会继续循环;
until循环:只要conditon未成功结束或为假,until继续循环。
break,continue:类比C语言中的用法,break与continue命令都接受可选的数值参数,可分别用来指出要中断(break)或是继续(continue)多少个被包含的循环。如:
while condition1 外部循环
do
while condition2 内部循环
do
break 2 跳出外部循环
done
done
…… 中断之后继续执行