Linux之Shell变量

Shell简介#

Shell概念#

  • 在计算机科学中 Shell俗称壳,是指提供给用户使用界面的应用程序
  • 这个应用程序提供了一个界面 用户通过这个界面访问操作系统内核的服务
  • Shell建立了用户与操作系统内核之间的通讯
  • 计算机只能识别二进制 Shell将我们输入的指令转换成二进制传递给计算机 在将计算机传递给用户的信息转换成人们所能明白的意思

Shell脚本#

  • Shell就是一堆Linux命令或者语句放在一个可执行文件中
  • 当我们执行这个可执行文件的时候其便会执行内部的Linux的命令或者一些相应的语句
Copy
[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
Copy
[root@SR ~]# /root/test.sh 当前路径下执行 该文件需要有可执行权限

  • bash/sh执行
Copy
[root@SR ~]# bash test.sh # 该种方式执行shell 其中shell文件可以没有执行权限

  • source执行
Copy
[root@SR ~]# source test.sh [root@SR ~]# . test.sh

Shell变量#

概念#

描述脚本在运行中一些数据的变化量 其保存在内存中

命名方式#

  • 变量名称通常是大写字母 由数字 字母 下划线组成
  • 等号 = 用于为变量分配值, 在使用过程中等号两边不能有空格
  • 变量存储的数据类型是整数值和字符串值
  • 要对变量进行调用,可以在变量名称前加美元符号$
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含
Copy
[root@SR ~]# x=1 [root@SR ~]# echo $x

变量分类#

  • 用户自己定义的变量
Copy
[root@SR ~]# x=1
  • 环境变量:主要保存和操作系统环境相关的变量
Copy
[root@SR ~]# env # 查看环境变量
  • 位置参数变量:向Shell脚本中传递参数或者数据
Copy
[root@SR ~]# systemctl status firewalld.service status与firewalld都属于位置参数变量
  • 预定义变量:Bash内部自定义好的 变量名不能自定义

变量值叠加#

$name 是${name}的简化版本,但是在某些情况下,迓必须使用花括号引起的方式来消除歧义并避免意外的结果

Copy
[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 # 取消歧义

命令的替换#

如果需要一些关键词语进行充当变量使用``或者$()

Copy
[root@SR ~]# echo `ls` ls:作为关键字 anaconda-ks.cfg initial-setup-ks.cfg [root@SR ~]# echo `date` 20200524日 星期日 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 #显示下一年的日期

命令嵌套使用#

  • 一般一个命令的执行结果作为另外一个命令的执行条件
  • 使用$( $( ))
Copy
[root@SR ~]# VAR6=$(tar zcvf root.tar.gz $(find /root/ -name "*.txt"))

单双引号的区别#

单引号#

在单引号中所有的字符包括特殊字符($ \ `` '')等都被看成普通字符

Copy
[root@SR ~]# echo \VAR1 VAR被看成普通字符而非变量 VAR1 [root@SR ~]# echo 'hello SR $VAR1' # 在单引号中$会失去特殊符号的意义 hello SR $VAR1

双引号#

在双引号中除了($ \ `` '')等都被看成为普通字符

Copy
[root@SR ~]# echo "hello SR $VAR1" hello SR LOVE

变量删除#

Copy
[root@SR ~]# unset VAR1

局部变量#

Copy
[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 的值

局部变量#

Copy
[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

Copy
让变量永久生效,可以把定义好的变量写入配置文件 当登录系统戒新开启一个 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}表示
Copy
[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 脚本时就会设定,且丌能被修改,但我们不叫它只读的系统变量,而叫它特殊变量。返些变量当一执行程序时就有了,以下是一些特殊变量:

Copy
[root@SR ~]# vim special_variable.sh #写入以一下内容 #!/bin/bash echo "$* 表示返个程序的所有参数 " echo "$# 表示返个程序的参数个数" echo "$$ 表示程序的迕程 ID " touch /tmp/b.txt & echo "$! 执行上一个后台指令的 PID" echo "$$ 表示程序的迕程 ID " echo "$? 表示上一个程序执行迒回结果

变量自增#

变量++#

先进行变量输出在自增

Copy
[root@SR ~]# x=1 [root@SR ~]# echo $(x++) [root@SR ~]# echo $((x++)) [root@SR ~]# echo $((x++)) [root@SR ~]# echo $((x++))

++变量#

先进行自增在进行输出

Copy
[root@SR ~]# y=1 [root@SR ~]# echo $((++y)) [root@SR ~]# echo $((++y)) [root@SR ~]# echo $((++y))

expr#

进行数字的基本运算

Copy
[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
Copy
[root@SR ~]# read x y # 接受用户输入的值 [root@SR ~]# echo $x $y

可选参数#

-p#

等待read输入的时候 输出提示信息

Copy
[root@SR ~]# read -p "请输入用户名>>:" username

-t#

当用户在一定时间内不输入信息 便会执行下一条数据

Copy
[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#

限制输入字符的数量 然后立即执行

Copy
[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#

隐藏输入的内容 但是本部是在输入的 我们看不见输入的内容

Copy
[root@SR ~]# read -s -p "请输入用户密码>>:" password [root@SR ~]# echo $password

-r#

允许输入的内容中包括特殊字符 例如:\被识别普通的字符

Copy
[root@SR ~]# read -r line [root@SR ~]# echo $line

posted @   SR丶  阅读(297)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示
CONTENTS