export 用于修改或打印环境变量,readonly则使得变量不得修改。
-p 打印 export name[=word]..... export -p readonly name[=word] ....
实现最严格的可移植性:
FOO=somevalue
export FOO
因商用UNIX系统里的/bin/sh,仍然不是POSIX兼容版本。
export命令仅将变量加到环境中,如果要从程序的环境中删除变量,则要用env命令,env也可临时地改变环境变量值:
env -i PATH=$PATH HOME=$HOME LCALL=C awk '...' file1 fle2
-i 选项是用来初始化(initializes)环境变量的,也就是丢弃任何的继承值,仅传递命令行上指定的变量给程序使用。
unset full_name 删除full_nanme变量
unset -v first middel last 删除其他变量
unset -f functionname 删除函数
${varname:-word} 如果varname存在且非null,则返回其值;否则,返回word
${varname:=word} 如果varname存在且不是null,则返回它的值;否则,设置它为word,并返回其值。
${varname:?message}
${varname:+word} 如果存在且非NULL,则返回word,否则null
${variabl#pattern} 如果模式匹配于变量值得开头处,则删除匹配的最短部分,并返回剩下的部分。
path=/home/tolstoy/mem/long.filename
${path#/*/} 结果:/tolstoy/mem/long.filename
shell 位置参数:
从$0~~$ 9 ,大于9时,用${10}
POSIX内置的shell变量
# 目前进程的参数个数。
@ 传递给当前进程的命令行参数,置于双引号内,会展开为个别的参数。
* 当前进程的命令行参数。置于双引号内,则展开为一单独参数。
? 前一命令的退出状态
$ shell进程的进程编号
0 shell程序的名称
! 最近一个后台命令的进程编号。依次方式存储进程编号,可通过wait命令以供稍后使用。
ENV 一旦引用,则仅用于交互式shell中
IFS 内部的字段分隔器
LANG
LC_ALL
LC_COLLATE
LC_CTYPE
LC_MESSAGES
LINENO
NLSPATH
PATH
PPID
PS1
PS2
PS4
PWD
POSIX的结束状态
0 命令成功地退出。
>0 在重定向或单词展开期间
1-125 命令不成功退出
126 命令找到了,但文件无法执行。
127 命令找不到
>128 命令因受到信号而死亡
if -elif-else-fi
if pipeline
[pipeline...]
then
statements
[ elif pipeline
[ pipeline ...]
then
statements-if-true-2
...]
[ else
statements ]
fi
test 命令
test命令可以处理shell脚本来的各类工作。接受各种不同的参数,
test命令有另一种形式:[...]
if test "$str1" = "$str2"
then
.....
fi
=========
if [ "$str1" = "$str2" ]
then
......
fi
test表达式
-b file file是块设备危机
-c file file是字符设备文件
-d file file是目录
-e file file存在
-f file 一般文件
-g file
-h
-L
-n
...............
s1 !=s2 字符串s1与s2不相同
n1 -eq n2 整数n1等于n2
-ne 不等于
-lt 小于
-gt 大于
-le 小于或等于
-ge 大于或等于
case $1 in
-f)
...............
;;;;
-d | --directory)
............
;;
*)
echo $1:unkown
exit 1
esac
for循环里的in列表(list)是可选的,如果省略,shell循环会遍历整个命令行参数。
while condition
do
statments
done
until condition
do
statements
done
while与until唯一的不同之处在于,如果对待condition的退出状态。只要condition是成功退出,while会继续循环,只要condition未成功结束,until则执行循环。