shell拥有强大的程序设计能力。且很容易学习。
我们关注shell的 :
1. 变量:字符串,数字,环境和参数
在使用时,不需要事先声明。(默认情况下变量偶读被当做字符串来存储,即使他们被赋值为数值) 。
对大小写敏感(貌似编程语言里面没有不敏感的),
变量前面加上“$”符号 使用echo打印变量(字符串里面有空格,则必须用引号括起来,且等号两遍不能有空格)
使用read读入一个数据。
#!/wxddb/sh
myvar="Hi there"
echo $myvar
echo "$myvar"
echo '$myvar'
echo "$myvar"
echo $myvar
echo Enter some text
read myvar
echo '$myvar' now equals $myvar
exit 0
环境和参数有点类似于转义字符,额,效果上哈。 环境变量:$HOME 主目录 $PATH以冒号分隔的用来搜索命令的目录列表 $IFS 输入域分隔符、 $0 表示脚本的名字 $#表示输入参数个数 $$脚本的进程号 参数变量(脚本程序即使没有传递任何参与,环境变量$#依然存在,只不过为0罢了)$1、$2表示第几个参数 $*在一个变量中列出所有参数,并用IFS中的第一个字符分隔开 $@作为$*的一种变体,不适用IFS环境变量,当IFS为空时,参数的值不会结合在一起
2.条件:shell中的布尔值
使用test 或 [ 命令 (此处的 [ 表示判断,是一个指令,所以必须在他和被检查的条件之间留出空格。)
test 命令可以使用的条件类型有三类:包括字符串比较,算数比较和与文件有管的条件测试。(test命令真心大虎啊,一条指令直接了三种类型,而且还是搞定的如此彻底,真心犀利,膜拜一下)具体如下:
字符串比较 string1 = string2 两字符串相等这结果为真 string1 != string2 两字符串不同则结果为真 (尤其要注意此处的等于号两边必须都有一个空格,否则将会被认为是赋值,恩,和刚刚的变量赋值正好对应了)
-n string 字符串部位空则结果为真 -z string 字符串为空(一个空串)则结果为真
作为一种良好的编程习惯,我们最好在对字符串作比较时,对字符串加上“”,这样可以防止因为该字符串为空串导致的语法错误。
数值比较 expression1 -eq expression2 两个表达式相等 expression1 -ne expression2 两表达式不相等
expression1 -gt expression2 表达式1大于(greater than(拜服了,这翻译))表达式2
expression1 -ge expression2 表达式1大于等于表达式2
expression1 -lt expression2 表达式1小于表达式2 expression1 -le expression2 表达式1小于等于表达式2
文件条件测试(重点来了!!!)
-d file 若文件为目录则结果为真(这个memory)
-e file 若文件存在则为真。注意历史上该选项不可移植,通常用 -f
-f file 若文件时一个普通文件则结果为真
-g file 如果文件的suid位被设置则结果为真 -u file 若文件的suid位被设置则结果为真 //弄了两个?hpdxrk的伤感啊
-r file 如果文件可读则结果为真 -s file 若文件长度不为零则结果为真 -w file 若文件可写则结果为真 -x file 若文件可执行,则结果为真
3.程序控制:if、elif、for、while、until、case
if后面加上then ,如果不换行就要加上“;”,换行的话就不加 if 条件后面加上then 然后才是执行语句,别忘了then哦
使用自加一的操作方法 foo=$(($foo+1)); (或者使用foo=$((foo+1)),但是要注意的是,括号是不能少的了,恩,如此来看,为了防止记错了,还是用前者吧)
until的使用环境:我们希望循环一直执行下去,知道某些事情发生。
在使用case命令中,要注意每个模式行之后都以双分号“;;”结尾。 通常在最后用一个单独的“*”来表示匹配任何可能的字符,以确保如果没有字符串得到匹 配,case也可以执行默认的动作。 使用case时,通常把最精确的匹配放在最开始,把最一般化的匹配放在最后面。
4.命令列表。
AND 列表结构,指and连接的所有逐条执行成功的情况下,才会去执行下一条指令,所有指令均执行成功,则该and结构为真
OR 列表结构,指or连接的所有指令顺续执行直到有一条命令成功为止(注意,只要有一条命令执行成功,该or判断结束,后续未判断的指令不再继续判断)。若 全部都执行不成功,则该or结构为假
5.函数
函数调用时,只使用函数名即可(后面不要加上“()”),函数可以直接使用全局变量,使用local 关键字定义的变量为局部变量,如果与某一全局变量相同,则在 函数局部范围内,该局部变量将会覆盖全局变量(注意,是在函数范围内哦)
6.shell内置命令
trap命令用于指定在接受到信号后将要采取的行动。(哇咔咔,so good,可以考虑在接受到信号之后将线程由睡眠切换成ready状态)
7.获取命令的执行结果
8.here文档。