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

原文地址:https://www.cnblogs.com/SR-Program/p/12951423.html