zoukankan      html  css  js  c++  java
  • shell编程之变量

     

    Shell变量核心基础知识与实践

    1.shell变量知识

    1.什么是变量?
    就是用一个字符或字符串,表示一堆的内容,这个字符或字符串就叫变量,如x=1,x就是变量,=赋值,=表示相等,等号右边的内容,变量的内容。
    2.Shell变量特性
    默认情况下,在bash Shell中是不会区分变量是什么类型 的,例如:常见的变量类型为整数、字符串、小数等。
    3.Shell变量分类
    变量可分为两类:环境变量(全局变量)和普通变量 (局部变量)。环境变量也可称为全局变量,可以在创 建他们的Shell及其派生出来的任意子进程Shell中使用, 环境变量又可分为自定义环境变量和bash内置的环境变 量。普通变量也可称为局部变量,只能在创建他们的 Shell函数或Shell脚本中使用。普通变量一般由开发者在开发脚本程序时创建。

    1.2 shell环境变量(全局变量)介绍

    环境变量一般是用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行。Shell通过环境变量来确定登录用户名、命令路径、 终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、Shell脚本和各类应用。

    1.2.1 操作shell环境变量

    1.显示环境变量
    echo $变量名字
    env,set
    2.定义环境变量,3种方法:变量名尽量大写
    1)export A=1
    2)B=1
    export B
    3)declare
    declare -x A=1
    3.取消环境变量
    unset 变量名
    

    1.2.2 环境变量初始化与对应文件生效顺序

    1.环境变量的文件:
    全局文件
        /etc/profile
        /etc/bashrc
    用户环境变量文件
        ~/.bashrc
        ~/.bash_profile
    2.环境变量初始化与对应文件生效顺序:优先加载/etc/profile,然后加载~/.bash_profile再次加载~/.bashrc,最后加载/etc/bashrc
    ~/.bash_profile  4
    ~/.bashrc 3 
    /etc/bashrc 2
    /etc/profile 1
    

    1.3 普通变量(局部变量)

    当前用户或者脚本中生效,离开当前用户或者脚本就会失效

    1.3.1 操作shell普通变量

    1.定义普通变量
    规则:见名知意,字母、数字、下划线,3者组合,以字母开头
    1)OldboyAge=1
    2)oldboy_age=1
    3) oldboyAge=1  ###驼峰语法
    2.变量内容
    字符串:
    变量名=value     #<==不加引号。 ##解析变量或者命令,然后输出,纯数字选择不加引号。
    变量名=’value’   #<==加单引号。 ###所见即所得
    变量名=”value”   #<==加双引号。 ##解析变量或者命令,然后输出,字符串默认选择双引号,可以把要定义的内容作为一个整体。
    3.命令变量
    变量名=`ls`
    变量名=$(ls)
    

    1.3.2 普通变量定义及输出小结

    针对变量名: 
    1)变量名的定义要有一定的命令规范,并且要见名知意,OldboyAge=1,推荐使用驼峰语法。
    2)变量名仅能使用字母、数字、下划线中的任意多个字符,并且要字母开头。
    针对变量内容:
    3)在脚本中定义普通字符串变量,尽量把变量的内容用双引号括起来。
    4)单纯数字的变量内容可以不加引号。
    5)希望变量的内容原样输出需加单引号。
    6)希望变量值引用命令并获取命令的结果就用反引号或$()。
    针对赋值符号: 
    7)变量定义使用赋值符号(=),赋值符号两端不要有空格。
    针对变量输出: 
    8)使用或者输出变量的内容,可用$变量名,例如:echo $OldboyAge。
    9)若变量名(db)后面有其他字符连接的时候,就必须给变量名加上大括号{},例如:$db_t就要改成${db}_t
    

    1.4 Shell特殊重要变量

    1.4.1 shell特殊位置变量

    在Shell中存在一些特殊且重要的变量,例如:0、1、$#,我们称之为特殊位置参数变量,要从命令行、函数、或脚本执行等处传递参数时,就需要在 Shell脚本中使用位置参数变量

    位置变量作用说明企业应用
    $0 获取当前脚本的名称,如脚本前面跟着路径的话,那就获取脚本的路径加名称 一般在启动脚本的结尾会使用$0获取脚本的路径和名字给用户提示用
    $n 获取当前脚本的第n个参数值,n=1..9,当n为0时表示文件名,如果n大于9,则需要用大括号括起来,例如${10},接的参数以空格分隔 一般用于选择脚本的启动,停止等
    $* 获取当前脚本所有传参的参数,不加引号作用同$@,如果给$加上引号,例如:"$",则表示将所有的参数视为单个字符,例如"$1 $2 $3" 当需要接收脚本后面所有参数时,但是又不知道参数个数就用这个变量
    $@ 获取当前脚本所有传参的参数,不加引号作用同$*,如果给$@加上引号,例如:"$@",则表示将所有的参数视为不同的独立字符串,例如"$1" "$2" "$3" 当需要接收脚本后面所有参数时,但是又不知道参数个数就用这个变

    1.4.2 shell进程特殊状态变量

    状态变量作用说明
    $? 获取上一个指令的执行状态返回值(成功为0,不成功非0)
    $$ 获取当前脚本的进程号(PID)
    $! 获取上一个在后台工作进程的进程号
    $_ 获取上一个命令或脚本的最后一个参数

    1.4.3 shell变量子串知识

    ID表达式作用说明
    1 ${parameter} 返回${parameter}变量内容
    2 ${#parameter} 返回${parameter}内容长度(按字符)
    3 ${parameter:offset} 在变量${parameter}中,从位置offset之后提取子符串到结尾
    4 ${parameter:offset:length} 在变量${parameter} 中,从位置offset之后提取长度为length的字符串
    5 ${parameter#word} 从变量${parameter}开头删除最短匹配的word字符串
    6 ${parameter##word} 从变量${parameter}开头删除最长匹配的word字符串
    7 ${parameter%word} 从变量${parameter}结尾开始删除最短匹配的word字符串
    8 ${parameter%%word} 从变量${parameter}结尾开始删除最长匹配的word字符
    9 ${parameter/pattern/string} 使用string替换第一个匹配pattern
    10 ${parameter//pattern/string} 使用string替换所有匹配pattern

    1.4.4 shell特殊变量扩展

    表达式作用说明用途
    ${parameter:-word} 如果parameter变量为空或未赋值,就会返回字符串替代变量的值 如果变量未定义,则返回备用的值,防止变量为空或者未定义而导致异常
    ${parameter:=word} 如果parameter变量为空或未赋值,就设置这个变量值为word并返回其值。位置变量与特殊变量不适用 基本同上一个${parameter:-word}相同,不同的是会额外给parameter变量赋值
    ${parameter:?word} 如果parameter变量为空或未赋值,word字符串将被作为标准错误输出,否则输出变量的值 用于捕捉由于变量未定义而导致的错误,并退出程序
    ${parameter:+word} 如果parameter变量为空或未赋值,则什么不做,否则word字符串会替代变量的值  

    2. shell变量的数值计算

    2.1 算术运算符

    2.2 bash编程常见运算命令汇总

    运算操作符与运算命令意义
    (()) 用于整数运算的常用运算符
    let 用于整数运算,类似(())
    expr 用于整数运算,但还有其它的额外功能
    s[] 用于整数运算
    bc 用于小数或整数运算
    awk 用于小数或整数运算
    declare 定义变量值和属性,-i参数可以用于定义整形变量,做运算

    2.3 双小括号“(())”数值运算的基础语法

    运算操作符与运算命令意义
    ((i=i+1)) 此种书写方法,先运算后赋值法,即将i+1的结果赋值给变量i,不能使用echo"((i=i+1))"的输出形式,可以使用echo $((i=i+1))输出其值
    i=可以在前加((i+1))|可以在(())前加符,将表达式运算后赋值给i  
    ((8>7&&5==5)) 可以进行比较操作,还可以加入逻辑或与逻辑与,用于条件判断
    echo 需要直接输出运算表达式结果可以在前加((2+1))|需要直接输出运算表达式结果可以在(())前加  

    2.4 let运算语法

    语法格式: let 赋值表达式
    let赋值表达式同等于((赋值表达式))
        [root@ci-node1 scripts]# aa=12
    [root@ci-node1 scripts]# let i=$aa+10
    [root@ci-node1 scripts]# echo $i
    22
    [root@ci-node1 scripts]# 
    

    2.5 expr命令计算基本用法

    [root@ci-node1 scripts]# expr 2  +  2
    4
    [root@ci-node1 scripts]# expr 2  *  2
    4
    [root@ci-node1 scripts]# expr 2  /  2
    1
    注意:使用expr时,运算符与计算的数所必须要有空格隔开,使用*号时需要使用转义符进行转义
    

    2.5.1 expr其它用法,判断一个数字是否为整数

    [root@ci-node1 scripts]# i=5
    [root@ci-node1 scripts]# expr $i + 6 &>/dev/null #&>/dev/null表示不保留任务的输出
    [root@ci-node1 scripts]# echo $?
    0
    [root@ci-node1 scripts]# expr $i + 6a &>/dev/null
    [root@ci-node1 scripts]# echo $?
    2
    使用expr判断数字是否为整数,如果echo $?返回0则表示是一个整数,返回非0则表示不是一个整数
        #!/bin/bash
    expr 2 + $1 & >/dev/null
    if [ $? -ne 0 ]
    then 
       echo "这不是一个整数"
    else
       echo "这是一个整数"
    fi
    

    2.5.2 使用expr判断文件扩展名是否符合要求

    #!/bin/bash
    expr "$1" : ".*.txt" &>/dev/null
    if [ $? -eq 0 ]
    then
        echo "$1 是文本"
    else
        echo "$1 不是文本"
    fi
    

    2.5.3 使用expr来计算字符串长度

    [root@ci-node1 scripts]# oldboy="I am oldboy"
    [root@ci-node1 scripts]# expr length "$oldboy"
    11
    

    2.6 适合小数运算的bc命令(需先安装bc命令)

    [root@ci-node1 scripts]# echo 1.2+3.3|bc
    4.5
    [root@ci-node1 scripts]# echo 1.2*3.3|bc
    3.9
    [root@ci-node1 scripts]# echo 1.2/3.3|bc
    0
    [root@ci-node1 scripts]# echo 1.2%3.3|bc
    1.2
    [root@ci-node1 scripts]# echo "scale=2;335/113"|bc # scale表示保留几位小数
    2.96
    

    2.7 适合小数运算的awk命令

    [root@ci-node1 scripts]# echo "335 113"|awk '{print ($1-$2)}' # $1表示第一个数字,$2表示第二个数字
    222
    [root@ci-node1 scripts]# echo "335 113"|awk '{print ($1*$2)}'
    37855
    [root@ci-node1 scripts]# echo "335 113"|awk '{print ($1+10)*$2}'
    38985
    

    3.特殊内置命令read

    shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入中获取,read为bash内置命令,可以通过help read获取帮助
    语法格式:read [参数] [变量名]
    常用参数:
        -p prompt:设置提示信息
        -t tiemout:设置输入等待时间,单位默认为秒
    

    3.1 基于shell变量输入read命令

    将加减乘除计算的脚使用read方式读入整数变量
    [root@ci-node1 scripts]# cat 4.sh 
    #!/bin/bash
    read -p "请输入两个数字:" a b 
    echo "a-b=$(($a-$b))"
    echo "a+b=$(($a+$b))"
    echo "a*b=$(($a*$b))"
    echo "a**b=$(($a**$b))"
    echo "a/b=$(($a/$b))"
    echo "a%b=$(($a%$b))"
    [root@ci-node1 scripts]# sh 4.sh
    请输入两个数字:11 22
    a-b=-11
    a+b=33
    a*b=242
    a**b=-2732210440490168087
    a/b=0
    a%b=11
    

    4.shell脚本的条件测试与比较

    4.1 条件表达式常见语法

    条件测试语法说明
    test <测试表达式> 利用test命令进行测试表达式的方法,test与测试表达式之间有一个空格
    [测试表达式] 这是通过中括号进行测试表达式的方法,与test用法相同,[]边界和内容之间至少 有一个空格
    [[测试表达式]] 这是通过双中括号进行测试表达式的方法 ,[[]]边界和内容之间至少 有一个空格
    ((测试表达式)) 这是通过双小括号进行测试表达式的方法,一般用于if语句里,(())两端不需要空格
    (命令表达式) 这是通过小括号进行测试表达式的方法
    `命令表达式` 这是通过反引号进行测试表达式的方法

    4.2 文件测试表达式的常见功能说明

    常用文件测试参数说明
    -d(directory) 文件存在且为目录则为真
    -f文件,f全拼为file 文件存在且为普通文件则为真
    -e(exist) 文件存在则为真,-e不辩别是目录还是文件
    -r(read) 文件存在且可读则为真
    -s(size) 文件存在且文件大小不为0则为真
    -w(write) 文件存在且文件可写则为真
    -x(executable) 文件存在且文件可执行则为真
    -L(link) 文件存在且为链接文件则为真
    f1 -nt(newer than) f2 文件f1比文件f2新则为真,根据修改时间来算
    f1 -ot(older than) f2 文件f1比文件f2旧则为真,根据修改时间来算

    4.3 字符串测试表达式的常见功能说明

    字符串参数说明
    -n "字符串" 若字符串长度不为0则为真
    -z "字符串" 若字符串长度为0则为真
    "字符串" = "字符串" 若字符串相等则为真
    "字符串" != "字符串" 若字符串不相等则为真

    4.4 整数测试表达式知识

    []与test中使用的比较符号(()) 与[[]]使用的符号说明
    -eq(equal) == 等于
    -ne(not equal) != 不等于
    -gt(greater than) > 大于
    -lt(less than) < 小于
    -ge(greater equal) >= 大于等于
    -le(less equal) <= 小于等于

    ps:可以使用man test来查看更多的文件比较符号

    4.5 逻辑测试表达式

    4.6 条件表达式符号的语法对比

  • 相关阅读:
    给定一个无序数组arr,求出需要排序的最短子数组长度。例如: arr = [1,5,3,4,2,6,7] 返回4,因为只有[5,3,4,2]需要排序。
    Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()"
    shell数组
    学习ansible(一)
    nginx搭建简单直播服务器
    rsync
    Linux运维最常用150个命令
    Linux 三剑客
    学习Python(一)
    学习k8s(三)
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/10748218.html
Copyright © 2011-2022 走看看