shell编程
shell编程
1.shell简介
-
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。
-
终端登录成功进去时,实际上上打开了了一个shell进程
- 命令在shell提示符(可配置)后键入,提示符通常为一个“$”或“#”,超级用户默认为 “#”
2.终端常用快捷键
-
中断当前命令(ctrl+c)
-
结束输入(ctrl+d),如果在shell中使用,使得用户注销。
-
重复刚才键入过的命令(上下光标键,类似dos操作系统中的doskey)
-
命令和文件补全(tab)
-
很多程序的退出命令(q)
-
同一个终端设置多标签(ctrl + shift + t)
-
光标移动到当前行的行首(ctrl + a)
-
光标移动到当前行的行尾(ctrl + e)
3.shell变量
3.1变量类型
局部变量
局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。环境变量
所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。shell变量
shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
3.2变量的命名
- 格式: 变量名=值(等号两边不能有空格)
[root@localhost test]# xx=88
3.3变量的引用
格式: $变量名
[root@localhost test]# echo $xx
88
3.4变量的取消
格式: unset 变量名
[root@localhost test]# unset xx
[root@localhost test]# echo $xx
[root@localhost test]# (输出为空)
3.5环境变量
语法: export
定义环境变量(影响所有子shell):
[root@localhost test]# export yy=20
把本地变量转化为环境变量
[root@localhost test]# export xx
4.shell脚本
4.1创建脚本文件步骤
#!/bin/bash
echo “Hello,welcome to Linux world”
echo “Today is: $(date)”
Step2
设置执行权限: chmod u+x first.sh
Step3
执行脚本: ./first.sh 或 sh first.sh 或 bash first.sh
4.2常用的Shell预定义变量。
- $#:位置参数的数量。
- $*:所有位置参数的内容。
- $?:命令执行后返回的状态。
- $$:当前进程的进程号。
- $!:后台运行的最后一个进程号。
- $0:当前执行的进程名。
4.3运行一个关于命令位置参数的脚本文件 mysh.sh
#!/bin/bash
echo “完整的命令行:$0$*”
echo “程序是:$0”
echo “所有的参数:$*”
echo “参数个数:$#”
echo “第1个参数: $1”
运行结果如下:
[root@localhost test]# ./mysh.sh aa bb cc dd
“完整的命令行:./mysh.shaa bb cc dd”
“程序是:./mysh.sh”
“所有的参数:aa bb cc dd”
“参数个数:4”
“第1个参数: aa”
4.4Shell变量及表达式 –缺省参数
问题:如果参数没输入,但程序中需要怎么办?
VAR=${参数-word} :有则用参数,否则用word
VAR=${参数=word} :有则用参数, 否则两个用word
VAR=${参数? word} :有则用参数,否则报错退出
VAR=${参数+word} :有则用word,否则不做
注意:上述四条经常用在位置参数的使用上。
测试脚本:
#!/bin/bash
LEFT=${1-100} #第一个参数缺省为100
RIGHT=${2-100} #第二个参数缺省为100
RE=`expr $LEFT + $RIGHT` #进行相加
echo "$LEFT + $RIGHT = $RE"
测试结果:
[root@localhost test]# ./mysh.sh
100 + 100 = 200
[root@localhost test]# ./mysh.sh 50
50 + 100 = 150
[root@localhost test]# ./mysh.sh 50 50
50 + 50 = 100
4.5-Shell变量表达式-概述
Shell中的变量表达式主要利用各种测试语句、条件来获得字符串、文件、数字等所处的状态。
表达式的操作符主要包括:
字符操作符: =, !=, -n , -z
数字操作符:-eq, -ne, -ge, -gt, -le, -lt
逻辑操作符:!, -a, -o
文件操作符:-d, -f, -L,-r, -w, -x, -s, -e, -z,-c, -b,-o
可以使用 test 命令来测试上述各种表达式状态。
test是Shell程序中的一个表达式,通过和Shell提供的if等条件语句相结合可以方便地测试字符串、文件状态和数字。其语法如下:
test [表达式]
表达式所代表的操作符有字符串操作符、数字操作符、逻辑操作符以及文件操作符。
4.6-Shell变量表达式-字符操作符
作用:测试字符串是否相等,长度是否为零,字符串是否为NULL。
常用的字符串比较符号如下。
=:比较两个字符串是否相同,相同则为“是”。
!=:比较两个字符串是否相同,不同则为“是”。
-n:比较字符串的长度是否大于0,如果大于0则为“是”。
-z:比较字符串的长度是否等于0,如果等于0则为“是”。
测试脚本
#!/bin/bash
A="abcd"; test $A = "abcd"; echo $?
A=" "; test –z $A; echo $?
test –n $A; echo $?
test –z $A; echo $?
测试结果
[root@localhost test]# ./mysh.sh
0
0
0
0
#0代表为 是
4.7-Shell变量表达式-数字操作符
test语句不使用“>?”类似的符号来表达大小的比较,而是用整数来表示,常用的数字比较符号如下。
-eq:相等。
-ge:大于等于。
-le:小于等于。
-ne:不等于。
-gt:大于。
-lt:小于。
测试脚本
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
测试结果
[root@localhost test]# ./mysh.sh
两个数相等!
4.8-Shell脚本流程控制—分支语句if
- 单分支(常见)
if [ 条件 ]
then
语句
fi
或者(常见)
if [ 条件 ]; then
语句
fi
- 双分支
if [ 条件 ]
then
语句
else
语句
fi
- 多分支
if [ 条件 ];then
语句
elif [ 条件 ];then
语句
else
语句
fi
注意:[ 条件 ]中,条件前后必须留有一个空格
[];then连在一起写,必须加上分号;
测试脚本
a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
测试结果
[root@localhost test]# ./mysh.sh
a 小于 b
4.9-Shell脚本流程控制—for循环
语法1:
for 变量 [ in 数值列表]
do #省略 [ ] 则表示取编所有位置参数
命令
done
语法2:
len=10; #指定循环次数
for (( i=0; i< “$len”; i=i+1 ))
do
命令
done
测试脚本
#!/bin/bash
#第一种for循环
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
#第二种for循环
sum=0
for((i=1;i<101;i=i+1))
do
let sum=sum+$i
done
echo $sum
测试结果
[root@localhost test]# ./mysh.sh
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
5050
4.9-Shell脚本流程控制—while循环
语法:
while 条件命令为真
do
命令
done
无限循环:
while :
do
命令
done
测试脚本
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
测试结果
[root@localhost test]# ./mysh.sh
1
2
3
4
5