关闭

【shell script】变量及其相关操作

标签: shellLinux
217人阅读 评论(0) 收藏 举报
分类:

shell script中的变量不分数据类型,只有数值和字符串两种值。有几个点需要注意:

  • 变量定义时不能加上$
  • 中间不能有空格
  • 首字符是字母
  • 不能使用关键字和标点符号。
  • ~相关的内置变量

    variable using
    ~username user’s home directory
    ~+ $PWD
    =~ 正则表达式匹配
    ~- 上一个工作路径

    eg: cd - is same as cd ~-

    $变量

    变量 作用
    $# 输入脚本的参数个数
    $1 输入脚本的第1个参数
    $n 输入脚本的第n个参数
    $$ 脚本的PID
    $? 最后命令的退出状态
    $* 所有的参数
    $@ 所有参数,不过和$*有区别
    $! Shell最后运行的后台Process的PID
    $- 使用Set命令设定的Flag一览
    $0 Shell本身的文件名

    $@$*的区别
    例子:
    脚本名称叫test.sh,入参三个: 1 2 3
    运行test.sh 1 2 3
    $*"1 2 3"(一起被引号包住)
    $@"1" "2" "3"(分别被包住)

    给变量赋值NULL

    var=unset var两种置NULL的方法都是可以的。

    #! /bin/bash
    
    var=
    echo ${var}
    let var=1+1
    echo ${var}
    unset var
    echo ${var}

    执行:

    [edemon@CentOS workspace]$ ./NULL.sh 
    
    2
    

    假设没有给一个变量赋初值(直接使用未定义的变量),那么他的值默认是NULL,可以使用-z判断(检测变量的长度是否为0)。

    [edemon@CentOS workspace]$ cat unsigned.sh 
    #! /bin/bash
    
    echo $unsigned
    if [ -z $unsigned ]; then
        echo '$unsigned is NULL'
    else
        echo '$unsigned is not NULL'
    fi
    [edemon@CentOS workspace]$ ./unsigned.sh 
    
    $unsigned is NULL

    但是,如果对未赋值的变量进行算术操作,那么相当于在0的基础上操作。bash会把不是整数的整数(比如将string当做整数的情况)当做0。

    awk引用外部shell变量

    利用awk -v可以做到引用外部shell变量,给变量赋值。

    #! /bin/bash
    var="hello world"
    echo "" |
    awk -v str="$var" '{ print str }'
    [edemon@CentOS workspace]$ ./awk.sh 
    hello world

    awk运行外部的shell命令

    实例:利用awk验证url.list的每一行,检查其url是否有效。

  • 使用system()
    当()内的内容加上引号,awk直接将相关的内容交给shell,当做命令行;当其没有加上引号,awk就将其当做变量处理。
  • $ [edemon@CentOS url]$ awk '{ system("curl -I "$0) }' url.list 
    HTTP/1.1 200 OK
    Date: Wed, 30 Aug 2017 12:23:56 GMT
    Server: Apache/2.4.10 (Ubuntu)
    Last-Modified: Mon, 13 Mar 2017 02:42:01 GMT
    ETag: "2c39-54a93a7e73a98"
    Accept-Ranges: bytes
    Content-Length: 11321
    Vary: Accept-Encoding
    Content-Type: text/html
    
    HTTP/1.1 200 OK
    Date: Wed, 30 Aug 2017 12:23:56 GMT
    Server: Apache/2.4.10 (Ubuntu)
    Last-Modified: Mon, 13 Mar 2017 02:42:01 GMT
    ETag: "2c39-54a93a7e73a98"
    Accept-Ranges: bytes
    Content-Length: 11321
    Vary: Accept-Encoding
    Content-Type: text/html
    
    curl: (7) couldn't connect to host
    curl: (7) couldn't connect to host

  • print command | /bin/bash
  • awk 'BEGIN{}{ print "curl -I " $0 | "/bin/bash" }' url.list

    命令结果赋予变量

    将command的结果保存在变量中,单反引号和$()可能实现我们的目标。

    [edemon@CentOS workspace]$ arch=`uname -a`
    [edemon@CentOS workspace]$ echo $arch
    Linux CentOS.com 2.6.32-642.15.1.el6.i686 #1 SMP Fri Feb 24 13:54:50 UTC 2017 i686 i686 i386 GNU/Linux
    
    [edemon@CentOS workspace]$ arch=$(uname -a)
    [edemon@CentOS workspace]$ echo $arch
    Linux CentOS.com 2.6.32-642.15.1.el6.i686 #1 SMP Fri Feb 24 13:54:50 UTC 2017 i686 i686 i386 GNU/Linux

    切片操作

    切片操作,即获取、访问变量的一部分内容。
    格式: ${varible:startPos:length}
    使用实例:

    [edemon@CentOS workspace]$ cat section.sh
    #! /bin/bash
    var="123456789"
    echo the context from third place: ${var:2}
    echo the context from third place and its length is 4: ${var:2:4}
    [edemon@CentOS workspace]$ ./section.sh
    the context from third place: 3456789
    the context from third place and its length is 4: 3456

    当索引值是负数的时候,表示从右向左遍历:

    [edemon@CentOS workspace]$ echo $var
    123456789
    [edemon@CentOS workspace]$ echo ${var:(-2)}
    89
    [edemon@CentOS workspace]$ echo ${var:(-3)}
    789
    [edemon@CentOS workspace]$ echo ${var:(-4):2}
    67

    子串替换

    格式: ${varible/object/replaceObj}

    [edemon@CentOS workspace]$ var=123456789
    [edemon@CentOS workspace]$ echo ${var/1/2}
    223456789

    支持正则表达式:

    [edemon@CentOS workspace]$ echo ${var/[0-9]*/-}
    -

    环境变量与root验证

    shell环境变量,可以通过set命令查看。如:set > set.txt, 然后查看set.txt即可。
    常见的环境变量有:BATH, HOME, ID, UID, SHELL, TERM
    export将设置的环境变量告诉shell环境,同时传递给它的子进程。反之,子进程没有办法将自己设置的变量传递给父进程。
    利用UID可以判断用户是否是root。(当它是0的时候即为root user)

    #! /bin/bash 
    if (( $UID == 0 )); then
        echo Root User
    else
        echo Not Root User.
    fi

    间接变量

  • eval
    eval阅读输入参数,然后将他们拼接起来形成一条命令交给shell处理。
    格式: eval [arg ...]
    利用eval的特性,可以多级访问shell变量。
  • #! /bin/bash
    var1=123
    one=1
    two=2
    eval var2=\$var${one}
    eval var3=\$var${two}
    echo $var3

    eval var2=\$var${one}之后,var2的值为$var1。之后才有var3的成功赋值。

  • ${!var}
    ${!var} 用于访问var代表的值(变量)的值
  • [edemon@CentOS workspace]$ cat direct.sh 
    #! /bin/bash
    a=tmp
    tmp=b
    echo ${a}     # direct
    echo ${!a}     # indirect
    
    [edemon@CentOS workspace]$ ./direct.sh 
    tmp
    b

    IFS

    $IFS内置变量定义着变量的分隔符,默认情况下他是空格(space, tad, newline)

    [edemon@CentOS workspace]$ cat IFS
    #! /bin/bash
    
    PWD=`pwd`
    echo $PWD
    IFS='/'
    echo $PWD
    echo '$PWD'
    echo "$PWD"
    
    [edemon@CentOS workspace]$ ./IFS
    /home/edemon/workspace
     home edemon workspace
    $PWD
    /home/edemon/workspace

    subshell

    ( )中的命令是属于subshell的,父进程无法访问其中的变量。这有些像C中的局部变量。

    a=23
    ( a=24 )
    echo $a
    # 23
    0
    0
    查看评论
    发表评论
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

    shell变量计算长度及加减运算方法总结

    linux shell 变量定义,以及变量的输出,在shell编写中常常需要计算变量的长度,以及数字变量直接进行加减操作变量定义 shell变量没有整形,字符串,浮点型等其余编程语言定义的数据类型[...
    • comprel
    • comprel
    • 2017-04-30 22:33
    • 8972

    linux shell scrip(脚本)编程简介------变量、特殊符号和表达式

    一些朋友从事linux相关的维护工作, 这自然需要会搞shell scipt编程。另外一些朋友从事linux相关的测试工作,经常涉及到一些自动化测试的东西, 当然需要会点shell scrip编程啊。...
    • stpeace
    • stpeace
    • 2015-05-09 15:36
    • 1808

    Linux 实验 —— shell 编程

    1、 查看当前系统下用户 shell 定义的环境变量的值。 2、 定义变量 AK 的值为 200,并将其显示在屏幕上。 3、 定义变量 AM 的值为 100,并使用 test 命令比较其值是否大于 1...
    • wujy47
    • wujy47
    • 2014-12-13 10:04
    • 2233

    第二章 Shell变量及相关操作

    第二章 Shell变量及相关操作 1、Shell变量类型 1)环境变量 ①HOME 用户主目录的全路径名 ②PATH 变量PATH定义的一些目录路径,路径由冒号分隔 例:添加新路径 $...
    • health747474
    • health747474
    • 2013-06-05 20:17
    • 398

    【Unix/Linux.Shell Script】变量,运算符,$(())

    bash的变量型态只有字符串变量。
    • robinjwong
    • robinjwong
    • 2014-09-21 19:16
    • 1504

    linux command Line and shell script bible(笔记二_非用户变量)

    这是暑假回来看linux命令行与shell脚本编程大全的一些笔记,并不是全部的,只是结合本人觉得需要的一些记录,在整理发表博文时也当作一种回顾!欢迎交流指正!! 5.1.1全局环境变量 全局环境变...
    • li549252547
    • li549252547
    • 2013-08-27 16:30
    • 764

    Shell script 传参数处理(默认变量)

    1. $# 传递到脚本的参数个数 2. $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个 3. $$ 脚本运行的当前进程ID号 4. $! 后台运行的最后一个进程的进...
    • longshenlmj
    • longshenlmj
    • 2013-10-25 19:49
    • 1145

    Shell Script介绍及变量使用

    Shell Script的介绍、变量以及变量的使用。
    • ghosind
    • ghosind
    • 2016-04-04 17:30
    • 547

    Linux Shell编程(二)--Shell变量及相关操作

    Shell中变量的类型分为: 环境变量:Shell预定义的,用于设置系统运行环境的变量,由系统统一命名。常用的有HOME:用户主目录的全路径名;PATH:执行命令或Shell脚本时的查找路径,不...
    • jyl_static
    • jyl_static
    • 2012-03-27 21:30
    • 414

    shell变量相关视频教程.zip

    • 2017-08-01 23:18
    • 312.84MB
    • 下载
      个人资料
      • 访问:327282次
      • 积分:8806
      • 等级:
      • 排名:第2521名
      • 原创:574篇
      • 转载:13篇
      • 译文:0篇
      • 评论:36条
      我的链接
      最新评论