我朋友的女儿四岁,叫姚惜,以前没觉得什么。昨晚带这小不点去逛商场
她在前面乱跑。我就叫她:姚惜,姚惜
谁知道这孩子回头对我怒气冲冲说了一句:八嘎... 我笑抽了
Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每一行可以是命令、注解、或是流程控制指令等。如果某一行尚未完成,在行末加上"\",这个时候下一行的内容就会接到这一行的後面,成为同一行。
当Script中出现"#"时,再它後面的同一行文字即为注解,Shell会对其翻译。 在Script中要执行一个命令的方法和在命令列中一样,你可以前台或后台执行,执行命令时也会需要设定一些环境变量。
Script的流程控制和一般高级语言的流程控制没有什麽两样,也和高级语言一样有副程式。这些使得Script的功能更加强大。
1 SHELL基本术语与关键字
. 当前shell程序相同目录
.. 当前shell程序的上一级目录
break 退出for、while、until或case语句
cd 改变到当前目录
continue 执行循环的下一步
echo 反馈信息到标准输出
eval 读取参数,执行结果命令
exec 执行命令,但不在当前shell
exit 退出当前shell
export 导出变量,使当前shell可利用它
pwd 显示当前目录
read 从标准输入读取一行文本
readonly 使变量只读
return 退出函数并带有返回值
set 控制各种参数到标准输出的显示
shift 命令行参数向左偏移一个
test 评估条件表达式
times 显示shell运行过程的用户和系统时间
trap 当捕获信号时运行指定命令
ulimit 显示或设置shell资源
umask 显示或设置缺省文件创建模式
unset 从shell内存中删除变量或函数
wait 等待直到子进程运行完毕,报告终止
2变量
Shell的类型只有字串变量,所以要使用数值运算则必须靠外部命令达成目的。而其变量种类有下列几种:
2.1普通变量
这是最常使用的变量,我们可以任何不包含空白字元的字串来当做变量名称。设定变量值时则用下列方式:
var=string #不能是var = string,即等号两边不能有空格。与判断语句正好相反,判断语句表的=或者其他符号两边必须有空格,否则为赋值运算
取用变量时则在变量名称前加上一"$"号,或者${name}。
name=Tom
echo name
echo $name
结果如下:
name
Tom
2.2环境变量
和使普通变量相似,只不过此种变量会将其值传给其所执行的命令。要将一使用者变量设定为系统变量,只要加上:
export var或者export var=var_value或者setenv var var_valued
name=Tom
export name
以下是使用者一进入系统之後就已设定好的系统变量:
$HOME使用者自己的目录
$PATH执行命令时所搜寻的目录
$TZ时区
$MAILCHECK每隔多少秒检查是否有新的信件
$PS1在命令列时的提示号
$PS2当命令尚未打完时,Shell要求再输入时的提示号
$MANPATH man指令的搜寻路径
2.3只读的使用者变量
和使用者变量相似,只不过这些变量不能被改变。要将变量设成只读的,只要加上:
readonly var
而若只打readonly则会列出所有只读的变量(ksh支持readonly命令。csh不支持,但是在shell程序中可以使用readonly修饰某个变量)。还有一点,系统变量不可以设定成只读的。
name=Tom
readonly name
echo $name
name=John
echo $name
(假设文件保存为aa)
结果如下:
aaa
aa[4]: name: This variable is read only
2.4特殊变量
有些变量是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它只读的系统变量,而叫它特殊变量,因为这些变量是一执行程式时就有了,况且使用者无法将一般的系统变量设定成只读的。以下是一些等殊变量:
$0这个程式的执行名字
$n这个程式的第n个参数值,n=1..9
$*这个程式的所有参数
$#这个程式的参数个数
$$这个程式的PID
$!执行上一个背景指令的PID
$?执行上一个指令的返回值
$n,n只能为0-9的原因,是Bourne Shell的位置参数变量为$1~$9,因此通过位置变量$n只能访问前9个参数。当你执行这个程式时的参数数目超过9时,我们可以使用shift命令将参数往前移一格,如此即可使用第10个以後的参数。除此之外,可以用set命令改变$n及$*,方法如下:
set string
如此$*的值即为string,而分解後则会放入$n。如果set命令後面没有参数, 则会列出所有已经设定的变量以及其值。
echo Filename: $0
echo Arguments: $*
echo No. of args.: $#
echo 2nd arg.: $2
shift
echo No. of args.: $#
echo 2nd arg.: $2
set hello, everyone
echo Arguments: $*
echo 2nd arg.: $2
结果如下:
Filename: ex1
Arguments: this is a test
No. of args.: 4
2nd arg.: is
No. of args.: 3
2nd arg.: a
Arguments: hello, everyone
2nd arg.: everyone
2.5数组变量 (ksh支持)
name[index]=value
其中name为数组名称,index为数组下标,在ksh中数组最大支持1024,即index为0~1023.
或者
set–A name value1 value2…valuen
引用数组变量
${name[index]}
应用所有项:
${name[*]} #或者
${name[@]}
如:
set–A ser pps ppip mvpn
echo ${ser[2]}
echo ${ser[*]}
打印为:
mvpn
pps ppip mvpn
如:
set–A ser pps ppip mvpn
echo $ser[2]
echo $ser[*]
打印为:
pps[2]
pps[*]
2.6 SHELL变量
SHELL程序中可以直接使用一些变量。常用有:
SECONDS #ftp程序中判断超时经常使用这个变量
IFS #域分割符,缺省为空格或者TAB键,可以由用户指定
3引用
某些字符在SHELL中具备特殊的含义:
如:& * + ^ $ ` " | ? [ ] ; ^ < >
可以使用双引号或者单引号或者\去掉特殊字符的含义,使成为一个普通字符.
3.1 ””可以去掉除$, \, ``之外的所有特殊字符的含义。
比如:
>echo * #输出当前某个的所有目录与文件
>echo“*” #输出*字符
>echo“`date`” #输出为date命令打印的时间“Tue Sep 17 11:31:58 MDT 2002”
>echo“$PATH” #输出当前用户的搜索路径
>echo“a\na” #输出为2行,一行一个a,此时\为特殊字符
3.2 ‘’单引号可以去掉\去掉引号以内包含的任何特殊字符的含义,使成为一个普通字符.
比如:
>echo‘*’ #输出*字符
>echo‘`date`’ #输出`date`
>echo‘$PATH’ #输出$PATH
>echo‘a\na’ #输出为2行,一行一个a,此时\为特殊字符
3.3 \可以去掉& * + ^ $ ` " | ?的特殊含义,\本身的特殊含义可以用\去掉,比如\\后面一个\就是普通字符
如:
>echo \* #输出*
4标准输入与输出