Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,而后执行这些功能,也能够说Shell脚本就是一系列命令的集合。git
Shell能够直接使用在win/Unix/Linux上面,而且能够调用大量系统内部的功能来解释执行程序,若是熟练掌握Shell脚本,可让咱们操做计算机变得更加轻松,也会节省不少时间。github
将一些复杂的命令简单化(平时咱们提交一次github代码可能须要不少步骤,可是能够用Shell简化成一步)数组
能够写一些脚本自动实现一个工程中自动更换最新的sdk(库)bash
自动打包、编译、发布等功能网络
清理磁盘中空文件夹less
总之一切有规律的活脚本均可以尝试一下函数
须要精密的运算的时候工具
须要语言效率很高的时候spa
须要一些网络操做的时候code
总之Shell就是能够快速开发一个脚本简化开发流程,并不能够用来替代高级语言
Shell能够被称做是脚本语言,由于他自己是不须要编译的,而是经过解释器解释以后在编译执行,和传统的语言相比多了解释的过程,因此效率会略低于传统的直接编译的语言。
#!/bin/bash echo"Hello World"
只须要打开文本编辑工具,编辑成以上的样子,而后保存成test.sh
cd到该目录下
chmod +x ./test.sh #给脚本权限
./test.sh #执行脚本
这样咱们便写出来了第一个最简单的脚本,下面咱们能够尝试着写一些复杂的脚本。
myText= "hello world" muNum= 100
这里须要注意的是,"=" 先后不能有空格,命名规则就和其余语言同样了。
myText= "hello world" muNum=100 echo $myText echo muNum
当你访问变量的时候,须要使用$,不然输出的将是纯文本内容,以下图所示:
运算符 含义 + 加法运算 - 减法运算 * 乘法运算 / 除法运算
#!/bin/bash echo"Hello World !" a=3 b=5 val=`expr $a+ $b` echo"Total value : $val" val=`expr $a- $b` echo"Total value : $val" val=`expr $a* $b` echo"Total value : $val" val=`expr $a/ $b` echo"Total value : $val"
这里面须要注意的就是,定义变量的时候"="先后是不能有空格的,可是进行四则运算的时候,运算符号先后必定要有空格,乘法的时候须要进行转义。
运算符 | 含义 |
---|---|
% | 求余 |
== | 相等 |
= | 赋值 |
!= | 不相等 |
! | 与 |
-o | 或 |
-a | 非 |
a=3 b=5 val=`expr $a/ $b` echo"Total value : $val" val=`expr $a% $b` echo"Total value : $val" if[ $a== $b] then echo"a is equal to b" fi if[ $a!= $b] then echo"a is not equal to b" fi
运算符 | 含义 |
---|---|
-eq | 两个数相等返回true |
-ne | 两个数不相等返回true |
-gt | 左侧数大于右侧数返回true |
-It | 左侧数小于右侧数返回true |
-ge | 左侧数大于等于右侧数返回true |
-le | 左侧数小于等于右侧数返回true |
#!/bin/sh a=10 b=20 if[ $a-eq $b] then echo"true" else echo"false" fi if[ $a-ne $b] then echo"true" else echo"false" fi if[ $a-gt $b] then echo"true" else echo"false" fi if[ $a-lt $b] then echo"true" else echo"false" fi if[ $a-ge $b] then echo"true" else echo"false" fi if[ $a-le $b] then echo"true" else echo"false" fi
运算符 | 含义 |
---|---|
= | 两个字符串相等返回true |
!= | 两个字符串不相等返回true |
-z | 字符串长度为0返回true |
-n | 字符串长度不为0返回true |
运算符 | 含义 |
---|---|
-d file | 检测文件是不是目录,若是是,则返回 true |
-r file | 检测文件是否可读,若是是,则返回 true |
-w file | 检测文件是否可写,若是是,则返回 true |
-x file | 检测文件是否可执行,若是是,则返回 true |
-s file | 检测文件是否为空(文件大小是否大于0,不为空返回 true |
-e file | 检测文件(包括目录)是否存在,若是是,则返回 true |
#!/bin/sh mtext= "hello"#定义字符串 mtext2= "world" mtext3= $mtext" "$mtext2#字符串的拼接 echo$mtext3#输出字符串 echo${#mtext3}#输出字符串长度 echo${mtext3:1:4}#截取字符串
#!/bin/sh array=(1 2 3 4 5) #定义数组 array2=(aa bb cc dd ee) #定义数组 value= ${array[3]}#找到某一个下标的数,而后赋值 echo$value#打印 value2= ${array2[3]}#找到某一个下标的数,而后赋值 echo$value2#打印 length= ${#array[*]}#获取数组长度 echo$length
#!/bin/sh echo"hello world" echohello world text= "hello world" echo$text echo-e "hello world"#输出而且换行 echo"hello world"> a.txt #重定向到文件 echo`date` #输出当前系统时间
printf 命令的语法:
printf format-string [arguments...]
参数说明:
format-string: 为格式控制字符串
arguments: 为参数列表。
#!/bin/bash # format-string为双引号 printf "%d %s\n" 1 "abc" # 单引号与双引号效果同样 printf '%d %s\n' 1 "abc" # 没有引号也能够输出 printf %s abcdef # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用 printf %s abc def printf "%s\n" abc def printf "%s %s %s\n" a b c d e f g h i j # 若是没有 arguments,那么 %s 用NULL代替,%d 用 0 代替 printf "%s and %d \n"
if
if-else
if-elseIf
case
#!/bin/sh a=10 b=20 if[ $a== $b] then echo"true" fi if[ $a== $b] then echo"true" else echo"false" fi if[ $a== $b] then echo"a is equal to b" elif[ $a-gt $b] then echo"a is greater than b" elif[ $a-lt $b] then echo"a is less than b" else echo"None of the condition met" fi
test$[num1] -eq $[num2] #判断两个变量是否相等
testnum1=num2 #判断两个数字是否相等
参数 | 含义 |
---|---|
-e file | 文件存在则返回真 |
-r file | 文件存在而且可读则返回真 |
-w file | 文件存在而且可写则返回真 |
-x file | 文件存在而且可执行则返回真 |
-s file | 文件存在而且内容不为空则返回真 |
-d file | 文件目录存在则返回真 |
#!/bin/sh fori in{1..5} do echo$i done for i in5 6 7 8 9 do echo$i done forFILE in$HOME/.bash* do echo$FILE done
#!/bin/sh COUNTER=0 while[ $COUNTER-lt 5 ] do COUNTER=`expr $COUNTER+ 1` echo$COUNTER done echo'请输入。。。' echo'ctrl + d 便可中止该程序' whilereadFILM do echo"Yeah! great film the $FILM" done
以上是while循环的两种用法,第一种是比较常规的,执行循环,而后每次都把控制的数加1,就可让while循环有退出的条件了。第二种是用户从键盘数据,而后把用户输入的文字输出出来。
break#跳出全部循环
breakn #跳出第n层f循环
continue#跳出当前循环
#!/bin/sh sysout(){ echo"hello world" } sysout
定义一个没有返回值的函数,而后调用该函数
#!/bin/sh test(){ aNum=3 anotherNum=5 return$(( $aNum+ $anotherNum)) } test result=$? echo$result
定义一个有返回值的函数,调用该函数,输出结果
#!/bin/sh test(){ echo$1#接收第一个参数 echo$2#接收第二个参数 echo$3#接收第三个参数 echo$##接收到参数的个数 echo$* #接收到的全部参数 } testaa bb cc
定义了一个须要传递参数的函数
$echo result > file #将结果写入文件,结果不会在控制台展现,而是在文件中,覆盖写
$echo result >> file #将结果写入文件,结果不会在控制台展现,而是在文件中,追加写
echo input < file #获取输入流
#!/bin/bash echo"-------Begin-------" git add . git commit -m $1 echo$1 git push origin master echo"--------End--------"