Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写―些程序。
Shell脚本的执行方式
脚本格式要求
1)脚本以#!/bin/bash开头(可省略)
2)脚本需要有可执行权限
3)为了阅读方便,一般后缀为.sh
脚本的常用执行方式
方式1(输入脚本的绝对路径或相对路径)
1)首先要赋予helloworld.sh 脚本的+x权限
2)执行脚本
方式2(sh 脚本)
说明:不用赋予脚本+x权限,直接执行即可。
例如:
先新建一个shell文件vim myShell.sh
在里面写入:echo "hello world!" wq保存退出
赋予shell文件可执行权限:chmod 744 myShell.sh
用相对路径方式执行:./myShell.sh 或绝对路径方式执行:/root/shell/myShell.sh或用sh 脚本方式执行:sh ./myShell.sh
Shell的变量
shell的变量的介绍
1)Linux Shell中的变量分为,系统变量和用户自定义变量。
2)系统变量:$HOME、$PWD、$SHELL、$USER等等
例如: echo $HOME
3)显示当前shell中所有变量:set。
shell变量的定义
基本语法
1)定义变量:变量=值
2)撤销变量: unset 变量
3)声明静态变量:readonly 变量,注意:不能unset
例如:
A=100
echo "A=$A"
#输出:A=100
unset A
echo "A=$A"
#输出:A=
readonly A=101
unset A
echo "A=$A"
#输出报错
shell变量
shell变量的定义
1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2)等号两侧不能有空格。
3)变量名称一般习惯为大写。
将命令的返回值赋给变量
1)A=ls -la反引号,运行里面的命令,并把结果返回给变量A
2)A=$(ls -la)等价于反引号
例如:
RESULT=`ll /home`
echo $RESULT
MY_DATE=$(date)
echo "date=$MY_DATE"
设置环境变量
基本语法
1)export 变量名=变量值 (功能描述:将shel1变量输出为环境变量)
2)source 配置文件 (功能描述:让修改后的配置信息立即生效)
3)echo $变量名 (功能描述:查询环境变量的值)
注意:在输出JAVA_HOME环境变量前,需要让其生效source /etc/profile
例如:
1)在/etcprofile文件中定义TOMCAT_HOME环境变量
#定义一个自己的环境变量
TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME
2)查看环境变量TOMCAT_HOME的值
echo STOMCAT_HOME
多行注释:
:<<! 注释内容
!
位置参数变量
介绍
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如: ./myshell.sh 100 200 ,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息
基本语法
$n (功能描述: n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$# (功能描述:这个变量代表命令行中所有参数的个数)
例如:
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数:$#"
用 ./position.sh 30 60 执行
结果:
./position.sh 30 60
30 60
30 60
参数个数:2
预定义变量
基本介绍
就是shel设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
$$ (功能描述:当前进程的进程号(PID) )
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行﹔如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
例如:
在一个she1l 脚本中简单使用一下预定义变量
echo "当前的进程号=$$"
#加& 后台的方式运行 myShell.sh
./myShell.sh &
echo "最后的进程的号=$!"
echo "执行的值=$?"
运算符
基本介绍
学习如何在shel1中进行各种运算操作。
基本语法
1)"[运算式]”
- expr m + n
注意expr运算符间要有空格 - expr m - n
- expr *,/,% 乘,除,取余
例如:计算(2+3)x4的值
#第一方式$()
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"
#第二种方式[] 推荐使用
RESULT2=$[(2+3)*4]
echo "result2=$RESULT2"
#使用expr
ITEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo " result3=$RESULT3"
请求出命令行的两个参数的和:
SUM=$[$1+$2]
echo "SUM=$SUM""
条件判断
基本语法
[ condition ] (注意condition前后要有空格)
非空返回true,可使用$?验证(0为true , >1为false)
[ aaa ] 返回true
[] 返回false
[ condition ] && echo oK || echo notok 条件满足,执行后面的语句
判断语句
常用判断条件
1)两个整数的比较
=字符串比较
-lt小于
-le小于等于
-eq等于
-gt大于
-ge大于等于
-ne不等于
2)按照文件权限进行判断
-r有读的权限
-w有写的权限
-x有执行的权限
3)按照文件类型进行判断
-f文件存在并且是一个常规的文件
-e文件存在
-d文件存在并是一个目录
例如:
案例1:"ok"是否等于"ok"
f [ "ok" = "ok" ]
then
echo "equal"
fi
案例2:23是否大于等于22
if [ 23 -gt 22 ]
then
echo "大于"
fi
案例3:/root/shell/aaa.txt目录中的文件是否存在
if [ -e / root/shell/aaa.txt ]
then
echo "存在"
fi
流程控制
if判断
基本语法
if[条件判断式];then
程序
fi
或者
if[条件判断式]
then
程序
elif[条件判断式]
then
程序
fi
注意事项:(1)[条件判断式],中括号和条件判断式之间必须有空格
(2)推荐使用第二种方式
案例:请编写一个shell程序,如果输入的参数,大于等于60,则输出"及格了",如果小于6o,则输出“不及格"
if [ $1 -ge 60 ]
then
echo "及格了"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
casse语句
基本语法
case \$变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
...省略其他分支..
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
案例﹔当命令行参数是1时,输出"周一",是2时,就输出"周二",其它情况输出“other"
case $1 in
"1")
echo "周—"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
for循环
基本语法
for 变量 in 值1 值2 值3...
do
程序
done
案例:打印命令行输入的参数
#使用$*
for i in "$*"
do
echo "the num is $i"
done
echo "========"
#使用$@
for j in "$@"
do
echo "the num is $j"
done
"$*"和"$@"不加引号也可,效果相同
基本语法2
for((初始值;循环控制条件;变量变化))
do
程序
done
案例:从1加到100的值输出显示
#定义一个变量
SUM=0
for((i=1;i<=100; i++))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
while循环
基本语法1
while [条件判断式]
do
程序
done
案例:从命令行输入一个数n,统计从1+..+ n的值是多少?
SUM=0
i=0
while [ $i -le $1 ]
do
SUM=$[$SUM+$i]
i=$[$i+1]
done
echo "sum= $SUM"
read读取控制台输入
基本语法
read (选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒〉,如果没有在指定的时间内输入,就不再等待了。
参数:
变量:指定读取值的变量名
案例1:读取控制台输入一个num值
read -p "请输入一个数num1=" NUM1
echo "你输入的值是num1=$NUM1"
案例2:读取控制台输入一个num值,在10秒内输入
read -t 10 -p "请输入一个数num2=" NUM2
echo "你输入的值是num2=$NUM2"
函数
函数介绍
shell编程和其它编程语言一样,有系统函数,也可以自定义函数。
系统函数
. basename基本语法
功能:返回完整路径最后/的部分,常用于获取文件名
basename [pathname] [suffix]
basename [string] [suffix] (功能描述: basename命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
案例:请返回/home/aaa/test.txt的“test.txt”部分
basename /home/aaa/test.txt
会返回test.test
如果输入:basename /home/aaa/test.txt .txt
则会返回test
. dirname基本语法
功能:返回完整路径最后/的前面的部分,常用于返回路径部分
dirname文件绝对路径〈功能描述:从给定的包含绝对路径的文件名中去除文件名〈非目录的部分)然后返回剩下的路径(目录的部分))
案例:请返回/home/aaa/test.txt 的/home/aaa
dirname /home/aaa/test.txt
会返回/home/aaa
自定义函数
基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname [值]
案例:计算输入两个参数的和
function getSum(){
SUM=$[$n1+$n2]
echo "和是=$SUM"
}
read -p "请输入第一个数n1" n1
read -p "请输入第二个数n2" n2
调用getSum
getsum $n1 $n2