zoukankan      html  css  js  c++  java
  • 002-shell变量定义、使用、字符串替换,分隔,搜索、数组、注释

    一、变量定义

      定义变量时,变量名不加美元符号($)

    name="lhx"

      注意,变量名和等号之间不能有空格。同时,变量名的命名须遵循如下规则:

      •   命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
      •   不能使用bash里的关键字(可用help命令查看保留关键字)。

      除了显式地直接赋值,还可以用语句给变量赋值,如

    for file in `ls /etc`
    或
    for file in $(ls /etc)

      以上语句将 /etc 下目录的文件名循环出来。

    二、使用变量

    2.1、使用时加美元符号

    使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

    your_name="qinjx"
    echo $your_name
    echo ${your_name}

    2.2、变量使用加上花括号

    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

    for skill in Ada Coffe Action Java; do
        echo "I am good at ${skill}Script"
    done

    解释器就会把$skillScript当成一个变量(其值为空)

    推荐给所有变量加上花括号。

    2.3、已定义的变量,可以被重新定义,即重新赋值

    your_name="tom"
    echo $your_name
    your_name="alibaba"
    echo $your_name

    这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。

    2.4、只读变量

    使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

    #!/bin/bash
    myUrl="http://www.w3cschool.cc"
    readonly myUrl

    2.5、删除变量

    使用 unset 命令可以删除变量。语法:

    unset variable_name

    变量被删除后不能再次使用。unset 命令不能删除只读变量。

    2.6、变量类型

    运行shell时,会同时存在三种变量:

    • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
    • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
    • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

    三、Shell 字符串操作

    字符串是shell编程中最常用最有用的数据类型(除了数字和字符串),字符串可以用单引号,也可以用双引号,也可以不用引号。

    3.1、单引号

    str='this is a string'

    单引号字符串的限制:

    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

    3.2、双引号

    your_name='qinjx'
    str="Hello, I know your are "$your_name"! 
    "

    双引号的优点:

    • 双引号里可以有变量
    • 双引号里可以出现转义字符

    3.2、拼接字符串

    your_name="qinjx"
    greeting="hello, "$your_name" !"
    greeting_1="hello, ${your_name} !"
    echo $greeting $greeting_1

    3.3、获取字符串长度

    string="abcd"
    echo ${#string} #输出 4

    3.4、提取子字符串

    以下实例从字符串第 2 个字符开始截取 4 个字符:

    string="runoob is a great site"
    echo ${string:1:4} # 输出 unoo

    字符串切割的几种方法

    方法一: 利用shell 中 变量 的字符串替换   

    方法二: 设置分隔符,通过 IFS 变量

    方法三: 利用tr 指令实现字符替换  (!只能针对单个分隔符)

    方法一说明

      ${parameter//pattern/string} :用string来替换parameter变量中所有匹配的pattern

    string="hello,shell,split,test"  
    array=(${string//,/ })  
     
    for var in ${array[@]}
    do
       echo $var
    done

      当然也可以读单个 ${array[0]}、 ${array[1]}、……

    方法二说明

      自定义IFS变量, 改变分隔符, 对字符串进行切分

      Shell 脚本中有个变量叫 IFS(Internal Field Seprator) ,内部域分隔符。完整定义是The shell uses the value stored in IFS, which is the space, tab, and newline characters by default, to delimit words for the read and set commands, when parsing output from command substitution, and when performing variable substitution.

         Shell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用。

         而 IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量。

    示例一、查看变量 IFS 的值。

    $ echo $IFS
    
    $ echo "$IFS" | od -b 
    0000000   040 011 012 000 012                                            
    0000005

      直接输出IFS是看不到的,把它转化为二进制就可以看到了,"040"是空格,"011"是Tab,"012"是换行符" " 。最后一个 012 是因为 echo 默认是会换行的。

    string="hello,shell,split,test"  
     
    #对IFS变量 进行替换处理
    OLD_IFS="$IFS"
    IFS=","
    array=($string)
    IFS="$OLD_IFS"
     
    for var in ${array[@]}
    do
       echo $var
    done 

    方法三说明

      由于只是对单个字符进行的替换,则可以用  echo args |   tr "oldSpilt" "newSpilt"  的方式实现。

      tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符,经常用来编写优美的单行命令,作用很强大。

      语法
        tr(选项)(参数)
      选项
        -c或——complerment:取代所有不属于第一字符集的字符;
        -d或——delete:删除所有属于第一字符集的字符;
        -s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
        -t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
      参数
        字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
        字符集2:指定要转换成的目标字符集。

    string="hello,shell,split,test"  
    array=(`echo $string | tr ',' ' '` )  
     
    for var in ${array[@]}
    do
       echo $var
    done

    3.5、查找子字符串

    查找字符 "i 或 s" 的位置:

    string="runoob is a great company"
    echo `expr index "$string" is`  # 输出 8

    注意: 以上脚本中 "`" 是反引号,而不是单引号 "'"

    四、Shell 数组

    bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

    类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

    4.1、定义数组

    在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

    数组名=(值1 2 ... n)

    例如:

    array_name=(value0 value1 value2 value3)

    或者

    array_name=(
    value0
    value1
    value2
    value3
    )

    还可以单独定义数组的各个分量:

    array_name[0]=value0
    array_name[1]=value1
    array_name[n]=valuen

    可以不使用连续的下标,而且下标的范围没有限制。

    4.2、读取数组

    读取数组元素值的一般格式是:

    ${数组名[下标]}

    例如:

    valuen=${array_name[n]}

    使用@或*符号可以获取数组中的所有元素,例如:

    echo ${array_name[@]}
    echo ${array_name[*]}

    4.3、获取数组的长度

    获取数组长度的方法与获取字符串长度的方法相同,例如:

    # 取得数组元素的个数
    length=${#array_name[@]}
    # 或者
    length=${#array_name[*]}
    # 取得数组单个元素的长度
    lengthn=${#array_name[n]}

    4.4、遍历

    一共有两种方式:

    for i in ${variable[@]}; do
    # do something....
    done
    # 或
    for i in $(seq 0 ${#variable[@]}); do
    e=${variable[$i]}
    # do something....
    done

    以上两种方法 把 @ 换成 * 也行。

    4.5、合并数组

    array1=(23 56)
    array2=(99 "aaa")
    array_new=(${array1[@]} ${array2[*]})
    echo ${array_new[@]}  #也可以写作 ${array_new[*]}

    五、Shell 注释

    以"#"开头的行就是注释,会被解释器忽略。

    sh里没有多行注释,只能每一行加一个#号。只能像这样:

    #--------------------------------------------
    ##### 用户配置区 开始 #####
    #
    #
    # 这里可以添加脚本描述信息
    # 
    #
    ##### 用户配置区 结束  #####
  • 相关阅读:
    【2021-05-18】人生十三信条
    【2021-05-17】打了第一针疫苗
    【2021-05-16】该工作时好好工作,该休息时好好休息
    【2021-05-15】人生十三信条
    【2021-05-14】要保持团队作战的模式
    【2021-05-13】罗马不是一天能建成的
    【2021-05-12】己所不欲勿施于人
    【2021-05-11】服务好了别人,也就服务好了自己
    二维区域和检索
    寻找重复数
  • 原文地址:https://www.cnblogs.com/bjlhx/p/9028118.html
Copyright © 2011-2022 走看看