Shell脚本

1.Shell简介

shell是一个命令行解释器,它为用户提供一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。

2.Shell脚本的执行方式

(1)脚本以 # !/bin/bash#和!之间有空格)开头

例:vim a.sh

# !/bin/bash/
echo "hello word!"

使用 ls -l

-rw-r--r-- 1 wjy wjy 35 8月  27 10:16 a.sh

保存退出后,此时a.sh还没有权限去直接运行,需要chmod 774 a.sh才可以使用./a.sh 来运行。
注:
-rw-r–r--,表示这是一个普通文件,创建文件的用户的权限为rw-,创建文件的用户所在的组的权 限为r–,其他用户的权限为r–。
在修改权限时,是用不同数字来表示不同权限的。4表示读取权限,2表示写入权限,1表示执行权限
设置权限时,要给3类用户分别设置权限。
例如chmod 761表示,给创建文件的用户设置的权限是7,7=4+2+1,所以意思是给创建文件的用户赋予读取,写入和执行权限。6=4+2,也就是说给创建文件的用户所在的组赋予读取和写入权限,最后一个1表示执行权限,也就是说,给其他用户执行权限。

或者直接使用 sh ./a.sh 也可以运行

3.Shell的变量

1)Linux Shell 中的变量分为,系统变量用户自定义变量
2) 系统变量:$HOME、 $ PWD 、$SHELL、 $USER 等等
比如: echo $HOME 等等…
3) 显示当前Shell中所有变量:set

4)用户自定义变量
定义变量的规则:
变量名称可以由字母、数字和下划线组成,但不能以数字开头;等号两侧不能有空格;变量名称一般习惯为大写。

基本语法:变量 = 值
撤销变量:unset 变量
声明静态变量:readonly变量,注意:不能unset
例:

# !/bin/bash/

#echo "hello world!"
A=1000
echo "A=$A"
unset A 
echo "A=$A"
~            

输出:A=1000 A=
将命令的返回值赋给变量:
A=‘ls -la’ (反引号) 运行里面的命令,并把结果返回给变量A
A=$(ls -la) 等价于反引号
例:

# !/bin/bash/
RESULT=`ls -l /home`
echo $RESULT
echo ""
MY_DATE=$(data)
echo "date=$MY_DATE"

4)设置环境变量
基本语法
1.export 变量名=变量值 (功能描述,将shell变量输出为环境变量)

TOMCAT_HOME=/opt/tomcat
export TOMCAT_HOME

2.source /etc/profile (功能描述:让修改后的配置信息立即生效)

source /etc/profile

3.echo $变量名 (功能描述:查询环境变量的值)

echo $TOMCAT_HOME

就会输出 /opt/tomcat
补充:shell脚本里面多行注释

:<<!
echo "xxxx"
echo "fsfsf"
echo "hgjuyg"
!

5)位置参数变量
介绍
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如:./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息。
基本语法:
$n : (功能描述:n为数字, 0 代 表 本 身 , 0代表本身, 0"$1 - $ 9"代表第一到第九个参数,十以上的参数需要用大括号包含,如${10} )。
$* : (功能描述:这个变量代表命令行中所有的参数,“ $* ” 把所有的参数看成一个整体)
$@ :(功能描述:这个变量也代表命令行中所有的参数,不过" $@ "把每个参数区分对待)
$# : (功能描述:这个变量代表命令行中所有参数的个数)
例:

vim  positionPara.sh
# !/bin/bash
#获取到各个参数
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数个数=$#"

chmod 744 positionPara.sh 
./positionPara.sh 30 60

输出:

./positionPara.sh 30 60
30 60
30 60
参数个数=2

6)预定义变量
基本介绍:
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
例:
vim preVar.sh

# !/bin/bash
echo "当前的进程号=$$"
#后台的方式运行 a.sh
./a.sh
echo "最后的进程号=$!"
echo "执行的值=$?"
~                      
chmod 744 preVar.sh 
./preVar.sh 

输出:

当前的进程号=17848
最后的进程号=17849
执行的值=0
wjy@wjy-Y7000:~/wjy/shell_test$ A=1000
A=

7)运算符
基本语法:

  1. “$((运算式))” 或者“ $[运算式]”
  2. expr m + n 注意expr运算符之间要由空格
  3. expr m - n
  4. expr \ *, / ,% 乘,除,取余
    例:
# !/bin/bash
#第一中方式$()
RESULT1=$(((2+3)*4))
echo "result1=$RESULT1"

#第二种方式$[]
RESULT2=$[(2+3)*4]
echo "result2=$RESULT2"

#使用exper
TEMP=`expr 2 + 3`
RESULT3=`expr $TEMP \* 4`
echo "result3=$RESULT3"

#求两个参数的和
SUM=$[$1+$2]
echo "SUM=$SUM"

输出:

wjy@wjy-Y7000:~/wjy/shell_test$ ./demo.sh 10 18
result1=20
result2=20
result3=20
SUM=28

8)条件判断
[ condition ] (注意condition前后要有空格)
#非空返回true,可以使用$?验证(0为true,>1为false)
1.两个整数的比较
= 字符串比较
-lt 小 于
-le 小于等于
-eq 等 于
-gt 大 于
-ge 大于等于
-ne 不等于
2.按照文件权限进行判断
-r 有读的权限 [ -r 文件]
-w 有写的权限
-x 有执行的权限
3.按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
例:

vim judge.sh

# !/bin/bash
#案例1,“OK”是否等于“OK”

if [ "ok" = "ok" ]
then
        echo "equal"
fi

#案例2:23是否大于等于22
if [ 23 -gt 22 ]
then
        echo "大于"
fi
#案例3: /home/wjy/Downloads/SGG_Linux.docx 文件是否存在
if [ -e /home/wjy/Downloads/SGG_Linux.docx ]
then
        echo "存在"
fi

~     

输出

equal
大于
存在

9)流程控制
• 基本语法
if [条件判断式];then
程序
fi
或者
if [条件判断式]
then
程序
elif [条件判断式]
then
程序
fi

注意事项:(1)[条件判断式],中括号和条件判断式之间必须有空格(2)推荐使用第二种方式
例:
case语句:
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

例:
Shell脚本_第1张图片
for循环:
基本语法1:
for 变量 in 值1 值2 值3…
do
程序
done
例:
Shell脚本_第2张图片
Shell脚本_第3张图片
Shell脚本_第4张图片
while循环
• 基本语法1
while [条件判断式]
do
程序
done
例:

# !/bin/bash

#案例1,从命令行输入一个数n,统计从1+ ... +n的值是多少
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done
echo "sum=$SUM"

输出:

wjy@wjy-Y7000:~/wjy/shell_test$ ./test_while.sh  100
sum=5050

10)shell读取控制台输入
基本语法
read (选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。参数
变量:指定读取值的变量名
Shell脚本_第5张图片

你可能感兴趣的:(Linux,Shell,linux)