Shell脚本编程规范与变量的小白总结

一、Shell脚本编程规范

1.1 Shell脚本应用场景

  • Shell脚本(Shell Script)就是将要执行的命令按照顺序保存到一个文本文件中,并给该文件可执行权限,方便一次性执行的一个程序文件。主要是方便管理员进行设置或者管理,可结合Shell控制语句完成复杂操作。
  • 一般用于重复性操作、批量事务处理、自动化运维、服务状态运行监控、定时任务执行等。

1.2 Shell脚本编程规范

  • Shell脚本是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令并解释,将操作传递给内核执行,并输出执行结果。

1.2.1 Shell解释器种类

  • 解释器种类由很多种,不同的Shell脚本,内部指令,命令提示会有一些区别
cat /etc/shells  查看当前系统所支持的脚本种类
[root@localhost ~]# cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

1.2.2 Shell脚本编辑

[root@localhost opt]# vim first.sh  ## 脚本文件以.sh 结尾
 #!/bin/bash  ## Shell解释器的程序为/bin/bash
#注释
cd /boot
pwd
ls -lh vml*

1.2.3 Shell脚本执行

三种方式:

  • ./路径 ## 可绝对可相对 要有可执行X权限
  • sh 路径 ## 可以不需要执行权限 一般建议给 执行后路径不变,本身的环境未发生变化
  • source first.sh ## 路径变了,本身的环境发生了变化 , . xxx ## 等同于source
  • ./l路径
以刚才创建的Shell脚本为例子
[root@localhost opt]# ll
总用量 8
-rw-r--r--.  1 root root   116 7月  15 17:19 first.sh      ## 目前的权限里面没有可执行权限
[root@localhost opt]# ./first.sh  
-bash: ./first.sh: 权限不够    ## 无法执行 权限不够
[root@localhost opt]# chmod +x first.sh  ## 添加可执行权限
[root@localhost opt]# ./first.sh 
/boot
-rwxr-xr-x. 1 root root 6.4M 6月  22 08:03 vmlinuz-0-rescue-313cef57612341d5972004b949f7ed03
-rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@localhost opt]#          ## 路径未发生变化
  • sh 路径 的方式
[root@localhost opt]# sh first.sh     ## 
/boot
-rwxr-xr-x. 1 root root 6.4M 6月  22 08:03 vmlinuz-0-rescue-313cef57612341d5972004b949f7ed03
-rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@localhost opt]#        ## 所在位置未变化  环境未发生改变
  • source 路径的方式
[root@localhost opt]# source first.sh    
/boot
-rwxr-xr-x. 1 root root 6.4M 6月  22 08:03 vmlinuz-0-rescue-313cef57612341d5972004b949f7ed03
-rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@localhost boot]#                      ##所在位置变化  环境发生改变
[root@localhost opt]# . first.sh 
/boot
-rwxr-xr-x. 1 root root 6.4M 6月  22 08:03 vmlinuz-0-rescue-313cef57612341d5972004b949f7ed03
-rwxr-xr-x. 1 root root 6.4M 11月  9 2018 vmlinuz-3.10.0-957.el7.x86_64
[root@localhost boot]#          ##所在位置变化  环境发生改变

1.2.4 Shell脚本输出提示性信息

  • echo “当前目录位于:” ## 加双引号 代表字符串
[root@localhost opt]# vim first.sh 
echo “当前目录位于:”

1.2.5 重定向与管道操作

  • 交互式硬件设备
类型 解释 设备文件 文件描述编号 默认设备
标准输入 从该设备接收用户输入的数据 /dev/stdin 0 键盘
标准输出 通过该设备向用户输出数据 /dev/stdout 1 显示器
标准错误输出 通过该设备报告执行出错信息 /dev/stderr 2 显示器
  • 重定向操作
类型 操作符 用途
重定向输入 < 从指定文件读取数据,而不是从家键盘输入
重定向输出 > 将输出结果保存到指定文件(覆盖原有内容)
重定向输出 > > 将输出结果追加到指定的文件尾部
标准错误输出 2> 将错误信息保存到指定文件(覆盖原有内容)
标准错误输出 2>> 将错误信息追加到指定的文件中
混合输出 &> 将标准输出、标准错误的内容保存到同一个文件当中
  • 输出错误性信息
[root@localhost ~]# cat  abc.txt 2> error.txt   
[root@localhost ~]#  cat error.txt 
cat: abc.txt: 没有那个文件或目录

  • 混合输出
## 不知道结果对的还是错的的时候用
[root@localhost ~]# cat  abc.txt  &>error01.txt   
[root@localhost ~]# cat error01.txt 
cat: abc.txt: 没有那个文件或目录

  • 不想看输出的信息:
[root@localhost ~]# yum install httpd  -y &> /dev/null      ## 将屏幕当中输出的信息导入到黑洞

管道操作符号 “|”

  • 将左侧的命令输出结果,作为右侧的命令的处理对象
[root@localhost ~]# grep "bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash          
wang /bin/bash
kgc /bin/bash
bdqn /bin/bash
tom /bin/bash
lisi /bin/bash

  • awk :正则表达三剑客之一 处理列
    -F: 以冒号作文分隔符 (F后跟分隔的符号) 什么都不写默认以制表符和空格作为分隔(-F都不写)
    print 输出
    $ 位置 ## 中间用逗号隔开

二、变量

  • Shell变量用来存放系统和用户所需要的特定参数(值),这些参数可根据用户的设定或系统的变化而相应变化,变量的值存在内存当中。
  • 作用:
    用来存放系统和用户需要使用的特定参数(值)
    变量名: 使用固定的名称、由系统预设或用户定义(PATH)
    变量值: 能够根据用户设置、系统环境的变化而变化
  • 变量的类型:
    自定义的变量:由用户自己定义、修改和使用
    特殊变量、只读变量、位置变量、预定义变量($?)

2.1 定义新的变量

  • 变量名以以字母或下划线开头,区分大小写,建议全部大写
  • 基本格式
    变量名=变量值 (变量名在左边,变量值在右边 “=”是赋值符号)
[root@localhost ~]# name=zhangsan ## 把张三赋值给name

2.2 查看和引用变量的值

  • 在变量名前加符号“$”,可以引用一个变量的值
  • 可以使用echo命令查看变量,可以在一条echo命令中同时查看多个变量值。
[root@localhost ~]# name=zhangsan
[root@localhost ~]# name1=wangwu
[root@localhost ~]# echo $name $name1
zhangsan wangwu

2.3变量赋值的特殊操作

  • 在“=”后边指定赋值内容是为变量赋值的最基本方法,还有一些操作,可以更为灵活的为变量赋值。

2.3.1 双引号(")

  • 主要起界定字符串的作用,特别是赋值内容中包含空格时,必须以双引号括起来。
  • 允许通过$符号引用其他变量
[root@localhost ~]# abc=a b c   ## 包含空格 无法赋值
-bash: b: 未找到命令
[root@localhost ~]# abc="a b c" ## 赋值成功
[root@localhost ~]# echo $abc
a b c

2.3.2 单引号(’)

  • 当要赋值的内容中包含 “$” “ " ” “\” 等具有特殊含义的字符时,应使用单引号括起来。
  • 在单引号范围内,将无法引用其他变量的值,任何字符均作为普通字符看待,但赋值内容中包含单引号,需使用“、”进行转义。
[root@localhost ~]# abc='$abc'
[root@localhost ~]# echo $abc 
$abc
[root@localhost ~]# abc=ab\'c  ## 辅助内容中有单引号
[root@localhost ~]# echo $abc 
ab'c

2.3.3 反撇号(`)

  • 主要用于命令替换,允许将执行某个命令的屏幕输出的结果赋值给变量。
  • 反撇号括起来的范围必须是能够执行的命令行,否则将会出错。
[root@localhost ~]#  num3=`ps aux | wc -l`  ## 将进程数赋值给num3
[root@localhost ~]# echo $num3
126
  • 使用反撇号难以在一行命令中实现嵌套命令的操作时,可以改用“$()”来代替反撇号操作。
[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd)) ## 查询提供useradd命令程序的软件包所安装的位置
/etc/default/useradd
/etc/login.defs

2.3.4 read命令

  • 是bash的内置命令。read命令用来提示用户输入信息,从而实现简单的交互过程。
  • 执行时将从标准输入设备(键盘)中读入一行内容,以空格为分隔符,将读入的各字段挨个赋值给指定的变量(多余的内容赋值给最后一个),指定的变量只有一个,则整行内容赋值给此变量。
[root@localhost ~]# read num
1
[root@localhost ~]# read num1 num2
1 2
[root@localhost ~]# echo $num $num1 $num2
1 1 2

  • read命令可结合 “-p”和“-t”来设置提示信息与输入等待时间
[root@localhost opt]# vim first.sh 
read  -p "请输入一个数值:" sum
echo "你输入的值是:$sum"
[root@localhost opt]# sh first.sh 
请输入一个数值:1
你输入的值是:1

三、 设置变量的作用范围

  • 默认下,新定义的变量只在当前的Shell环境中有效,因此称为局部变量。当进入子程序或新的子Shell脚本后,将无法引用父级Shell环境中定义的变量。
[root@localhost ~]# echo $num
1
[root@localhost ~]# bash  ## 进入子shell环境
[root@localhost ~]# echo $num  ## 环境改变无法调用

[root@localhost ~]# 

3.1 全局变量

  • 全局变量定义的变量能在所有子Shell环境中继续使用,可以通过内部命令Export 将指定的变量导出为全局变量
  • 系统:/etc/profile 针对整个用户
  • 用户变量: ~/.bash_profile
[root@localhost ~]# num2=2
[root@localhost ~]# export num2  ## 将num2指定为全局变量
[root@localhost ~]# bash ## 进入子Shell环境
[root@localhost ~]# echo $num2   ## 调用成功
2

  • 也可以到处全局变量时,为变量进行赋值。
[root@localhost ~]# export num3=3

四、数值变量的运算

  • Shell变量的数值运算多用于脚本的进程控制(如循环次数、使用量比较等)。
  • Bash Shell环境中,只能进行简单的整数运算,不支持小数运算。整数值的运算主要通过内部命令expr进行,基本格式如下
基本格式:
expr  变量1 运算符 变量2 [运算符 变量3]………… ## 变量为对应需要计算的数值(需以"$"符号调用)
运算符 意义
++ – 增加及减少,可前置也可放到结尾
\* / % 乘法、除法、取余
+ - 加法、减法
< <= > >= 比较符号
== ! = 等于与不等于
& 位的与
^ 位的异或
| 位的或
&& 逻辑的与
|| 逻辑的或
?: 条件表达式
= += -= *= /= %= &= ^= <<= >>= |= 赋值运算 a+=1 相当于 a=a+1
  • 运算示例
[root@localhost ~]# a=2
[root@localhost ~]# b=3
[root@localhost ~]# expr $a + $b
5
[root@localhost ~]# expr $a \* $b
6
[root@localhost ~]# expr $b \% $a
1

  • 运算结果赋值给其他变量 使用反撇号
[root@localhost ~]# num5=`expr $a \* $b \* $a`
[root@localhost ~]# echo $num5
12
  • 除了expr 变量数值常见的命令还有(())、let等。如果要执行简单的运算,只需将特定的算数表达式用“$((”和“))”括起来即可。
[root@localhost ~]# bb=$((1+2**3-4)) ## 算法为 1+2的三次方-4
[root@localhost ~]# echo $bb
5

五、特殊标量

5.1环境变量

  • 环境变量指的是出于运行需要而由linux系统提前创建的一类变量,主要用于设置用户的工作环境。包括用户宿主目录、命令查找路径、用户当前目录、登录终端等。
  • 环境变量的值由Linux系统自动维护,会随着用户状态的改变而改变。
  • 使用 env命令可以查看到当前工作环境下的环境变量,常见的环境变量有:
    USER:表示用户名称
    HOME:表示用户的宿主目录。
    LANG:表示语言和字符集
    PWD:表示当前所在的工作目录
    PATH:表示命令搜索路径。
[root@localhost ~]# env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=zh_CN.UTF-8
SELINUX_LEVEL_REQUESTED=
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root	
  • PATH 用于运行设置可执行程序的默认搜索路径,当指定文件名称来执行命令程序时,linux程序将在PATH变量指定的目录范围查找对应的可执行文件。
[root@localhost ~]# ls -lh /root/caiquan.sh   ## 查看脚本位置
-rwxr-xr-x. 1 root root 1.4K 7月  17 08:55 /root/caiquan.sh      
[root@localhost ~]# PATH="$PATH:/root"    ## 将root添加到搜索路径
[root@localhost ~]# caiquan.sh    ## 可以直接以文件名运行脚本
请输入您的出拳手势 其中  0代表拳头 1代表剪刀 2代表布 0
您出的是拳头
电脑出的是布
您输了,电脑赢了!
  • linux系统中,环境变量的全局配置文件为/etc/profile,此文件定义的变量用于所有用户。
  • 每个用户有自己的独立配置文件(~/.bash_profile)。

5.2 位置变量

  • 在使用linux脚本程序时,方便通过命令行 为 程序提供操作参数,Bash引入了位置变量的概念。
  • 执行命令行操作时,第一个字段表示命令名或者脚本程序名,其余的的字符串按照从左到右的顺序依次赋值给位置变量。
  • 位置变量也称为位置参数,用$1、$2、$3、$4、$5、$6、$7表示。
[root@localhost ~]# vim adder2num.sh
#! /bin/bash
SUM=`expr $1 + $2`
echo "$1+$2 = $SUM"
[root@localhost ~]# ./adder2num.sh 52 38
52+38 = 90 

5.3 预定义变量

  • 预定义变量是由Bash程序预先定义好的一类变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。
$#:表示命令行中位置参数的个数。
$*:表示所有位置参数的内容。
$?:表示前一条命令执行后的返回状态,返回值为0表示执行正常,返回非0值表示表示执行出现异常。
$0:表示当前执行的脚本或程序的名称。

猜你喜欢

转载自blog.csdn.net/weixin_47219725/article/details/107371890