最近发现公司不少脚本都是shell脚本,平时有些命令仍是能用的,可是就没写过shell脚本,致使有些公司项目里面的bash脚本看不懂。因此学习下关于shell的内容。java
1、shell基本概念linux
1.运行方式 shell
解释运行,底层是C写好的执行,至关于经过函数名调用函数。bash
交互式:输入一个shell命令就执行。函数
批处理:把一连串个shell命令经过判断,循环等控制语句写到文件里面,一次性执行。
学习
2.bash分类:Unix默认使用的shell是sh,linux默认使用的shell是bash。还有ash,ksh,tcsh,等等。
spa
2、第一个shell脚本
code
#!/bin/bash echo "Hello World !"
#!/bin/bash 是约定的标记,告诉系统须要经过什么解释器来执行。进程
chmod +x ./test.sh #使脚本具备执行权限 ./test.sh #执行脚本
chmod +x ./test.sh 让test.sh标记为可执行脚本。执行的以后若是不加./ 则系统会从/bin /sbin /usr/bin /usr/sbin等path路径下找文件。it
3、bash语法
1.定义变量的时候不要加上"$"符号,定义以及赋值的时候“=”和变量名以及值不能有空格 NAME=JACK是对的 NAME = JACK就是无效的。
2.readonly NAME 只读变量
3.read NAME 从command中读取输入值赋给NAME
4.unset NAME 删除变量
5.特殊的变量
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的全部参数。
$@ 传递给脚本或函数的全部参数。被双引号(" ")包含时,与 $* 稍有不一样,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的全部参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出全部参数。
可是当它们被双引号(" ")包含时,"$*" 会将全部的参数做为一个总体,以"$1 $2 … $n"的形式输出全部参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出全部参数。
echo `expr $a + $b`
`expr `里面能够写表达式
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 10。
* 乘法 `expr $a \* $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
关系运算符列表
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,若是是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,若是是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大等于右边的,若是是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,若是是,则返回 true。 [ $a -le $b ] 返回 true。
6.if 语句
a=100 b=120 if [ $a == $b] then echo '$a == $b' else echo '$a != $b' fi
#!/bin/bash a=100 b=120 if [ $a == $b ] then echo '$a == $b' elif [ $a -gt $b ] then echo '$a > $b' else echo '$a < $b' fi
7.case
#!/bin/bash var="$1" case $var in "ab") echo "aaa" ;; bc) echo "bbb" ;; *) echo "`basename $0`:usage: [-a] | [-b]" ;; esac
8.for循环
#!/bin/bash for str in "a" "b" "c" do echo $str done
#!/bin/bash for FILE in $HOME/.vi* do echo $FILE done
9.while循环
count=0 while [ $count -lt 10 ] do echo "$count" count=`expr $count+1` done
10.函数
hello() { echo "hello $1" } hello "Jack"
11.输入输出重定向
ps -ef | grep java > test.txt #会覆盖test.txt内容 ps -ef | grep java >> test.txt #追加内容到test.txt中
12.引入其余shell文件
#!/bin/bash name="jack" hello(){ echo "hello" }
#!/bin/bash . ./function.sh hello echo $name