美文网首页
二、 shell变量

二、 shell变量

作者: 胖虎喜欢小红 | 来源:发表于2019-12-18 19:14 被阅读0次

    ⼀、什么是变量

    简单说就是让⼀个特定的字符串代表不固定的内容

    yy=123

    yy是变量的名字,123是变量的值

    echo $yy //查看变量的值
    

    就是⽤⼀个简单的好记的字符串,来取代⽐较复杂或者容易变动的数据

    ⼆、变量的设定

    设定规则:

    变量名与变量内容以⼀个等号 = 的连结,且等号两边不能有空格。如下所示:

    myname=XiguaTian
    
    1. 变量名称只能是英⽂字⺟与数字,但是开头字符不能是数字,如下为错误:

      2myname=xiguatian

    变量内容若有空格符可使⽤双引号 " 或单引号 ' 将变量内容组合起来,但双引号内的特殊字符如 $ 、 ! 等,可以保有原本的特性,如下所示:

    var="lang is $LANG"
    #则
    echo $var
    #可得
    lang is en_US
    

    感叹号 ! 不可以在shell命令⾏⾥直接在双引号⾥使⽤,但是可以在脚本中使

    ⽤。

    单引号内的特殊字符则仅为⼀般字符 (纯⽂本),如下所示:

    var='lang is $LANG'
    # 则
    echo $var
    #可得
    lang is $LANG
    

    可⽤转意符 \ 将特殊符号(如 [Enter] , $ , \ , 空格符 , 等)变成⼀般字

    符;

    在⼀串命令中,还需要藉由其他的命令提供的信息,可以使⽤反单引号 `命

    令` 或 $(命 令) (推荐这种)。特别注意,那个反引号 是键盘上⽅癿数字

    键 1` 左边那个按键,⽽不是单引号!

    例如想要取得

    核⼼版本的内容:
    version=(uname -r) # 再 echoversion
    #可得
    4.9.125-linuxkit

    [root@biudefor script]# a=10
    [root@biudefor script]# b=$a1      //被认为a1是一个变量
    [root@biudefor script]# echo $b
    
    [root@biudefor script]# b=${a}1
    [root@biudefor script]# echo $b
    101
    

    增加变量的内容时,则可⽤ "变量名称"字符串 或{变量}字符串 (推荐)累加内容,如下所示:

    PATH="$PATH":/home/bin
    PATH=${PATH}:/home/bin
    

    增加一个环境变量的位置,可以在里面自定义给命令赋值

    [root@biudefor script]# echo $PATH
    /usr/local/java/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@biudefor script]# mkdir /script/bin
    [root@biudefor script]# echo "uname -r" > /script/bin/gg
    [root@biudefor script]# chmod +x /script/bin/gg
    [root@biudefor script]# gg
    -bash: gg: command not found
    [root@biudefor script]# PATH=${PATH}:/script/bin
    [root@biudefor script]# gg
    3.10.0-693.el7.x86_64
    

    若该变量需要在其他⼦程序执⾏,则需要以 export 来使变量变成环境变量:export PATH

    通常⼤写字符为系统默认变量,⾃定义变量可以使⽤⼩写字符,⽅便判断

    (纯粹个⼈习惯) ;

    取消变量的⽅法为使⽤ unset : unset 变量名称 例如取消 myname 的设

    定:

    unset myname
    

    三、 环境变量

    这种变量是会影响bash环境操作的,会在真正进⼊系统前由⼀个bash程序读⼊到系统中。通常都环境变量的名字以⼤写字符命名。

    常⻅环境变量

    PATH HOME MAIL SHELL PWD USERNAME UID ID 等。

    RANDOM 随机数

    echo $RANDOM
    

    PS1 :(提示字符的设置)

    \d :可显示出“星期 ⽉ ⽇”的⽇期格式,如:"Mon Feb 2"
    \H :完整的主机名称。举例来说,⻦哥的练习机为“study.centos.vbird”
    \h :仅取主机名称在第⼀个⼩数点之前的名字,如⻦哥主机则为“study”后
    ⾯省略
    \t :显示时间,为 24 ⼩时格式的“HH:MM:SS”
    \T :显示时间,为 12 ⼩时格式的“HH:MM:SS”
    \A :显示时间,为 24 ⼩时格式的“HH:MM”
    \@ :显示时间,为 12 ⼩时格式的“am/pm”样式
    \u :⽬前使⽤者的帐号名称,如“dmtsai”;
    \v :BASH 的版本信息,如⻦哥的测试主机版本为 4.2.46(1)-release,仅
    取“4.2”显示
    \w :完整的⼯作⽬录名称,由根⽬录写起的⽬录名称。但主⽂件夹会以 ~
    取代;
    \W :利⽤ basename 函数取得⼯作⽬录名称,所以仅会列出最后⼀个⽬录
    名。
    # :下达的第⼏个指令。
    $ :提示字符,如果是 root 时,提示字符为 # ,否则就是 $
    

    读取环境变量的值

    echo $HOME
    

    列出shell环境下的所有环境变量及其内容

    env // env 是 environment (环境) 的简写,默认的环境变量
    set // 列出系统中所有的变量,包括⾃定义的变量
    export 变量名 // 使⾃定义的变量 成为 环境变量,环境变量可以被继承
    

    ⼦程序仅会继承⽗程序的环境变量, ⼦程序不会继承⽗程序的⾃订变量

    name=shark
    export name
    bash
    echo $name
    

    bash 的环境变量⽂件

    longin shell
    取得shell时需要完整的登⼊流程;特点是登⼊时需要⽤户帐号和密码
    non-login shell
    取得shell时不需要再次输⼊帐号和密码的情况下,所得到的 shell
    longin shell 会读取以下两个⽂件:
    /etc/profile· :这是系统整体设定,最好不要修改
    ~/.bash_profile 或 ~/.bash_login 或 ~/.profile` :属于个⼈的配置⽂件
    
    /etc/profile 会主动依序调⽤以下脚本⽂件:
    
    /etc/inputrc :定义快捷键
    /etc/profile.d/*sh :定义bash操作接⼝颜⾊、语系、命令别名等
    /etc/locale.conf :定义系统的默认语系
    
    bash 在读完 /etc/profile 后,接下来会读取以下3个⽂件,且只会读去⼀个,会按照以下顺序优先读取
    ~/.bash_profile //会调⽤ ~/.bashrc ,
    也会有新的环境变量在下⾯的⽂件中被添加
    ~/.bash_login
    ~/.profile
    
    最终, ~/.bashrc 才是最后被读⼊到系统环境中的⽂件
    让这些环境变量⽂件中的变量等设置及时在当前 shell 终端中⽣效,有下两种⽅式
    source ~/.bashrc
    或者
    ~/.bashrc
    
    no-longin shell 当取得 no-longin shell 时,该 shell 仅会读取
    ~/.bashrc ⽂件 ⽽ ~/.bashrc 最后⼜会调⽤ /etc/bashrc
    /etc/bashrc 的作⽤:
    依据不同的UID定义出 umask 值
    依据不同的UID定义出提示符(就是PS1变量)
    呼叫 /etc/profile.d/*.sh 的设定
    其他的相关配置⽂件
    /etc/man.config
    这个⽂件最重要的就是定义了 MANPATH 这个变量,它定义了man page 的路径;
    在以tarball的⽅式安装软件时有⽤
    ~/.bash_history
    历史命令记录⽂件;记录的数量与HISTFILESIZE变量有关。在 /etc/profile ⾥ • ~/.bash_logout
    记录了当我注销bash后,系统再帮我做完什么动作后才离开的。
    

    四、预定义变量

    预定义的特殊变量有着特殊的含义,⽤户不可以更改,所有的预定义变量都由 $ 符号和另外⼀个符号组成,常⽤的预定义特殊变量如下:

    $! 上⼀个后台命令对应的进程号
    $? 上⼀个命令的退出状态,为⼗进制数字,如果返回为0,则代表执⾏成功,则否
    为不成功。
    $$ 当前的进程号PID
    

    以上变量请配合 echo 使⽤,例如:

    echo $! 
    echo $$ 
    echo $?
    

    read

    [root@www ~]# read [-pt] variable
    选项不参数:
    -p :后⾯可以接提示字符!
    -t :后⾯可以接等待的『秒数!』这个⽐较有趣~不会⼀直等待使⽤者啦!
    
    #vi read.sh
    read -p “请输⼊你的姓名” name
    echo "你的姓名是: $name"
    

    五、变量内容的删除、取代与替换

    删除

    先让小写的 path 自订变量设置的与 PATH 内容相同
    [dmtsai@study ~]$ path=${PATH} 
    [dmtsai@study ~]$ echo ${path} /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shark/bin 
    

    删除最后一个

    echo ${path%:*}
    

    % 从字符串的后面开是进行匹配删除,但匹配到第一个时就结束匹配。

    :* 就是需要进行匹配的字符串 , : 是普通字符串 * 是通配符,代表任何数量的任意字符串。

    所以下面的红色字体的字符串将会匹配后进行删除

    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shark/bin

    删除第一个

    echo ${path#*:}
    

    是从前面开始匹配删除,匹配到道理和上面的 % 同样的道理

    ${path#*:} 就是 从变量值的最前面开始匹配,直到遇到第一个 : 结束

    所以下面的红色字体会被匹配后删除

    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/shark/bin

    取代和替换 11414906-d02066abb6a86a7a.png

    var=${str:-expr}

    str 和 var 可以是相同的字符串。比如 inpu_date=${inpu_date:-expr}

    expr 可以是任意合法的表达式,比如一个字符串,一个子 shell 的命令 $(date +%F)

    示例,假如希望用户输入一个日期,当用户没有输入时,就给一个默认值,这里给的是当天的日期

    read  -p  "输入日期>:"   input_date
    
    input_date=${input_date:-$(date +%F)}
    
    echo "当前的日期是:${input_date}"
    
    #(-)当变量没有赋值时,就会获取设定的默认值,如果变量已经被赋值或空值,就不会获取这个默认值
    [root@biudefor script]# a=10
    [root@biudefor script]# b=${a-10}
    [root@biudefor script]# echo $b
    10
    [root@biudefor script]# unset a
    [root@biudefor script]# b=${a-10}
    [root@biudefor script]# echo $b
    10
    
    #(:-)当变量没有被赋值或空值是,就会获得这个设定的默认值,如果变量被赋值就不会改变
    [root@biudefor script]# a=10
    [root@biudefor script]# b=${a:-99}
    [root@biudefor script]# echo $b
    10
    [root@biudefor script]# unset a
    [root@biudefor script]# b=${a:-99}
    [root@biudefor script]# echo $b
    99
    [root@biudefor script]# unset a
    [root@biudefor script]# a=''
    [root@biudefor script]# b=${a:-99}
    [root@biudefor script]# echo $b
    99
    

    位置变量

    # $?  上一条命令的返回值
    # $0  程序名称,脚本的文件名
    # $1  执行脚本时,跟到脚本后面的第一个参数
    # $2...
    # $#  位置变量的个数
    # $@  所有的位置变量的值
    
    [root@biudefor script]# vim weizhi.sh
    echo "$0"
    echo "$1"
    echo "$2"
    echo "$#"     //位置参数的个数
    echo "$@"     //列出所有的参数
    [root@biudefor script]# bash weizhi.sh 1 2 3
    weizhi.sh
    1
    2
    3
    1 2 3
    

    时间运算

    // 计算 3 小时之后是几点几分
    date +%T -d '3 hours'
    
    // 任意日期的前 N 天,后 N 天的具体日期
    date +%F -d "20190910 -1 day"
    date +%F -d "20190910 1 day"
    
    // 计算两个日期相差天数, 比如计算生日距离现在还有多少天
    d1=$(date +%s -d 20180728)       //%s   Unix创建至今的秒数
    d2=$(date +%s -d 20180726)
    echo $(((d1-d2)/86400))          // echo $(( 80 - 75 ))  5
    [root@biudefor script]# echo $((149/30));echo $((149%30))   # / 取整 ,% 取余
    4
    29
    
    
    ##  let
    [root@biudefor script]# let n=5
    [root@biudefor script]# echo $n
    5
    [root@biudefor script]# let n=5+5
    [root@biudefor script]# echo $n
    10
    [root@biudefor script]# let n=10/5
    [root@biudefor script]# echo $n
    2
    

    相关文章

      网友评论

          本文标题:二、 shell变量

          本文链接:https://www.haomeiwen.com/subject/fuounctx.html