zoukankan      html  css  js  c++  java
  • 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
    

  • 相关阅读:
    Warning! PATH is not properly set up...
    用rvm切换ruby
    Mac下多版本JDK安装
    iOS开发 密码里面含有特殊字符如何处理传给后端
    Cornerstone版本回退160013错误
    iOS 11 Xcode9 tableview点击cell上的按钮cell自动往上跳动
    iOS 获取全部字体的Fontfamily和FontName
    iOS WKWebView 点击超链接跳转至Safari
    iOS 11在window上加视图不显示
    Java并发(2)
  • 原文地址:https://www.cnblogs.com/SR-Program/p/12951423.html
Copyright © 2011-2022 走看看