• shell脚本--变量与数组


    Linux中的变量有环境变量和用户自定义变量,关于环境变量,可以查看这篇博客:linux环境变量

    本文主要针对的是用户在shell脚本中定义的变量,但是环境变量也可以在shell脚本中使用。

    普通变量

    注意事项:

    1. 变量名以英文字母或者下划线开头,但是不能以数字开头
    2. 变量名区分大小写
    3. 变量名与等号之间,等号与变量值之间不要有空格
    4. 只有在使用变量的值的时候,才在变量名之前加$,其他情况,比如删除、赋值、循环迭代都不用加$
    5. 如果一行只有一条命令,则每一行不用以分号结尾,每一条命令以换行分隔
    6. 如果一行有多条命令,则每一条命令以分号分隔,但建议每行只有一条命令
    #!/bin/bash
    #文件名:test.sh
    name="beyond"
    echo $name
    

      执行脚本:

    ubuntu@ubuntu:~$ ./test.sh
    beyond
    ubuntu@ubuntu:~$ 
    

      

      有时候在使用变量的时候,变量名后面会跟着一些字符,如果这些字符与变量名之间没有间隔,那么,这些字符也将被认为是变量的一部分,即$nameHello,解释器回去找$nameHello,而不是找$name,可已使用两种方法,一种是使用空格分隔,另外一种使用花括号将变量名括起来(不要将$括起来)。如下例

    #!/bin/bash
    #文件名:test.sh
    name="beyond"
    echo "one",$name
    echo "two",$nameHello
    echo "three",$name hello
    echo "four",${name}hell
    

      执行脚本:

    ubuntu@ubuntu:~$ ./test.sh
    one,beyond
    two,
    three,beyond hello
    four,beyondhell
    

      

      从用户键盘读取数据并赋值给变量,使用:read [-p "提示信息"] 变量名

    #!/bin/bash
    #文件名:test.sh
    
    #输出一段话,并等待用户输入,输入的内容赋值给后面的变量
    read -p "please input your name:" name
    echo "welcome ${name}"

      执行脚本:

    ubuntu@ubuntu:~$ ./test.sh
    please input your name:beyond
    welcome beyond
    ubuntu@ubuntu:~$ 
    

      

      单引号与双引号的区别:

      1、在单引号中,变量不能被解析;在双引号中变量可以被解析。

      2、转义字符在单引号和双引号中都不会转义,反引号的作用是将反引号括起来的命令(括起来的内容会被当成命令执行),然后将结果赋值给一个变量。

      注意,使用反引号将命令括起来之后,如果不将运行整个命令赋值给一个变量,那么就会将反引号中的命令的执行结果当成shell命令执行。

    #!/bin/bash
    #文件名:test.sh
    
    name="beyond"
    #双引号括起来的变量能解析
    echo one,"$name"
    
    #双引号括起来的变量不能解析,会输出变量名
    echo two,'$name'
    
    #转义字符在单引号和双引号中都不会转义
    echo three,"$name	 hello"
    echo four,'$name	 hello'
    
    #echo `${name} 	 hello`
    #上面这条命令会出错,因为bash会将beyond 	 hello当做shell命令执行
    
    str=`echo $name 	 hello`
    echo $str
    
    str=`date`
    #date是在命令行中获取当前时间
    echo "current time is $str"  

      执行脚本:

    ubuntu@ubuntu:~$ ./test.sh
    one,beyond
    two,$name
    three,beyond	 hello
    four,$name	 hello
    beyond t hello
    current time is 2018年 01月 07日 星期日 18:50:59 CST
    

      变量的删除使用unset 变量名,注意此时变量名之前不要加$符号

    #!/bin/bash
    #文件名:test.sh
    
    name="beyond"
    
    echo one,"$name"
    
    //使用unset来删除变量
    unset name
    
    echo $name
    

      执行脚本:

    ubuntu@ubuntu:~$ ./test.sh
    one,beyond
    
    ubuntu@ubuntu:~$ 
    

     

    位置变量:

    咱们平时使用ls 查看当前目录下的文件时,常常会带-l -a -i等参数,这些参数就是位置变量,使用这些的方法:用$加数字(0-9)来获取,如果数字大于9时,则会使用数字的最高位所代表的位置变量,然后这个位置变量会拼接上数字剩下的部分,所以说shell命令行最多可以传递9个参数(如果参数过多,可以将多个参数连接为一个参数来扩充),也可以使用${11}来获取第11个位置参数

    #!/bin/bash
    #文件名:test.sh
    echo $0
    echo $1,"  ",$2,"  ",$3,"  ",$4,"  ",$5
    echo $6,"  ",$7,"  ",$8," ",$9,"  ",$10
    echo $11,"  ",$12
    

      执行脚本:

    ubuntu@ubuntu:~$ ./test.sh a b c d e f g h i j k
    ./test.sh
    a,  ,b,  ,c,  ,d,  ,e
    f,  ,g,  ,h, ,i,  ,a0
    a1,  ,a2
    ubuntu@ubuntu:~$ 
    

      

    预定义变量:

    预定义变量名 含义
    $0或者${0} 当前执行的进程名/脚本名/程序名
    $#或者${#} 命令行中位置参数的总数量
    $*或者${*} 所有位置参数的内容
    $?或者${?} 上一条命令执行的返回结果,0表示正常,非0表示异常或出错


      

    #!/bin/bash
    #文件名:test.sh
    
    echo "进程名:"$0
    echo "位置参数的数量:"$#
    echo "所有位置参数的内容:"$*
    
    #执行一条非法语句,执行异常,返回非0
    `echo "hello world"`
    echo "上一条命令的执行结果:"$?
    
    #执行一条合法语句,正常运行完毕,返回0
    str=`echo "hello world"`
    echo "上一条命令的执行结果:"$?
    

      执行脚本:

    ubuntu@ubuntu:~$ ./test.sh a b c d e f g
    进程名:./test.sh
    位置参数的数量:7
    所有位置参数的内容:a b c d e f g
    ./test.sh: line 8: hello: command not found
    上一条命令的执行结果:127
    上一条命令的执行结果:0
    ubuntu@ubuntu:~$ 
    

      

    数组

  • 相关阅读:
    $(function(){});和window.onload=function(){}的区别?
    DELETE和TRUNCATE的区别与联系
    SQL中count(*)和count(1)的区别
    泛型结构使用大全(泛型类、泛型接口)
    Stream流说明
    直接与非直接缓冲区
    Unix系统的五种I/O模型
    git使用方法
    linux下的系统调用函数到内核函数的追踪
    linux awk用法(主要为命令行)
  • 原文地址:https://www.cnblogs.com/-beyond/p/8228967.html
Copyright © 2020-2023  润新知