Linux学习_Shell编程

为什么要学习Shell编程

  1. Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。
  2. 对于JavaEE和Python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本进行程序或者是服务器的维护,比如编写一个定时备份数据库的脚本。
  3. 对于大数据程序员来说,需要编写Shell程序来管理集群。

Shell是什么

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
示意图:
在这里插入图片描述

Shell脚本的执行方式

脚本格式要求

  1. 脚本以#!/bin/bash开头
  2. 脚本需要有可执行权限

编写第一个Shell脚本

创建一个Shell脚本,输出hello world!

  1. vim myShell.sh(一般是.sh后缀的,不是也可以)
  2. 开头的#!/bin/bash告诉系统执行这个shell时用bash来解析
    myShell.sh的内容:
#!/bin/bash
echo "hello world"

写完后wq保存就可以了
在这里插入图片描述
可以看到现在是没有可执行权限的

脚本的常用执行方式

• 方式1(输入脚本的绝对路径相对路径)

  1. 首先要赋予myShell.sh 脚本的+x权限
    在这里插入图片描述
  2. 执行脚本
    在这里插入图片描述
    • 方式2(sh+脚本)
    说明:不用赋予脚本+x权限,直接执行即可。
[root@nyh shell]# sh ./myShell.sh 
hello,world
[root@nyh shell]# 

推荐使用方式一

Shell的变量

介绍

  • Linux Shell中的变量分为系统变量用户自定义变量
  • 系统变量:$HOME$PWD$SHELL$USER等等
    比如:echo $HOME,$后面跟的就是变量名
  • 显示当前shell中所有变量:set
    在这里插入图片描述

shell变量的定义

语法

  1. 定义变量:变量=值
  2. 撤销变量:unset 变量
  3. 声明静态变量:readonly变量,注意:静态变量不能unset

定义变量的规则

  1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
  2. 等号两侧不能有空格
  3. 变量名称一般习惯为大写

将命令的返回值赋给变量

  1. A=`ls -la` (用反引号把命令给括起来),运行里面的命令,并把结果返回给变量A
  2. A=$(ls -la) 等价于反引号

案例

案例1:定义变量A

[root@nyh shell]# A=666
[root@nyh shell]# echo $A
666

案例2:撤销变量A

[root@nyh shell]# unset A
[root@nyh shell]# echo $A

[root@nyh shell]# 

案例3:声明静态的变量A=99,不能unset

[root@nyh shell]# readonly A=99
[root@nyh shell]# echo $A
99
[root@nyh shell]# unset A
-bash: unset: A: cannot unset: readonly variable
[root@nyh shell]# echo $A
99
[root@nyh shell]# 

设置环境变量

基本命令

  1. export 变量名=变量值 (功能描述:将shell变量输出为环境变量)
  2. source 配置文件 (功能描述:让修改后的配置信息立即生效)
  3. echo $变量名 (功能描述:查询环境变量的值)

案例

  1. 在/etc/profile文件中定义TOMCAT_HOME环境变量
TOMCAT_HOME=/opt/apache-tomcat-7.0.70
export TOMCAT_HOME

  1. 查看环境变量TOMCAT_HOME的值
[root@nyh apache-tomcat-7.0.70]# echo $TOMCAT_HOME
/opt/apache-tomcat-7.0.70

  1. 在另外一个shell程序中使用 TOMCAT_HOME
    注意:在输出JAVA_HOME 环境变量前,需要让其生效
    source /etc/profile
    在myShell.sh中使用
    echo "TOMCAT_HOME=$TOMCAT_HOME"
    然后执行脚本,可以看到输出的环境变量

位置参数变量

介绍

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量
比如 : ./myshell.sh 100 200 , 这个就是一个执行shell的命令行,可以在myshell 脚本中获取到参数信息

基本语法

$n (功能描述:n为数字,$0代表命令本身,$1- 9 9代表第一到第九个参数,十以上的参数,十以上的参 数需要用大括号包含,如 {10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$#(功能描述:这个变量代表命令行中所有参数的个数)

$* 和 $@是有区别的,如果你用for循环遍历,$*只会遍历一遍,$@你有几个参数就会遍历几遍

案例

在myShell.sh中获取命令行中的参数

echo "$0"
echo "$1"
echo "$2"
echo "$*"
echo "$@"
echo "$#"

然后在命令行输入参数

[root@nyh shell]# ./myShell.sh 100 200
./myShell.sh
100
200
100 200
100 200
2
[root@nyh shell]# 

预定义变量

基本介绍

就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用

基本语法

$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

案例

在一个shell脚本中简单使用一下预定义变量
用vim写一个yu.sh脚本

#!/bin/bash
echo "当前的进程号=$$"
#以后台的方式运行 myShell.sh
./myShell.sh &
echo "最后的进程号=$!"
echo "执行的值=$?"

然后添加可执行权限执行脚本
在这里插入图片描述

shell运算符

基本介绍

在shell中进行各种运算操作

基本语法

  1. “$((运算式))”或“$[运算式]”推荐使用第二种$[运算式]方式,简单
  2. expr m + n
    注意expr运算符间要有空格
  3. expr m - n
  4. expr \*, /, %,分别代表 乘,除,取余

案例

案例1:计算(2+3)*4的值
写一个yunSuan.sh脚本

#!/bin/bash

#第一种方式
RETURN=$(((2+3)*4))
echo $RETURN

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

#第三种方式
TEMP=`expr 2 + 3`
RETURN3=`expr $TEMP \* 4`
echo $RETURN3

给一个可执行权限然后运行

[root@nyh shell]# chmod 744 yunSuan.sh 
[root@nyh shell]# ./yunSuan.sh 
20
20
20

案例2:请求出命令行的两个参数[整数]的和

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

条件判断

判断语句

基本语法
[ xxx ](注意xxx前后要有空格,xxx代表你要判读的东西)
#非空返回true,可使用$?验证(0为true,>1为false)

应用实例
[ atguigu ] 返回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”
案例2:23是否大于等于22
案例3: /root/shell/yu.sh 文件是否存在

#!/bin/bash
#案例一:判断"ok"是否等于"ok"
if [ "ok"="ok" ]
then
echo "等于"
fi

#案例二:判断23是否大于等于22
if [ 23 -ge 22 ]
then
echo "yes"
fi

#案例三:/root/shell/yu.sh 文件是否存在
if [ -e /root/shell/yu.sh ]
then
echo "存在"
fi

注意:if和[]中间也是有个空格的

[root@nyh shell]# vim panduan.sh 
[root@nyh shell]# ./panduan.sh 
等于
yes
存在

流程控制

if 判断

基本语法

if [ 条件判断式 ];then
	程序
fi

或者

if [ 条件判断式 ]
then
	程序
elif [条件判断式]
then
	程序
fi

注意:

  1. [ 条件判断式 ],中括号和条件判断式之间必须有空格
  2. 推荐使用第二种方式

例子
编写一个shell程序,如果输入的参数,大于等于60,则输出 “及格了”,如果小于60,则输出 “不及格”

#!/bin/bash

if [ $1 -ge 60 ]
then
        echo "及格了"
elif [ $1 -lt 60 ]
then
        echo "不及格"
fi

[root@nyh shell]# chmod 744 liucheng.sh 
[root@nyh shell]# ./liucheng.sh 61
及格了

case语句

基本语法

case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

例子
当命令行参数是 1 时,输出 “周一”, 是 2 时,就输出"周二", 其它情况输出 “other”

#!/bin/bash
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac
[root@nyh shell]# vim case.sh
[root@nyh shell]# chmod 744 case.sh
[root@nyh shell]# ./case.sh 1
周一
[root@nyh shell]# ./case.sh 2
周二
[root@nyh shell]# ./case.sh 3
other

for循环

基本语法1

for 变量 in 值1 值2 值3…
do
程序
done

例子:打印命令行输入的参数

#!/bin/bash

#遍历$*
for i in "$*"
do
        echo $i
done
echo "=========="
#遍历$@
for j in "$@"
do
        echo $j
done

[root@nyh shell]# chmod 744 testFor.sh 
[root@nyh shell]# ./testFor.sh 10 20 
10 20
==========
10
20

基本语法2

for (( 初始值;循环控制条件;变量变化 ))
do
程序
done

例子:从1加到100的值输出显示

#!/bin/bash

#定义一个记录结果的变量
SUM=0
for((i=1;i<=100;i++))
do
        SUM=$[$SUM+$i]
done
echo $SUM

[root@nyh shell]# chmod 744 testfor.sh
[root@nyh shell]# ./testfor.sh 
5050

猜你喜欢

转载自blog.csdn.net/qq_36901488/article/details/82924289