shell学习(一)
shell是什么
shell是一个命令解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。
shell变成快速入门
- 脚本以#!/bin/bash开头。
- 脚本需要有可执行权限。
- 编写一个hello world示例程序,命令行输入vim myShell.sh
#!/bin/bash
echo "hello world!"
- :wq保存退出。chmod +x myShell.sh赋予可执行权限,调用执行 ./myShell.sh(相对路径和绝对路径都可以执行)
- 方式二:如果不赋予可执行权限,调用shell脚本用sh ./myShell.sh来执行,不推荐这种方式。
shell变量
1. shell变量的定义,Linux shell变量分为两种,系统变量和自定义变量。
变量规则:
变量名称可以由字母,数字,下划线组成,但是数字不能开头;
等号两侧不能有空格,否则会报错;
变量名称一般习惯为大写。
将命令的返回值赋值给变量:
使用反引号``将命令括起来
A=`1s-1a`反引号,运行里面的命令,并把结果返回给变量A;
RESULT=`ls -l /home`
echo $RESULT
使用$()来执行也可以,推荐使用。
A=$(1s-1a)等价于反引号
MY_DATE=$(date)
echo "date=$MY_DATE"
系统变量:$HOME $PWD $SHELL $USER等等,使用方法:echo $HOME
echo "PATH = $PATH"
echo "USER= $USER"
显示当前shell中所有变量:set
set | more
基本语法:
(1)定义变量: 变量 = 值
A=100
echo "A=$A"
输出结果 A=100
(2)撤销变量:unset 变量
unset A
echo "A=$A"
输出结果 A= unset之后A的值没有了。
(3)声明静态变量:readonly 变量,注意,不能unset
readonly B=2
echo "B=$B"
unset B
echo "B=$B"
输出结果 第一行正常输出B=2,第二行报错,cannot unset :readonly variable
2. shell环境变量
基本语法:
(1)export 变量名=变量值(功能描述:将shell变量输出为环境变量)
(2)source 配置文件,(功能描述:让修改后的配置信息立即生效)
(3)echo $变量名(功能描述:查询环境变量的值)
使用示例:vim /etc/profile
JAVA_HOME=/usr/local/java
export JAVA_HOME
wq退出,然后source /etc/profile
echo $JAVA_HOME打印Java安装路径。
在另一个shell中使用我们自定义的环境变量:
vim myShell.sh
echo "javahome=$JAVA_HOME"
多行注释:
:<<!
RESULT=`ls -l /home`
echo $RESULT
MY_DATE=$(date)
echo "date=$MY_DATE"
!
3. 位置参数变量
基本语法:
(1)$n 功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号抱起来${10}
(2)$* 功能描述:这个变量代表命令行中所有的参数,$*把所有参数看作一个整体
(3)$@ 功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
(4)$# 功能描述:这个变量代表命令行中所有参数的个数
位置参数变量应用实例:编写一个position.sh脚本,在脚本中获取到命令行的各个参数信息
vim position.sh
#!/bin/bash
#获取到各个参数
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"
执行 ./position.sh 30 60
输出
./position.sh 30 60
30 60
30 60
参数个数=2
4. 预定义变量
基本介绍:
就是shell设计者事先定义好的变量,可以直接在shell脚本中使用
基本语法:
(1)$$ 功能描述:当前进程号的PID
(2)$! 功能描述:后台运行的最后一个进程的进程号PID
(3)$? 功能描述:最后一个执行的命令的返回状态。如果这一个变量的值为0,证明上一个命令正确执行;如果这个变量值非0(具体哪个数由命令自己来决定),则证明上一个命令执行不正确了。
应用示例:
vim perVar.sh
#!/bin/bash
echo "当前进程号=$$"
#后台方式运行myShell.sh
./myShell.sh &
echo "最后的进程号=$!"
echo "执行的值=$?"
:wq退出
chmod 744
执行预定义变量脚本 ./perVar.sh
5. 运算符
基本语法:
(1) "$((运算式))"或者"$[运算式]"
(2)expr m + n expr m - n expr \*乘以,/除以,%取余,注意expr和运算符以及变量之间都要有空格
应用示例:
#!/bin/bash
#第一种方式$(())
RESULT1=$(((2+3)*4))
echo "result=$RESULT1"
#第二种方式[],推荐使用
RESULT2=$[(2+3)*4]
echo "result2=$RESULT2"
#第三种方式,exrp
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"
#求出两个参数的和
SUM=$[$1+$2]
echo "sum=$SUM"
6. shell判断语句
基本语法:
[condition]注意 condition 前后要有空格
#非空返回true,可使用$?验证(0为true,>1为false)
应用示例:
[alibaba] 返回true
[] 返回false
[condition]&&echo OK || echo notok 条件满足,执行后面的语句
条件判断:
(1)两个整数的比较: =字符串比较 -lt小于 -le小于等于 -eq等于 -gt大于 -ge大于等于 -ne不等于
(2)按照文件权限判断: -r有读的权限 -w有写的权限 -x有执行的权限
(3)按照文件类型进行判断: -f文件存在并且是一个常规的文件 -e文件存在 -d文件存在并且是一个目录
应用示例:
案例一: "ok"是否等于""ok"
判断语句:if [ "ok" = "ok" ]
then
echo "equal"
fi //结果相等
案例二:23是否大于等于22
判断语句:if [ 23 -gt 22 ]
then
echo "大于"
fi //结果大于
案例三:/root/install.log目录中的文件是否存在
判断语句:if [ -e /root/aaa.log ]
then
echo "存在"
fi //结果存在
7. 流程控制
if控制:输入大于60,输出及格,小于60输出不及格。
if [ $1 -ge 60 ]
then
echo "及格"
elif [ $1 -lt 60 ]
then
echo "不及格"
fi
case控制:当命令行参数是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 param is $i"
done 输出的参数是一个整体 the param is10 20 30,当成一个参数来输出。
#使用$@
for j in "$@"
do
echo "the param is $j"
done 输出的参数分别打印the param is10 the param is20 the param is30,当成多个参数来处理。
语法二:for((初始值;循环控制条件;变量变化))
do
程序
done
示例:从1+到100的值输出显示
#定义一个变量
SUM=0
for((i=1;i<=100;i++))
do
SUM=$[$SUM+$i]
done
echo "sum=$SUM"
while循环:命令行输入一个n,统计从1+..+n的值是多少
SUM=0
i=0
while [$i - le $1]
do
SUM=$[$SUM+$i]
done
echon "sum=$SUM"