Shell编程与变量

1.shell简介

1. shell脚本是什么

只要将平时的各种Linux命令按顺序保存到一个文本文件中,然后添加可执行权限,这个文件就成为一个Shell脚本了,就是复杂问题简单化。

2.shell脚本应用场景

  1. 重复性操作
  2. 交互性任务
  3. 批量事务处理
  4. 服务运行状态监控
  5. 定时任务执行

3.Shell脚本的作用

  1. 介于系统内核(操作系统)与用户(应用层)之间,复制解释命令行,俗称命令解释器,“翻译官”
  2. 用户写的命令通过Shell翻译成二进制,才可以被内核识别,去控制硬件

4.Linux常用的Shell种类

不同的shell具备不同的功能,shell还决定了Linux中默认的shell是/bin/ bash,流行的shell有ash、bash、ksh、csh, zsh等,不同的shell 都有自己的特点以及用途。

  1. bash
    大多数Linux系统默认使用的shell , bash shell是Bourne shell 的一个免费版本,它是最 早的Unix. shell, bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径。

  2. csh
    C shell 使用的是“类C”语法,csh是具有C语言风格的一种shell, 其内部命令有52个,较为庞大。目前使用的并不已经被/bin/tcsh所取代。

  3. ksh
    Korn shell 的语法与Bourne shell相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh, ksh有42条内部命令,与bash相比有一定的 限制性。

  4. tcsh
    tcsh是csh的增强版,与C shell完全兼容。

  5. sh
    是一个快捷方式,已经被/bin/bash所取代。

  6. nologin
    指用户不可登录

2.编写Shell脚本格式

1.编写脚本代码

要求:
使用vim或vi文本编辑器
每行一条Linux命令,按执行顺序依次编写

 #!/bin/bash         
    
 #查询/boot目录下的所有的子文件和子目录   
 shell脚本命令
 cd  /boot
 pwd
 ls     -lh    vml*

2.赋权限和执行

  1. 赋权限

    [root@server2 ~]# chmod +x first.sh  
    
  2. 执行脚本文件

    [root@server2 ~]# ./first.sh       
    

3.完整表示

[root@server2 ~]#  vim first.sh
[root@server2 ~]# chmod +x first.sh
[root@server2 ~]# ./first.sh


#!/bin/bash
#查询/boot目录下所有的子文件和子目录     
cd /boot
echo "当前位于:"               输出友好提示信息
pwd
echo “显示当前路径下以vml为开头的文件或目录:”
ls -lh vml*

3.重定向

1.重定向是什么

在实际的Linux系统维护中,可以改变输入、输出内容的方向,而不使用默认的标准输入、输出设备(键盘和显示器),这种操作称为重定向。(改变输入来源,输出目标)

2.交互式硬件设备标准输入:从该设备接收用户输入的数据

  1. 标准输入:从该设备接收用户输入的数据

  2. 标准输出:通过该设备向用户输出数据

  3. 标准错误:通过该设备报告执行出错信息

    类型               设备文件              文件描述编号                  默认设备
    标准输入           /dev/stdin              0  0<                      键盘
    标准输出           /dev/stdout             1   1>                    显示器
    标准错误输出        /dev/stderr             2  2>                     显示器
    

3.重定向分类

类型                     操作符                         用途
重定向输入                (0)<          从指定的文件读取数据,而不是从键盘输入 
重定向输出                (1)>          将输出结果保存到指定的文件(覆盖原有内容)
                         (1)>>        将输出结果追加到指定的文件尾部
标准错误输出                 2>           将错误信息保存到指定的文件(覆盖原有内容) 
                           2>>          将错误结果追加到指定的文件中
混合输出                 &>或者2>&1       将标准输出,标准错误的内容保存到同一个文件中

4.shell变量

1.变量的作用

用来存放系统和用户需要使用的特定参数(值)

  1. 变量名:使用固定的名称。 由系统预设或用户定义
  2. 变量值:能够根据用户设置。 系统环境的变化而变化

2.变量的类型

  1. 自定义变量:由用户自已定义。 修改和使用
    定义一个新的变量
    要求:变量名以字母或下划线开头、区分大小写,建议全大写
    格式:变量名=变量值(“=”左边为变量名,右边为变量值)

  2. 特定变量: 环境变量 , 只读变量 ,位置变量 , 预定义变量

3. 查看变量的值

格式:echo $变量名

[root@server2 ~]# A=cc
[root@server2 ~]# echo $A
cc
[root@server2 ~]# AB=ccdd
[root@server2 ~]# echo $A $AB
cc ccdd

4.赋值时使用引号

  1. 双引号:允许通过符 号 引 用 其 他 变 量 值 单 引 号 : 禁 止 引 用 其 他 变 量 值 , 符号引用其他变量值

  2. 单引号:禁止引用其他变量值,符号引用其他变量值单引号:禁止引用其他变量值,示为普通字符

  3. 反撇号:命令替换。提取命令执行后的输出结果

    read   [-p  "提示信息"]  变量名
    
    [root@server2 ~]# $PATH
    -bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin: 没有那个文件或目录
    [root@server2 ~]# Z='$PATH'
    [root@server2 ~]# echo $Z
    $PATH
    [root@server2 ~]# Z="$PATH"
    [root@server2 ~]# echo $Z
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@server2 ~]# B=`ls -lh /root`
    [root@server2 ~]# echo $B
    

5.设置变量的作用范围

变量分为:局部、全局

 格式1:export  变量名 ...           #两种格式可以混合使用
 格式2:export  变量名=变量值 ...

变量名=变量值 … 局部(在当前的bash可用,切换到其它bash不可用)

[root@localhost ~]# echo "$Product $Version"
Benet 6.0                                                               
[root@localhost ~]# export Product Version       #导出为全局变量
[root@localhost ~]# bash
[root@localhost ~]# echo "$Product $Version"   #子程序引用全局变量
Benet 6.0
[root@localhost ~]# exit     


[root@server2 ~]# export S='door'
[root@server2 ~]# echo $S
door
[root@server2 ~]# bash
[root@server2 ~]# echo $S
door
[root@server2 ~]# exit
exit
[root@server2 ~]# env

在这里插入图片描述

6.整数变量的运算

  1. 常用运算符

    加法运算:+
    减法运算:-
    乘法运算:\*  (\:转义字符,回归本身意思)注意不能仅使用“*”符号,否则将被当成文件通配符
    除法运算:/
    求模(取余)运算:%  又称为取余运算,用来计算数值相除后的余数
    
    元字符:具有特殊含义
    

两个数+、一、*、/、%的方法有三种

[root@server2 ~]# expr 1 + 4
5
[root@server2 ~]# echo $((1+4))
5
[root@server2 ~]# echo $[1+4]
5
[root@server2 ~]# expr 1 - 4
-3
[root@server2 ~]# echo $[1-4]
-3
[root@server2 ~]# echo $((1-4))
-3
[root@server2 ~]# expr 1 \* 4
4
[root@server2 ~]# echo $((1*4))
4
[root@server2 ~]# echo $[1*4]
4
[root@server2 ~]# expr 1 / 4
0
[root@server2 ~]# echo $((1/4))
0
[root@server2 ~]# echo $[1/4]
0

注:乘法在直接使用过程中是需要的,因为是shell正则表达式中的特殊字
符,所以需要转义字符\才能表示其真实含义,但是在(())和[]中不需要转义字
符。

7.特殊的Shell变量

  1. 环境变量
    由系统提前创建,用来设置用户的工作环境
    配置文件: /etc/profile、 ~/.bash_ profile(当前用户)
    全局工作环境的变量,针对这个系统中所有用户都会指定
    当前用户root指定

  2. 常见的环境变量
    PWD、PATH
    USER、SHELL、 HOME

改变系统环境变量

[root@server2 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@server2 ~]# PATH="$PATH:/opt"
[root@server2 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt
  1. 只读变量
    用于变量值不允许被修改的情况

    [root@localhost ~]# name=cloud
    [root@localhost ~]# readonly name //设置为只读变量
    [root@localhost ~]# echo $name
    cloud
    [root@localhost ~]# name=yun
    -bash: name: readonly variable //只读变量不可以被重新赋值
    [root@localhost ~]# unset name //只读变量不可以被删除
    -bash: unset: name: cannot unset: readonly variable
    
  2. 位置变量

    表示为$n,n为1~9之间的数字
             $0       $2,第2个位置参数
    [root@localhost ~]# ./myprog.sh  one   two   three   four   five    six
              $1,第1个位置参数 
    
    [root@server2 ~]# vi useradd.sh
    [root@server2 ~]# chmod +x useradd.sh
    [root@server2 ~]# ./useradd.sh ponmeng
    [root@server2 ~]# tail /etc/passwd
    
     #!/bin/bash
     #add user
     useradd $1
     passwd --stdin $1 < pass.txt
    
  3. 预定变量

    [root@server2 ~]# vi /etc/resolv.conf 
    [root@server2 ~]# systemctl restart network 
    [root@server2 ~]# date
    [root@server2 ~]# vim bak.sh
    [root@server2 ~]# chmod +x bak.sh
    [root@server2 ~]# ./bak.sh /boot /etc /opt
    已执行./bak.sh脚本
    已执行3个对象备份
    打包文件:/boot /etc /opt
    
     #!/bin/bash# 打包文件
    g=bak-`date +%F`.gz 
    tar zcvf $g $* &> /dev/null
    echo "已执行$0脚本"
    echo "已执行$#个对象备份"
    echo "打包文件:$*"
    
    
     [root@server2 ~]# vim bak.sh       编辑替换$*改为$@,查看效果
     [root@server2 ~]# ./bak.sh /boot /etc /opt 
     已执行3个对象备份
     打包文件:/boot /etc /opt
    
    
    #!/bin/bash 
    # 打包文件
     g=bak-`date +%F`.gz
    tar zcvf $g $@ &> /dev/null
    echo "已执行$0脚本"
    echo "已执行$#个对象备份"
    echo "打包文件:$*"
    

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值