export -p可以显示所有当前的环境变量,如果要从程序的环境中删除变量,则要用env命令,也可以临时的改变环境变量值:
env -i PATH=$PATH HOME=$HOME LC_ALL=C .....
-i选项用来初始化(initializes)环境变量的,也就是丢弃任何的继承值,仅传递命令行上指定的变量给程序使用。
unset命令从执行中的shell中删除变量和函数,默认情况下,它会解除变量设置,也可以加上-v完成:
unset full_name #删除full_name变量
unset -v firest middle last #删除多个变量
unset -f full_function #删除函数
这里我尝试用unset删除readonly变量,发现无法删除。然后查询了以下,发现常量声明之后就无法更改包括删除,只有注销当前shell。
有时候输出某个变量时,希望连接别的字符,可以在变量名左右添加花括号如:
echo _${myvar}_ #这样会输出myvar变量并在前后增加下划线。
这样叫做参数的展开。如果变量未定义,展开后是null。
还有一种替换运算符:
${varname:-word} #如果varname存在且非null,则返回其值,否则返回word。
${varname:=word} #如果varname存在且非null,则返回其值,否则设置它为word然后再返回其值。
${varname:?message} #如果varname存在且非null,则返回它的值,否则显示varname:message,并退出当前的命令或脚本,如果省略message会出现默认信息parameter null or net set。
${varname:+word} #如果varname存在且非null,则返回word,否则返回null。
以上每个运算符内的冒号(:)都是可选的。如果省略冒号,则将每个定义中的“存在且非null”部分改为“存在”,也就是说,运算符仅用于测试变量是否存在。
还有模式匹配运算符#:
${variable#pattern} #如果模式匹配于变量值的开头处,则删除匹配的最短部分,并返回剩下的部分。
${variable##pattern} #如果模式匹配于变量值的开头处,则删除匹配的最长部分,并返回剩下的部分。
${variable%pattern} #如果模式匹配于变量的结尾处,则删除匹配的最短部分,并返回剩下的部分。
${variable%%pattern} #如果模式匹配于变量值的结尾处,则删除匹配的最长部分,并返回剩下的部分。
最后,POSIX标准化字符串长度运算符:${#variable}返回$variable值的字符长度。
学到这里我们就可以结合之前用到的位置参数来进行一些脚本程序的容错处理了,比如:filename=${1:-/dev/tty} #如果参数1为空则返回/dev/tty
之前我们没有介绍如何访问传递的参数的总数,这里说明一下,用的是 $# 符合。比如:
while [ $# !=0 ]
do
case $1 in
.... #处理第一个参数
esac
shift #移除第一个参数
done
另外还有$* ,$@ ,它们一次表示所有的命令行参数。这两个参数可用来把命令行参数传递给脚本或函数所执行的程序。










