小Q :你可以从别人那里得到思想,你的思想方法,即熔铸思想的模子必须是
你自己的。 ----拉姆
就像我以前说的,因为有c等编程语言作基础,学起shell来感觉会很轻松,我都不知道要
怎么记笔记了,感觉还是那些知识,记得太详细的话,知识点太多,不过太零散,就大致
记了一下;
就像我们老师说的:关于编程,我不要求你什么语句都懂,我给你要求,你只要给我画出他
的流程图就行。是啊,其实编程为什么注重多看多写,就是要你遇到问题可以在你脑中搜
索你以前的模板,别的格式什么的都好说。
一:逻辑判断if/case
二:循环语句while/for
三:控制循环语句的指令
四:函数
五:数组
=========================================================================
一:逻辑判断if/case
if的三种结构: 1.if 【表达式】 2.if 【表达式】 3.if 【表达式】 then then then command command command fi else elif【表达式】 command then fi command elif ···· else command fi
表达式:
【 -s file 】 如果文件存在且非空
【 -f/d 名字 】 如果文件/目录存在
【 -r/w/x file 】 如果文件存在且可读/可写/可执行
【 $string1 != $string2 】 如果string1不等于string2
【 -n $string 】 如果string 非空(非0),返回0(true)
【 -z $string 】 如果string 为空
【 int1 -eq int2 】 如果int1等于int2 (不允许用=<>号)
-gt 大于 -lt 小于 -ne 不等于 -le 小于等于 -ge 大于等于
组合:
如果存在/tmp/目录并且(或者)当前目录下存在1.txt文件,则为真,输出0
【-d /tmp/】&&【-f 1.txt】 == 【-d /tmp/-d /tmp/ -a -f 1.txt】
【-d /tmp/】||【-f 1.txt】 == 【-d /tmp/-d /tmp/ -o -f 1.txt】
举例:
#!/bin/bash ##成绩脚本,90-100为优秀,70-80为一般,其他不及格 ##name and time read -p "请输入你的成绩" chengji if [ $chengji -ge 90 ] && [ $chengji -le 100 ] then echo "你的成绩很优秀" elif [ $chengji -ge 70 ] && [ $chengji -lt 90 ] then echo "你的成绩一般" else echo"你的成绩不级合格" fi
当有多个判断条件时,使用if显得太繁琐了,而使用和他功能类似的case,就显得简单清晰多了;
#格式: 变量=赋值 case $变量名 in in:在那个模式下 条件1) 判断条件 command1 ;; ;; :结束符 条件2) command2 ;; *) * :除了模式12的其他所有模式 默认执行的命令序列 ;; esac case结束标志
#举例:
#!/bin/sh ## 判断使用的那种系统 ## name and time SYSTEM=`uname -s` case $SYSTEM in Linux) echo "My system is Linux" echo "Do Linux stuff here..." ;; FreeBSD) echo "My system is FreeBSD" echo "Do FreeBSD stuff here..." ;; *) echo "Unknown system : $SYSTEM" echo "I don‘t what to do..." ;; esac
===========================================================================================
二:循环语句while/for
while一般用得比较少,常用死循环写监控脚本,格式如下: #!/bin/bash #!/bin/bash ##备注说明 ##count sum from 0-100 i=0 ;sum=0 while [表达式] while [ i -le 100 ] do do command sum=$[$sum+$i] ....... echo $sum done i=$[$i+1] done
应用举例:http://lovelace.blog.51cto.com/1028430/1211927
$ seq 1000 起始默认是 1,间隔默认也是1
$ seq 2 1000 间隔默认是1
$ seq 1 3 10 从1到10,间隔为3,结果是:1 4 7 10
#格式 #!/bin/bash #命令行下的for语句 ##remarks #工作中分发的脚本,IP为对象单位 for .. in 条件 do command ....... done
举例应用:
#法一 #法二 #!/bin/bash #!/bin/bash for i in `seq 1 1000000` for((i=1;i<10000000;i++));do do echo $i echo $i done done #法三 #法四命令行下 #!/bin/bash i=1 for i in ‘seq 1 10000‘;do while(($i<10000000)) echo $i ;done do echo $i i=`expr $i + 1` ##注:for输出以空格为分隔符 done
扩展:http://www.linuxdiyf.com/viewarticle.php?id=206569
==========================================================================================
三:控制循环语句的指令
continue:结束本次循环
break : 结束整个shell模块循环
exit: 结束整个脚本,退出不再执行
#举例说明: #!/bin/bash for i in ‘seq 1 4‘ 当为break时 continue exit do 输出:1 1 1 echo $i 1 1 1 if [ $i -eq 2 ] 2 2 2 then here 3 break 3 fi 4 echo $i 4 done here echo “here”
扩展:http://lovelace.blog.51cto.com/1028430/1211373
===========================================================================================
四:函数
#格式: #!/bin/bash #!/bin/bash ##make add funcation,sum two number funcation add () { 函数名() local sum=$[$1+$2] { echo $sum 函数体 } } a=1;b=3 ; add $a $b echo $add 输出 >> 4 去掉local:4 funcation可不加 local表示不允许模块外使用函数 4
七种用法:http://www.jb51.net/article/57951.htm
扩展一下:http://blog.chinaunix.net/uid-1924596-id-3048863.htm l
==========================================================================================
五:数组
数组赋值:
(1) array=(var1 var2 var3 ... varN)
(2) array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
(3) array[0]=var1
...
array[n]=varN
赋值 a=(0 1 2 3 4)
输出 echo ${a[*]} >>> 0 1 2 3 4 把*换成@也可以
echo ${a[1]} >>> 1 指定输出
echo ${#a[@]} >>> 5 输出元素个数
更改 a[3]=8;echo ${a[*]} >>> 0 1 2 8 4
增加 a[5]=3;echo ${a[@]} >>> 0 1 2 8 4 3
删除数组 unset a;echo ${a[*]} >>> 无输出
删除元素 unset a[2];echo ${a[@]} >>> 0 1 8 4 3
当然我们也可以以字符串做数组;
例题: #!/bin/bash #读入n次字符串,每次输入的字符串保存在数组array里 i=0 n=5 while [ "$i" -lt $n ] ; do echo "Please input strings ... `expr $i + 1`" read array[$i] b=${array[$i]} echo "$b" i=`expr $i + 1` done #!/bin/bash #将字符串里的字母逐个放入数组,并输出到“标准输出” chars=‘abcdefghijklmnopqrstuvwxyz‘ for (( i=0; i<26; i++ )) ; do array[$i]=${chars:$i:1} echo ${array[$i]} done
其中用到截取字符串的知识,见下:
http://beibing.blog.51cto.com/10693373/1703222
或http://bbs.chinaunix.net/thread-1779167-1-1.html