美文网首页
shell变量

shell变量

作者: 孤月环舟 | 来源:发表于2017-08-05 20:13 被阅读13次

    变量的定义

    name="test name"
    

    注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

    1. 首个字符必须为字母(a-z,A-Z)。
    2. 中间不能有空格,可以使用下划线(_)。
    3. 不能使用标点符号。
    4. 不能使用bash里的关键字(可用help命令查看保留关键字)。

    使用变量

    使用已经定义好的变量的方式如下:

    echo $name
    echo ${name}
    

    变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。例如:

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

    推荐给所有变量加上花括号,这是个好的编程习惯。

    变量的再赋值

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

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

    只读变量

    使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变:
    readnoly baiduUrl="http://www.baidu.com"

    此时的变量baiduUrl为只读变量,若尝试再次赋值结果将会出错。

    移除变量

    使用 unset 命令可以移除变量。变量被删除后不能再次使用。unset 命令不能删除只读变量。例如:

    unset baiduUrl
    echo $baiduUrl
    

    此时,将不会有任何输出。

    变量类型

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

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

    Shell 字符串

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

    单引号

    str='this is a string'
    

    单引号字符串的限制:

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

    双引号

    str="url is $baiduUrl !"
    

    双引号的优点:

    1. 双引号里可以有变量
    2. 双引号里可以出现转义字符

    拼接字符串

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

    获取字符串长度

    语法:${#string}

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

    截取字符串

    使用${string:position:length}${string:position}

    string="abcdefg"
    echo ${string:1:4} # 输出 bcde
    

    判断读取字符串值总结

    表达式 含义
    ${var} 变量var的值, 与$var相同
    ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
    ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
    ${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
    ${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
    ${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
    ${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
    ${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
    ${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
    ${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
    ${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量

    第二列加入了“*” 不是意思是: 当然, 如果变量var已经被设置的话, 那么其值就是$var.

    字符串操作(长度,读取,替换)总结

    表达式 含义
    ${#string} 获取$string的长度
    ${string:position} 在$string中, 从位置$position开始提取子串
    ${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
    ${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
    ${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
    ${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
    ${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
    ${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
    ${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
    ${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
    ${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring

    说明:"* $substring”可以是一个正则表达式.

    数组

    bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
    数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

    数组的定义

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

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

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

    读取数组

    ${数组名[下标]} 
    

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

    echo ${array_name[@]}
    

    获取数组的长度

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

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

    注释

    以"#"开头的行就是注释,会被解释器忽略。
    sh里没有多行注释,只能每一行加一个#号。

    相关文章

      网友评论

          本文标题:shell变量

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