Linux下的shell脚本
Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本,常见的脚本解释器有:
bash:是Linux标准默认的shell。bash由Brian Fox和Chet Ramey共同完成,是BourneAgain Shell的缩写,内部命令一共有40个。
sh: 由Steve Bourne开发,是Bourne Shell的缩写,sh 是Unix 标准默认的shell。
另外还有:ash、 csh、 ksh等。
关于注释的问题
: 在shell中使用#进行注释,注意,sh里面没有多行注释
,只能每一行加一个#号
;
- shell脚本格式以 #!/bin/bash 开头
#!/bin/bash/ 末尾多一个/
会报错-bash: ./zk_start.sh: /bin/bash/: bad interpreter: Not a directory
#!/bin/bash
echo "helloworld"
- shell执行方式
首先赋予执行权限
chmod 777 helloworld.sh
./helloworld.sh
/opt/helloworld.sh
sh ./helloworld.sh
bash ./helloworld.sh
bash opt/helloworld.sh
sh ./helloworld.sh
sh /opt/helloworld.sh
- shell变量
变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量
系统变量:$HOME、$PWD,$SHELL、$USER
等等
[root@master opt]# echo $HOME
/root
[root@master opt]# echo $PWD
/opt
[root@master opt]# echo $USER
root
[root@master opt]# echo $SHELL
/bin/bash
显示当前shell中的所有变量:set
[lisi@localhost ~]$ set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=141
....
定义变量:变量=值(=等号左右没有空格)
[lisi@localhost ~]$ A=1
[lisi@localhost ~]$ echo $A
1
撤销变量: unset 变量
[lisi@localhost ~]$ unset A
[lisi@localhost ~]$ echo $A
声明静态变量: readonly 变量=值
[lisi@localhost ~]$ readonly A=1
[lisi@localhost ~]$ A=2
-bash: A: readonly variable
[lisi@localhost ~]$ echo $A
1
[lisi@localhost ~]$ unset A
-bash: unset: A: cannot unset: readonly variable
定义变量规则:
变量名称可以由字母、数字和下划线组成,但不能以数字开头
等号两侧不能有空格
变量名称一般习惯为大写
将命令的返回值赋给变量:
A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la)等价于反引号
echo $A
位置参数变量
$n (n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十个参数需要大括号,如${10})
$* (这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (这个变量代表命令行中所有的参数,$@把每个参数区分对待)
$# (这个变量代表命令行中所有参数的个数)
#!/bin/bash
echo "$1"
echo "$2"
echo "$*"
echo "$@"
echo "$#"
[root@master opt]# ./p.sh 10 20
10
20
10 20
10 20
2
预定义变量
$$ (当前进程的进程号:PID)
S! (后台运行的最后一个进程的PID)
$? (最后一次执行的命令的返回状态。
如果这个变量的值为0证明上一个命令正确执行,
如果非0,则上一个命令执行不正确)
#!/bin/bash
echo "$$"
./helloworld.sh & 后台进程
echo "S!" #打印后台进程
echo "$?"
[root@master opt]# ./d.sh
1817
1818
0
运算符
$((运算符))
[root@master ~]# A=$((2+3))
[root@master ~]# echo $A
5
$[运算符]
[root@master ~]# A=$[2+8]
[root@master ~]# echo $A
10
expr m + n 运算符之间有空格
[root@master ~]# expr 2 + 5
7
expr m - n 运算符之间有空格
[root@master ~]# expr 2 - 5
-3
(2+3)*4示例
A=$[(2+3)*4]
[root@master ~]# A=$[(2+1)*5] #注意没空格
[root@master ~]# echo $A
15
[root@master ~]# expr `expr 2 + 5` \* 5 #注意有空格
35
推荐使用 $[运算符]
判断
1.[ condition ] 注意condition前后要有空格
案例
[ hello ] 返回true
[] 返回false
[condition]&&echo OK || echo notok 条件满足,执行后面的语句
两个整数之间比较
=字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
按照文件权限判断
-r 有读的权限
-w 有写的权限
-x 有执行的权限
按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在并且是一个常规的文件
-d 文件存在并是一个目录
例子
[ 23 -ge 22 ]
[ -w student.txt ]
[ -e /root/install.sh]
if判断
if[条件判断是];then
程序
fi
if[条件判断是]
then
程序
fi
注意 [条件判断式],中括号和条件判断式之间有空格
#!/bin/bash
if [ $1 -eq "123" ]
then
echo "123"
elif [ $1 -eq "456" ]
then
echo "456"
fi
[root@master opt]# ./if.sh 123
123
[root@master opt]# ./if.sh 456
456
case语句
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...其他分支...
*)
;;
esac
示例:输入1输出1;输入2,输出2,输入其他,输出other
#!/bin/bash
case $1 in
"1")
echo "1"
;;
"2") echo "2"
;;
*)
echo "other"
;;
esac
[root@master opt]# ./cash.sh 1
1
[root@master opt]# ./cash.sh 2
2
[root@master opt]# ./cash.sh 3
other
循环
1)for 变量 in 值1 值2 值3 ...
do
程序
done
#!/bin/bash
for i in "$*"
do
echo "$i"
done
for j in "$@"
do
echo "$j"
done
执行
[root@master opt]# ./for1.sh 2 4 6 8
2 4 6 8
2
4
6
8
2)for((初始值;循环控制条件;变量变化))
do
程序
done
1加到100
#!/bin/bash
s=0
for((i=1; i<=100; i++))
do
s=$[$s+$i]
done
echo $s
./for2.sh
5050
3)while
while[ 条件判断式 ]
do
程序
done
#!/bin/bash
s=0
i=0
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo "$s"
./while.sh
5050
read读取控制台的输入
read(选项)(参数)
选项
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒)
[root@master opt]# read -p "input your name " NAME
input your name xiaoming
[root@master opt]# echo $NAME
read -t 3 -p "input your name " NAME #3秒内没输入 NAME的值为null
自定义函数
[ function ] funname[()]
{
Action;
[return int;]
}
funname
注意:
(1) 必须在调用函数地方之前,先声明函数
(2) 函数返回值,只能通过$?系统变量获得,可以显示加:
return返回,如果不加,将以最后一条命令运行结果,作为返回值
return后跟数值n
#!/bin/bash
function sum(){
s=0
s=$[$1+$2]
echo "$s"
}
read -p "input num1 " NUM1
read -p "input num2 " NUM2
sum $NUM1 $NUM2;
[root@master opt]# ./function.sh
input num1 1
input num2 4
5