1、变量:
单引号和双引号的区别
引用时如果跟字符串混用,可以用{}标示出,ab='ddd' echo abc${ab}cd
等号两边不能有空格
2、目录名和文件名
dirname /usr/local/etc/php.ini 结果:/usr/local/etc
basename /usr/local/etc/php.ini 结果:php.ini
3、命令替换:
(1)用反单引号引起来,如:echo `ls /usr`显示的是ls的结果。
(2)用$(command)的形式,如:cm=$(ls /usr) echo $cm
4、通配符:
*和?跟DOS相同,[]跟perl相同
sh启动选项:echo $-
5、“;”命令分隔符,在一行使用多个命令;
“;;”为终止case选项;
“.” 为执行一个命令,等价于source命令;
“#” (1)注释;(2)替换
“?” (1)通配符;(2)替换
“`” (反单引号)后置引用,命令替换
“,” (逗号)链接一系列复核操作,逐项执行,但只有最后一个返回。
a2=(a1=9,a3=8,4*3) 则a2=12
“:” 空命令,等价于ture
“!” 取反
“**” 幂操作
“${}” 参数替换
“$*和$@”位置参数
“$?” 退出状态变量
“$$” 进程ID变量
“()” 命令组,注意在子shell中操作,环境变量不能传递
“{a,b,c}” 大括号扩展????
“{}” 代码块,跟()不同,不开启新的shell
“[[]]” 测试结构???
“(())” 数学计算结构扩展
“>& &> <>” 重定向??
“-” 重定向stdin或stdout
“~+”当前目录,相当于pwd
“~-”之前的工作目录,相当于$OLDPWD
“”
6、变量替换:
(1)a="a b c d";echo $a; echo "$a"
前一个将多余空格合并,后一个显示所有空格。
(2)let可以用来给变量赋值
7、命令行参数:
$0本身,$1:第一个参数…… $9, ${10},10以后要带大括号。
位置可以用ar=$1;lastarg=${!args} ????
在调用空参数的时候,会引起空变量错误,可以在相关变量后加一个额外字符
shift用来将参数位置向左移动一个
$@和$*,在soft quote中,$@不拆分字符串,而$*则拆开,
如a.sh a "b c" d ,前者得到三个,后者得到四个。
8、\转义,也提供了续行功能
9、if ...then...elif...then...else...fi
10、文件测试:
-e 文件存在
-f file 普通文件(不是目录或者设备文件)
-s 文件长度不为0
-d 文件是个目录
-b 文件是个块设备(软盘,cdrom 等等)
-c 文件是个字符设备(键盘,modem,声卡等等)
-p 文件是个管道
-h 文件是个符号链接
-L 文件是个符号链接
-S 文件是个socket
-t 关联到一个终端设备的文件描述符
这个选项一般都用来检测是否在一个给定脚本中的stdin[-t0]或[-t1]是一个终端
-r 文件具有读权限
-w 文件具有写权限
-x 文件具有执行权限
-g set-group-id(sgid)标志到文件或目录上
-u set-user-id(suid)标志到文件上
-k 设置粘贴位
-O 文件的所有者.
-G 文件的group-id 和你的相同.
-N 从文件最后被阅读到现在,是否被修改.
f1 -nt f2 文件f1 比f2 新
f1 -ot f2 f1比f2 老
f1 -ef f2 f1和f2 都硬连接到同一个文件.
11、-gt和>,都是大于,但是>需要双括号(())
-eq 等于 -ne 不等于 -gt 大于
-ge 大于等于 -lt 小于 -le 小于等于
-z 字符串为NULL, -n 字符串不为null
if [ -n $a ] ... 在$a没有初始化的时候会出错,可以用if [ -n "$a" ]
也可以用 if [ $a ]
在Shell中,要注意三种条件的比较不相同:字符串类型用=之类,数值用eq之类,文件用-e
12、条件与和或
if [ $con1 ] && [ $con2 ]
if [ $con1 ] || [ $con2 ]
可以用-a代表and,-o代表or:if [ -d "$file1" -a -d "$file2" ],必须两个目录同时存在
13、内建变量:$IFS,来决定域和单词边界
14、字符串操作
(1)索引: expr index $string $substring
(2)提取子串: ${string:position:length},如果$string为*或@,则用位置参数
(3)子串削除: ${string#substring}和${string##substring} 注意:变量不要带$号
(4)从右端开始:${string%substring}和${string%%substring}
(5)第一次字符串替换:${string/substring/replacement}
全部匹配替换: ${string//substring/replacement}
开头部分匹配替换:${string/#substring/replacement}
结束部分匹配替换:${string/%substring/replacement}
(6)字符串长度:${#str}
15、参数替换
(1)设置默认值:${var-string}或${var:-string},只返回,不给var赋值
(2)${parameter=default},${parameter:=default} 默认值,同时给var赋值
(3)${parameter+alt_value},${parameter:+alt_value} 替代值
(4)${parameter?err_msg}, ${parameter:?err_msg} 没有设置则提示出错信息
16、数组
(1)${arr[@]}或${A[*]}全部数组
(2)${arr[0]}为第一个数组
(3)${#arr[@]}或${#arr[*]}为数组长度
(4)${$arr[1]}第二个数组的长度(数组下标从零开始)
(5)赋值:a="a b c def",则a为字符串;a=(a b c def),则a为四个成员的数组
17、数学运算
(1)$(())格式,括号里的变量前可以不加$号
(2)$((16#3f)),显示16进制的3F
(3)
18、标准输入、输出及错误信息
(1)echo abc.txt >abc.out >abc.err 第一个重定向给了标准输出,第二个重定向给了标准错误
(2)2>&1,是将标准错误导进标准输出;1>&2是将标准输出导进标准错误
echo abc.txt 1>file.txt 2>&1
(3)其实不指定序号的重定向是标准输出echo abc.txt >file.txt = echo abc.txt 1>file.txt
(4)在同时有输入和输出的情况下,stdout和stderr会比stdin更早,
阅读(1002) | 评论(0) | 转发(0) |