shell编程规范与变量

文章目录

  • shell编程规范与变量
    • 一、shell 脚本概述
      • 1.1shell脚本概念
      • 1.2shell脚本应用场景
      • 1.3shell的作用
        • 1.3.1shell的作用——命令解释器,充当翻译官
        • 1.3.2用户的登录shell
      • 1.4shell编程规范
        • 1.4.1编写shell脚本
        • 1.4.2 执行脚本文件 方法
      • 1.4shell编程规范
      • 1.5重定向与管道
        • 1.5.1重定向符号
        • 1.5.2:管道操作符号“|”
        • 1.5.3 交互式硬件设备
    • 二、shell脚本变量
      • 2.1shell变量的作用,类型
      • 2.2自定义变量
        • 2.2.1:定义一个新的变量与查看变量的值
      • 2.3特殊变量
        • 2.3.1赋值时使用引号
        • 2.3.2read [-p "提示信息"] 变量名
        • **2.3.3export设置变量的作用范围**
        • 2.3.5整数变量的运算和常用运算符
      • 2.4:特殊的shell变量
        • 2.4.1:环境变量和常见的环境变量
        • 2.4.2:位置变量

shell编程规范与变量

一、shell 脚本概述

1.1shell脚本概念

  • 将要执行的命令按顺序保存到一个文本文件
  • 给该文件可执行的权限
  • 结合各种shell控制语句完成更复杂的操作

1.2shell脚本应用场景

  • 重复性操作
  • 交互性任务
  • 批量事务处理
  • 服务运行状态监控
  • 定时任务执行等等

1.3shell的作用

1.3.1shell的作用——命令解释器,充当翻译官

1.3.2用户的登录shell

  • 登录后默认使用shell程序,一般为/bin/bash
  • 不通shell的内部指令、运行环境等会有所区别
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

type [命令] 可以查看是内部命令还是外部命令

[root@localhost ~]# type ping
ping 是 /usr/bin/ping
[root@localhost ~]# type cd
cd 是 shell 内嵌

1.4shell编程规范

1.4.1编写shell脚本

  • 使用vim文本编辑器

  • 每行一条Linux命令,按执行顺序依次编写

  • 脚本后缀为.sh

    vim test.sh

    #!/bin/bash shell脚本标准格式
    cd /boot/
    pwd
    ls -lh vml*

    grep 过滤

    sed 按行读取

    awk 按列读取

    1.4.2 执行脚本文件 方法

    方法 权限区别 环境变量区别
    脚本文件路径 必须有执行权限 不变
    sh 脚本文件路径 不需要执行权限 不变
    脚本文件路径 / . 脚本文件路径 不需要执行权限
    方法一
    [root@localhost ~]# ./test.sh
    bash: ./test.sh: 权限不够
    方法二
    [root@localhost ~]# sh test.sh
    /boot
    -rwxr-xr-x. 1 root root 6.4M 7月   9 20:21 vmlinuz-0-rescue-ecc394a38fa54a59b5c4240d3379427e
    -rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64
    方法三
    [root@localhost ~]# source test.sh
    /boot
    -rwxr-xr-x. 1 root root 6.4M 7月   9 20:21 vmlinuz-0-rescue-ecc394a38fa54a59b5c4240d3379427e
    -rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64
    [root@localhost boot]# 
    方法四
     [root@localhost ~]# . test.sh
    /boot
    -rwxr-xr-x. 1 root root 6.4M 7月   9 20:21 vmlinuz-0-rescue-ecc394a38fa54a59b5c4240d3379427e
    -rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64
    [root@localhost boot]#  
    

1.4shell编程规范

  • 脚本声明
  • 注释信息
  • 可执行语句
vim test.sh
#!/bin/bash
#this is a example
cd /boot/
echo  "当前所在路径:"
pwd
echo "以vml为开头的文件是:"    
ls -lh vml*
[root@localhost ~]# sh test.sh
当前所在路径:
/boot
以vml为开头的文件是:
-rwxr-xr-x. 1 root root 6.4M 7月   9 20:21 vmlinuz-0-rescue-ecc394a38fa54a59b5c4240d3379427e
-rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@localhost ~]# 

1.5重定向与管道

1.5.1重定向符号

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

1.5.2:管道操作符号“|”

  • 将左侧的命令输出结果,作为右侧命令的处理对象(前后有关系时使用)
[root@localhost ~]#  grep "bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
liu:x:1000:1000:liu:/home/liu:/bin/bash
[root@localhost ~]# grep "bash$" /etc/passwd | awk -F: '{print$1,$3}'   查看以:为分割的第一列和第三列
root 0
liu 1000

[root@localhost ~]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root xfs        50G  5.0G   46G   10% /
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G   13M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/sda1               xfs      1014M  179M  836M   18% /boot
/dev/mapper/centos-home xfs       245G   33M  245G    1% /home
tmpfs                   tmpfs     378M  4.0K  378M    1% /run/user/42
tmpfs                   tmpfs     378M   36K  378M    1% /run/user/0
/dev/sr0                iso9660   4.3G  4.3G     0  100% /run/media/root/CentOS 7 x86_64
[root@localhost ~]# df -Th |awk '{print$1,$3,$4}'   awk 后面不加选项,默认以空格为分割的列
文件系统 容量 已用
/dev/mapper/centos-root 50G 5.0G
devtmpfs 1.9G 0
tmpfs 1.9G 0
tmpfs 1.9G 13M
tmpfs 1.9G 0
/dev/sda1 1014M 179M
/dev/mapper/centos-home 245G 33M
tmpfs 378M 4.0K
tmpfs 378M 44K
/dev/sr0 4.3G 4.3G

1.5.3 交互式硬件设备

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

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

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

类型 设备文件 文件描述编号 默认设备
标准输入 /dev/stdin 0 键盘
标准输出 /dev/stdout 1 显示器
标准错误输出 /dev/stderr 2 显示器
[root@localhost ~]# passwd lisi 2> /boot/tset.sh

[root@localhost ~]# cat /boot/test.sh
cat: /boot/test.sh: 没有那个文件或目录

二、shell脚本变量

2.1shell变量的作用,类型

变量的作用

为灵活管理Linux系统提供特定参数,有两层意思

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

变量的类型

自定义变量:由用户自己定义,修改和使用

环境变量:由系统维护,用于设置工作环境

位置变量:通过命令行给脚本程序传递参数

预定义变量:bash中内置的一类变量,不能直接修改

2.2自定义变量

2.2.1:定义一个新的变量与查看变量的值

  • 变量名以字母或下划线开头,区分大小写,建议全大写

变量名=变量值

将右边的值赋予左边

查看变量的值:echo $变量名

[root@localhost ~]# number=123
[root@localhost ~]# echo $number
123
[root@localhost ~]# age=20
[root@localhost ~]# echo $number$age
12320
[root@localhost ~]# echo $number $age
123 20

2.3特殊变量

2.3.1赋值时使用引号

  • 双引号:允许通过$符号引用其他变量值
  • 单引号:禁止引用其他变量值,$视为普通字符
  • 反撇号:命令替换,提取命令执行后的输出结果

[root@localhost ~]# echo '$number'     单引号和不加符号作用相同
$number
[root@localhost ~]# echo "$number"   相当于echo $
123
[root@localhost ~]# num= `ps aux |wc -l`   反撇号:命令替换,提取命令执行后的输出结果
[root@localhost ~]# echo $num
243
[root@localhost ~]# ps aux | wc -l
242
[root@localhost ~]# echo num
num
[root@localhost ~]# echo $num
243

2.3.2read [-p “提示信息”] 变量名

vim test.sh

#!/bin/bash
#this is a example
read -p "请输入一个整数:" age
echo " 你的年龄:$age" 
~                                                                                      
~                         

[root@localhost ~]# sh test.sh
请输入一个整数:20
 你的年龄:20

2.3.3export设置变量的作用范围

全局环境变量可用

格式:export 变量名…

[root@localhost ~]# num=`ps aux | wc -l`
[root@localhost ~]# num=`ps aux|wc -l`
[root@localhost ~]# echo $num
240
[root@localhost ~]# bash    设置环境变量范围
[root@localhost ~]# echo $num  不显示

[root@localhost ~]# exit    退出环境变量范围
exit
[root@localhost ~]# echo $num
240

[root@localhost ~]#  export num
[root@localhost ~]# bash
[root@localhost ~]# echo $num
240

2.3.5整数变量的运算和常用运算符

1)整数变量的运算

​ expr 变量1 运算符 变量2 [运算符 变量3]…

2)常用运算符

加法运算:+ 

   减法运算:- 

   乘法运算:\* 

   除法运算:/ 

   求模(取余)运算:% 

注意:乘法*要用转义符

%取余(余数)

5%2=1

取整

5/2=2

[root@localhost ~]# expr 5+ 7
expr: 语法错误
[root@localhost ~]# expr 5 + 7
12
[root@localhost ~]# expr 7 - 2
5
[root@localhost ~]# expr 3 \* 2
6
[root@localhost ~]# expr 9 / 2
4
[root@localhost ~]# expr 9 % 2
1

手动输入自动求和

vim test.sh

#!/bin/bash
#this is a example
read -p "请输入一个整数:" a
echo $a
read -p "请输入一个整数:" b
echo $b
sum=`expr $a + $b`
echo $sum

[root@localhost ~]# sh test.sh
请输入一个整数:5
5
请输入一个整数:7
7
12

2.4:特殊的shell变量

2.4.1:环境变量和常见的环境变量

环境变量

由系统提前创建,用来设置用户的工作环境
配置文件:/etc/profile,~/.bash_profile

常见的环境变量

PWD,PATH
USER,SHELL,HOME

2.4.2:位置变量

表示为 $n,n为1-9之间的数字

脚本文件名 one two three four five six seven eight nine

  • $#:命令行中位置变量的个数
  • $*:所有位置变量的内容
  • $?:上一条命令执行后返回的状态,当返回状态值为0时表示正常,非0值表示执行异常或出错
  • $0:当前执行的进程/程序名
[root@localhost ~]# sh test.sh 12 50
总和为:62
执行的脚本是:test.sh
执行的脚本个数是:2
详细内容时:12 50



#!/bin/bash
#this is a example
sum=0
sum=`expr $1 + $2`
echo "总和为:$sum"
echo "执行的脚本是:$0"
echo "执行的脚本个数是:$#"
echo "详细内容时:$*"

~

为 $n,n为1-9之间的数字

脚本文件名 one two three four five six seven eight nine

  • $#:命令行中位置变量的个数
  • $*:所有位置变量的内容
  • $?:上一条命令执行后返回的状态,当返回状态值为0时表示正常,非0值表示执行异常或出错
  • $0:当前执行的进程/程序名
[root@localhost ~]# sh test.sh 12 50
总和为:62
执行的脚本是:test.sh
执行的脚本个数是:2
详细内容时:12 50



#!/bin/bash
#this is a example
sum=0
sum=`expr $1 + $2`
echo "总和为:$sum"
echo "执行的脚本是:$0"
echo "执行的脚本个数是:$#"
echo "详细内容时:$*"

~

你可能感兴趣的:(shell编程规范与变量)