运算符                        替换    

${varname:-word}            如果varname存在且非null,则返回其值;否则,返回word.

                           用途:如果变量未定义,则返回默认值。

                           范例:如果count未定义,则${count:-0}的值为0.

${varname:=word}            如果varname存在且不是null,则返回它的值;否则,设置它为word,

                           并返回其值。

                           用途:如果变量未定义,则设置变量为默认值。

                           范例:如果count为被定义,则${count:=0}设置count为0.

${varname:?message}         如果varname存在且非null,则返回他的值;否则,显示                                         varname:message,并退出当前的命令或脚本。省略message会出现                                默认信息parameter null or not set 。注意,在交互式shell下    

                           不需要退出(在不同的shell间会有不同的行为,用户需要自行注意)。

${varname:+word}            如果varname存在且非null,则返回word;否则,返回null。

                           用途:为测试变量的存在。

                           范例:如果count已定义,则${count:+1}返回1(也就是“真”)。


模式匹配运算符


运算符                                替换

${variable#pattern}                如果模式匹配于变量值的开头处,则删除匹配的最短部分,并

                                  返回剩下的部分

${path#/*/}                        结果:tolstoy/mem/long.file.name


${variable##pattern}               如果模式匹配于变量值的开头处,则删除匹配的最长部分,并

                                  返回剩下的部分。

${path##/*/}                       结果:long.file.name


${variable%pattern}                如果模式匹配于变量值的结尾处,则删除匹配的最短部分,并

                                   返回剩下的部分

${path%.*}                         结果:/home/tolstoy/mem/long.file


${variable%%pattern}               如果模式匹配于变量值的结尾处,则删除匹配的最长部分,并

                                  返回剩下的部分。

${path%%.*}                        结果:/home/tolstoy/mem/long



$#            提供传递到shell脚本或函数的参数总数。

               while    [ $#  !=0 ]            以shift逐渐减少$#,循环将会终止

               do

                       case $1    in

                       ....                    处理第一个参数

                       shift                   移开第一个参数

               done

$* $@         一次

$*            将所有命令行参数视为单个字符串。等同于"$1 $2 ...."

$@            将所有命令行参数视为单独的个体,也就是单独字符串。等同于"$1" "$2" "$3"

$?            前一命令的退出状态。

$$            shell进程的进程编号(process ID).

$0            shell程序的名称。

$!            最近一个后台命令的进程编号。以此方式存储进程编号,可通过wait命令以供稍后

             使用。

ENV           一旦引用,则仅用于交互式shell中;$ENV的值是可展开的参数。结果应为要读取

             和在启动是要执行的一个文件的完整路径名称。这是一个XSI必须的变量。

HOME          根(登录)目录


IFS            内部的字段分隔器;例如,作为单词分隔器的字符列表。一般设为空格 制表符

              以及换行符

LANG           当前locale的默认名称;其他的LC_*变量会覆盖其值

LC_ALL         当前locale的名称;会覆盖LANG与其他LC_*变量

LC_COLLATE     用来排序字符的当前locale名称

LC_CTYPE       在模式匹配期间,用来确定字符类别的当前locale的名称

LC_MESSAGES    输入信息的当前语言的名称

LINENO         刚执行过的行在脚本或函数内的行编号

NLSPATH        在$LC_MESSAGES(XSI)所给定的信息语言里,信息目录的位置。

PATH           命令的查找路径

PPID           父进程的进程编号

PS1            主要的命令提示字符串。默认为"$"

PS2            行继续的提示字符串。默认为">"

PS4            以set -x设置的执行跟踪的提示字符串。默认为"+"

PWD            当前的工作目录




算数运算符

运算符                        意义                                        顺序

++ --            增加及减少,可前置也可以放在结尾                        由左至右

+ - ! ~          一元的正好与负号;逻辑                                  由右至左

                与位的去反

* / %            乘法 除法 与余数                                        由左至右      

+ -              加法减法                                                由左至右

<< >>            向左位移 向右位移                                       由左至右

< <= > >=        比较                                                    由左至右

== !==           相等与不想等                                            由左至右

&                位的AND                                                 由左至右

^                位的Exclusive OR                                        由左至右

|                位的OR                                                  由左至右

&&               逻辑的AND                                               由左至右

||               逻辑的OR                                                由左至右

?:               条件表达式                                              由右至左

= += -= *= /= %= &= ^= <<= >>= |=   赋值运算符                           由右至左




POSIX的结束状态

值                            意义

0                            命令成功地退出

>0                           在重定向或单词展开期间失败

1-125                        命令不成功地退出。特定的退出值的含义,是由各个单独的命令定

                            义的。

126                          命令找到了,但是文件无法执行。

127                          命令里找不到。

>128                         命令因收到信号而死亡。




test表达式


运算符                            如果......则为真

string                                string不是NULL

-b file                               file是块设备文件

-c file                               file是字符设备文件

-d file                               file是目录

-e file                               file存在

-f file                               file为一般文件

-g file                               file有设置它的setgid位

-h file                               file是一符号连接

-L file                               file是一符号连接(等同于 -h)

-n string                             string是非null

-p file                               file是一命名的管道

-r file                               file是可读的

-S file                               file是socket

-s file                               file不是空的

-t n                                  文件描述符n指向一终端

-u file                               file有设置它的setuid位

-w file                               file是可写入的

-x file                               file是可执行的,或file是可被查找的目录

-z string                             string为null

s1 = s2                               字符串1和字符串2是相等的

s1 != s2                              字符串1与字符串2是不想等的

n1 -eq n2                             整数n1等于n2

n1 -ne n2                             整数n1不等于n2

n1 -lt n2                             n1小于n2

n1 -gt n2                             n1大于n2

n1 -le n2                             n1小于等于n2

n1 -ge n2                             n1大于等于n2



POSIX的test算法


参数                        参数值                                    结果

0                                                                    退出状态为伪(1)

1                         如果$1非null                               退出状态为真(0)

                         如果$1为null                               退出状态为伪(1)

2                         如果$1为!                        否定单一参数测试结果,$2

                         如果$1为一元运算符               运算符的测试结果

                         其他情况                         未定义

3                        如果$2为二元运算符                运算符的测试结果

                        如果$1为!                         否定双参数测试结果,$2 $3

                        如果$1是(且$3是)                  单一参数测试的结果.$2(XSI)

                        其他情况                          未定义

4                        如果$1为!                        否定三个参数测试的结果,$2 $3 $4

                        如果$1是(且$4是)                  两参数测试的结果,$2 $3(XSI)

                        其他情况                          未定义

>4                                                        未定义





脚本添加用户


echo "password" | passwd --stdin $username &> /dev/null

三种常用格式发信

mail -s test test@163.com #第一种方法,你可以把当前shell当成编辑器来用,编辑完内容后Ctrl-D结束

echo “mail content”|mail -s test test@163.com#第二种方法,我用的最多,可能是喜欢管道的缘故吧

mail -s test test@163.com < file #第三种方法,以file的内容为邮件内容发信