shell编程笔记
以前做linux开发时学过一些shell 编程,时间久了没接触现在竟然忘干净了,后来又开始写其他脚本语言,有点混了,写得时候一脸懵逼,于是现在记下来。部分内容摘录字其他博客,文中已作标注,表示感谢!
1. sh/bash/dash/csh/Tcsh/ksh/pdksh
- sh:全称是Bourne Shell,是Unix最初使用的shell,在所有Unix上均可以使用,但是在处理和用户交互上做得没有其他几种好
- bash:全称是Bourne Again Shell,是原本linux系统默认的,是sh的扩展,和sh完全兼容,并且在sh的基础上增加了许多特性,可以提供命令补全,命令编辑和命令历史等功能。很多的linux系统的sh是指向bash的符号链接
- dash:有人认为bash过于复杂,为了获取更快的脚本执行速度,dash应运而生,dash不是为了交互,其速度更快,但是功能也少很多,语法严格遵守POSIX标准。在ubuntu中sh已经指向了dash
- csh:全称C shell,是sh的变种,语法和C语言很类似
- Tcsh是LInux提供的csh的一个扩展,Tcsh包括命令行编辑,可编程单词补全,拼写校正,历史命令替换,作业控制和类似C语言的语法,他不仅和Bash Shell提示符兼容,而且还提供比Bash Shell更多的提示符参数。
- ksh;全称Korn Shell,集合了C Shell和Bourne Shell的优点并且和Bourne Shell完全兼容
- pdksh,是linux系统提供的ksh的扩展,支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序
在脚本的首行加上#!/bin/bash
,脚本会调用bash执行,同样地,对于php脚本来说,在首行加上#!/usr/bin/php
脚本会解析称php脚本执行,不过注意给脚本加上可执行权限chmod +x test.php
2. 变量
shell脚本中变量默认是字符串变量,如果要定义整型要使用declare -i aa
,不过常用的还是字符串,即使是数值加法也可以使用字符串变量,如
a=1
b=$((a+2))
echo $b
结果是 3
shell脚本中的$符号是取变量的值的意思,取值的时候如果不发生歧义可以不加{}
,但是有歧义时必须加,比如 echo "dsadsadsa$abcdssa"
, 这个时候不加括号的话就不知道$的作用范围是多少了。
注意等号两边不能有空格,在shell脚本中,空格是命令/参数之间的分割符。
3. 字符串
- 字符串拼接, 把两个变量直接连起来写就行了,注意中间不能有空格
a="abc";b="dfg"; c=$a$b;echo $c
结果是abcdfg
- 单引号和双引号:单引号内不可以在添加变量,输出时会原样输出,而双引号可以
- 获取字符串长度:#
。如${#string}
, 注意必须要有大括号,因为$
和#
结合优先级高,而$#
代表的则是传入shell脚本的参数总个数(相应地,$1~$n
分别代表各参数值)
- 提取字符串:如str="abcd";echo ${string:1:2}
, 结果是bc
, 索引从0开始
- 查找子字符串位置:如str="abcdefg"; echo `expr index "$str" bc`
, 结果是2,其中expr用于执行整数运算(包括加减乘除等),反引号代表的是叫将反引号内部的内容按照shell命令来执行。
4. 特殊符号
-
$?
返回上一条命令的退出状态(返回值) (refer2)
-
\
, 转义,含义同c语言 -
`
, 反引号,命令替换 通配符(虽然看起来像是正则表达式,但是是不同的,注意别混淆)(来源refer1):
;
shell脚本中分号是分隔符,当一行中只有一条命令时不需用分号,多条命令时需要用分号隔开。行尾都不需要分号。 使用双分号(;;
)可以终止case选项-
:
- 空命令: 等价于“NOP”(no op,一个什么也不干的命令)。也可以被认为与shell的内建命令true作用相同。
:
命令是一个bash的内建命令,它的退出码(exit status)是(0)while :
do
something
done - 变量扩展/子串替换:在与
>
重定向操作符结合使用时,将会把一个文件清空,但是并不会修改这个文件的权限。如果之前这个文件并不存在,那么就创建这个文件。: > test.sh # 文件“test.sh”现在被清空了
# 与 cat /dev/null > test.sh 的作用相同
# 然而,这并不会产生一个新的进程, 因为“:”是一个内建命令
- 环境变量中,用作分隔符
- 空命令: 等价于“NOP”(no op,一个什么也不干的命令)。也可以被认为与shell的内建命令true作用相同。
-
>
和>>
, 用于文件时,前者会覆盖员原文件,后者会在原文件后面追加 -
?
, 除了上面说到的可以做通配符外,还可以用于三元操作符((x=5<10?1:0))
echo $x
-
()
,[]
,{}
, (refer 3)
5. if语句
如(refer 4)
if, elif 后面都要有空格,等号两边要有空格,[] 两边要有空格,当else没有对应的statement时,else应省略不写
6. while
7. for
<未完待续>
refer:
1. http://www.cnblogs.com/chengmo/archive/2010/10/17/1853344.html
2. http://blog.csdn.net/yixianfeng41/article/details/56313899
3. http://blog.csdn.net/tttyd/article/details/11742241
4. http://151wqooo.blog.51cto.com/2610898/1173381
5. while: http://lovelace.blog.51cto.com/1028430/1211927