Linux之Shell变量
Shell简介
Shell概念
- 在计算机科学中 Shell俗称壳,是指提供给用户使用界面的应用程序
- 这个应用程序提供了一个界面 用户通过这个界面访问操作系统内核的服务
- Shell建立了用户与操作系统内核之间的通讯
- 计算机只能识别二进制 Shell将我们输入的指令转换成二进制传递给计算机 在将计算机传递给用户的信息转换成人们所能明白的意思
Shell脚本
- Shell就是一堆Linux命令或者语句放在一个可执行文件中
- 当我们执行这个可执行文件的时候其便会执行内部的Linux的命令或者一些相应的语句
[root@SR ~]# vim test.sh # sh是给用户看的 一般shell脚本都是.sh结尾
#!/bin/bash # 指定shell解释器 如果不写则使用当前Shell作为执行Shell
touch /root/a.txt
echo 'hello world' > /root/a.txt
cat /root/a.txt#!/bin/bash
Shell执行方式
- 当前路径下执行Shell
[root@SR ~]# /root/test.sh 当前路径下执行 该文件需要有可执行权限
- bash/sh执行
[root@SR ~]# bash test.sh # 该种方式执行shell 其中shell文件可以没有执行权限
- source执行
[root@SR ~]# source test.sh
[root@SR ~]# . test.sh
Shell变量
概念
描述脚本在运行中一些数据的变化量 其保存在内存中
命名方式
- 变量名称通常是大写字母 由数字 字母 下划线组成
- 等号 = 用于为变量分配值, 在使用过程中等号两边不能有空格
- 变量存储的数据类型是整数值和字符串值
- 要对变量进行调用,可以在变量名称前加美元符号$
- 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含
[root@SR ~]# x=1
[root@SR ~]# echo $x
变量分类
- 用户自己定义的变量
[root@SR ~]# x=1
- 环境变量:主要保存和操作系统环境相关的变量
[root@SR ~]# env # 查看环境变量
- 位置参数变量:向Shell脚本中传递参数或者数据
[root@SR ~]# systemctl status firewalld.service
status与firewalld都属于位置参数变量
- 预定义变量:Bash内部自定义好的 变量名不能自定义
变量值叠加
$name 是${name}的简化版本,但是在某些情况下,迓必须使用花括号引起的方式来消除歧义并避免意外的结果
[root@SR ~]# VAR=mysql
[root@SR ~]# echo $VAR
[root@SR ~]# echo $VAR-db.log
[root@SR ~]# echo $VAR.db.log
[root@SR ~]# echo $VARdb.log # 数据不是我们想要的 VARdb被看作一个整体
[root@SR ~]# echo ${VAR}db.log # 取消歧义
命令的替换
如果需要一些关键词语进行充当变量使用``或者$()
[root@SR ~]# echo `ls` ls:作为关键字
anaconda-ks.cfg initial-setup-ks.cfg
[root@SR ~]# echo `date`
2020年 05月 24日 星期日 17:54:46 CST
时间进行加减的操作
date +%Y%m%d #显示当天年月日date -d "+1 day" +%Y%m%d #显示明天的日期
date -d "-1 day" +%Y%m%d #显示昨天的日期
date -d "-1 month" +%Y%m%d #显示上一月的日期
date -d "+1 month" +%Y%m%d #显示下一月的日期
date -d "-1 year" +%Y%m%d #显示前一年的日期
date -d "+1 year" +%Y%m%d #显示下一年的日期
命令嵌套使用
- 一般一个命令的执行结果作为另外一个命令的执行条件
- 使用$( $( ))
[root@SR ~]# VAR6=$(tar zcvf root.tar.gz $(find /root/ -name "*.txt"))
单双引号的区别
单引号
在单引号中所有的字符包括特殊字符($ \ `` '')等都被看成普通字符
[root@SR ~]# echo \VAR1 VAR被看成普通字符而非变量
VAR1
[root@SR ~]# echo 'hello SR $VAR1' # 在单引号中$会失去特殊符号的意义
hello SR $VAR1
双引号
在双引号中除了($ \ `` '')等都被看成为普通字符
[root@SR ~]# echo "hello SR $VAR1"
hello SR LOVE
变量删除
[root@SR ~]# unset VAR1
局部变量
[root@SR ~]# VAR1=123
[root@SR ~]# echo $VAR1
123
[root@SR ~]# vim a.sh
#!/bin/bash
echo $VAR1
[root@SR ~]# echo $VAR1
123
[root@SR ~]# bash a.sh #执行 a.sh 时,会使用另一个 bash 去执行,就访问不到$VAR1 的值
局部变量
[root@SR ~]# export VAR1=SR
[root@SR ~]# echo $VAR1
SR
[root@SR ~]# vim a.sh #写入以下内容
#!/bin/bash
echo $VAR1
[root@SR ~]# bash a.sh #引用全局变量成功
SR
写入配置文件
虽然我们设置了 export 全局变量,但是新开的 xshell 连接中,迓是读不到变量 VAR1
让变量永久生效,可以把定义好的变量写入配置文件
当登录系统戒新开启一个 ssh 连接启劢 bash 迕程时,一定会加载返 4 个配置文件:
[root@SR ~]# vim /etc/profile #系统全局环境和登录系统的一些配置
[root@SR ~]# vim /etc/bashrc #shell 全局自义配置文件,用于自定义 shell
[root@SR ~]# vim /root/.bashrc #用于单独自定义某个用户的 bash
[root@SR ~]# vim /root/.bash_profile #用户单独自定义某个用户的系统环境
[root@SR ~]# vim /etc/profile #在文件的最后插入
export VAR9=SR #=等号两边不能有空格
[root@SR ~]# source /etc/profile #重新加载 profile 文件新打开的链接中,也有了
Shell位置变量
- Shell 解释执行用户的命令时,将命令行的第一个字符作为命令而其它字符作为参数。
- $0 获取当前执行 shell 脚本的文件文件名,包括脚本路径,命令本身
- $n 获取当前脚本的第 n 个参数 n=1,2.....n 当 n 大于 9 时 用${10}表示
[root@SR ~]# vim print.sh
#!/bin/bash
echo "本 shell 脚本的文件名: $0"
echo "第 1 个参数: $1"
echo "第 2 个参数: $2"
echo "第 3 个参数: $3"
echo "第 4 个参数: $4"
[root@SR ~]# chmod +x print.sh
[root@SR ~]# ./print.sh 111 222 a.txt 444
特殊变量
有些变量是一开始执行 Script 脚本时就会设定,且丌能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。返些变量当一执行程序时就有了,以下是一些特殊变量:
[root@SR ~]# vim special_variable.sh #写入以一下内容
#!/bin/bash
echo "$* 表示返个程序的所有参数 "
echo "$# 表示返个程序的参数个数"
echo "$$ 表示程序的迕程 ID "
touch /tmp/b.txt &
echo "$! 执行上一个后台指令的 PID"
echo "$$ 表示程序的迕程 ID "
echo "$? 表示上一个程序执行迒回结果
变量自增
变量++
先进行变量输出在自增
[root@SR ~]# x=1
[root@SR ~]# echo $(x++)
[root@SR ~]# echo $((x++))
[root@SR ~]# echo $((x++))
[root@SR ~]# echo $((x++))
++变量
先进行自增在进行输出
[root@SR ~]# y=1
[root@SR ~]# echo $((++y))
[root@SR ~]# echo $((++y))
[root@SR ~]# echo $((++y))
expr
进行数字的基本运算
[root@SR ~]# expr 2 \> 5
0 # 为假
[root@SR ~]# expr 6 \> 5
1 # 为真
[root@SR ~]# expr 3 * 5
expr: 语法错误
[root@SR ~]# expr 3 \* 5
15
[root@SR ~]# expr 3 \+ 5
8
read
作用
- 在用户与shell进行交互的时候 接受用户输入的值
- 该命令可以一次性接受多个变量输入 变量之间用空格隔开
- 如果没有指定变量名 读取的数据将会自动赋值给REPLY
[root@SR ~]# read x y # 接受用户输入的值
[root@SR ~]# echo $x $y
可选参数
-p
等待read输入的时候 输出提示信息
[root@SR ~]# read -p "请输入用户名>>:" username
-t
当用户在一定时间内不输入信息 便会执行下一条数据
[root@SR ~]# vim read.sh
#!/bin/bash
echo "四则运算"
read -t 5 -p "请输入你要进行运算的数字>>:" num1
read -t 5 -p "请输入你要运算的方式>>:" mark
read -t 5 -p "请输入你要进行运算的数字>>:" num2
echo $(($num1 $mark $num2))
-n
限制输入字符的数量 然后立即执行
[root@SR ~]# vim read.sh
#!/bin/bash
echo "四则运算"
read -t 5 -p "请输入你要进行运算的数字>>:" num1
read -n 1 -t 5 -p "请输入你要运算的方式>>:" mark
read -t 5 -p "请输入你要进行运算的数字>>:" num2
echo $(($num1 $mark $num2))
-s
隐藏输入的内容 但是本部是在输入的 我们看不见输入的内容
[root@SR ~]# read -s -p "请输入用户密码>>:" password
[root@SR ~]# echo $password
-r
允许输入的内容中包括特殊字符 例如:\被识别普通的字符
[root@SR ~]# read -r line
[root@SR ~]# echo $line