签到成功

知道了

CNDBA社区CNDBA社区

Linux Shell之三 高级变量及字符串

2016-12-12 09:28 2685 0 转载 Linux
作者: Expect-乐

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://linuxnote.blog.51cto.com/9876511/1641172

高级变量包含三个部分

1、变量扩展

2、命令替换

3、算术扩展

在Bash Shell中,$算符会触发到上述三种扩展,基本形式如下:

    基本型             扩展种类            例子            

${变量名称}            变量扩展        ${filename}

$(命令)                命令替换        $(ls /)

$((算术式))            算术扩展        $((5+3))

变量存在表示变量有值(包含空)http://www.cndba.cn/Expect-le/article/1629

一、 变量扩展:测试存在性及空值

http://www.cndba.cn/Expect-le/article/1629

测试变量“存在与否”的基本用法

${待测变量-默认值}

如果待测变量有定义(包括为空),则传回待测变量默认值,如果无定义,则传回-后的默认值。

a=yang                     a=
b=${a-'hello'}
echo $b

因为变量a有存在,所以$b值为yang,如果a存在,但为空,那么$b值为空。如果a不存在,$b为hello

变量分为两种状态,1 存在(包括为空) 2 不存在

${待测变量:-默认值}

如果待测变量存在,则传回待测变量默认值,如果不存在或为空,则传回:-后的默认值。

a=yang                     a=
b=${a:-'hello'}
echo $b

因为变量a存在,所以$b值为yang,如果a为空或不存在,$b的值就为:-后的hello

总结:

如果变量扩展条件式只有-  则只做变量存在性的判断。

                  使用:- 则除了做变量是否存在,还会判断变量是否为空

一句话:多了个“:”,就要同时测试存在性及空值两种情况。

[ -n ${A:-} ] && set -v

[]是测试条件的语法,-n测试其后接的变量为空,若非空,传回真值(长度不为0为真,-z长度为0为真)。

${待测变量:=默认值}

如果待测变量不存在或为空,就把待测变量值设为:=后的默认值。若存在,则设为待测变量值。

a=yang                     
b=${a:='hello'}
echo $b

因为变量a存在,所以$b值为yang,如果a为空或不存在,$b的值就为:=后的hello

b=${a:-'hello'}和b=${a:='hello'}看上去好像是一样的,但是:-是当变量a为空或者不存在的时候,其后的值hello为变量b的值,a依旧是空或不存在。:=是当变量a为空或不存在的时候,其后的值hello为变量b的值,并且默认为变量a的值(相当于给a赋了一个值)。

${待测变量:?提示信息}

若变量不存在或为空值,则显示变量名称和:?后的提示信息,并立即停止执行脚本。

目的:确保变量值一定存在,否则不执行脚本。

#!/bin/bash

fn=${1:?'错误,请提供要删除目录的名称'}                      对传入的第一个参数做检查,若未空,显示提示信息,并停止脚本。

echo '你要删除的目录指令是:'

echo "rm -rf ~/$fn"

测试变量的"存在性"

{待测变量:+真值}

若变量存在,且不为空,则传回“真值”,否则传回空值。

a=123
b=${a:+'true'}
echo $b

因为a存在,且值非空,所以$b为true,如果a不存在或a为空,那么$b值为空。

小结: 

    :        空          测空值

    -        负向        测不存在

    =        设值        给空值变量设一个默认值

    ?        有问题      检查条件是否完备再来执行吧

    +        正向        测试存在

二、变量扩展:取字符串切片、字符串长度

    字符串的第一个字符,编号为0,右邻的字符编号,依次增加1.接下来介绍如如何字符串的某一部分以及如何取得字符串长度

取字符串切片

${变量:位置起点}            位置起点等同于下边的编号。

a="hello,world"
b=${a:3}
echo $b

由第4个字符开始,到结束。$b值为lo,world

 ${变量:位置起点:长度}

a="hello,world"
b=${a:3:5}
echo $b

由第4个字符开始,共5个字符。$b的值为lo,wo

取部分位置参数

${@:n} n为正整数,为位置起点到最后

!/bin/bash

echo $0

echo ${@:2}  除了命令本身,从第2个字符(命令本身为0,编号为3)到最后

./script.sh 12 23 34 45 返回值为23 34 45

${@:n:m} n、m为正整数,n是起始字符,m是长度

!/bin/bash

echo $0

echo ${@:2:4}      长度为4 

./script.sh 12 23 34 45 56 67 78 返回值为23 34 45 56http://www.cndba.cn/Expect-le/article/1629

计算字符串长度

${#变量名称}    传回变量值的字符串长度

[root@Shell ~]# cat 1.sh 
#!/bin/bash
#
A='/etc/passwd'
echo ${#A}
[root@Shell ~]# bash 1.sh 
11
[root@Shell ~]#

${#数组[@]}        取得数组元素个数

${#数组[*]}        取得数组元素个数

三、变量扩展:对比样式

这里说的"对比样式",目的是想截取变量值(字符串)的某一部分。做法是将符合样式的部分字符串删除或取代。

由字符串前面对比,删除相符者

由前边(最左开始),对比变量值,删除最短相符合的字符串。

${变量#样式}

a="/usr/sbin/ntpdate"
b=${a#/*/}
echo $b

/*/代表,凡一对/之间有字符串者,对比符合,那$b值为sbin/ntpdatehttp://www.cndba.cn/Expect-le/article/1629

由前边(最左开始),对比变量值,删除最长相符合的字符串。

${变量##样式}

a="/usr/sbin/ntpdate"
b=${a##/*/}
echo $b

/*/代表,凡一对/之间有字符串者,对比符合,那$b值为ntpdate

由字符串后面对比,删除相符者

由后边(最右开始),对比变量值,删除最短相符合的字符串。

${变量%样式}

a="/usr/sbin/ntpdate"
b=${a%/*}
echo $b

/*代表,凡一对/之间有字符串者,对比符合,那$b值为/usr/sbin

由后边(最右开始),对比变量值,删除最长相符合的字符串。

${变量%%样式}http://www.cndba.cn/Expect-le/article/1629

a="/usr/sbin/ntpdate"                                 a="www.baidu.com"
b=${a%%/*}                                            b=${a%%.*}
echo $b                                               echo $b  此时 $b为www

/*代表,凡一对/之间有字符串者,对比符合,那$b值为空

小结:

语法                用途

${变量#样式}        由前边对比、删最短的http://www.cndba.cn/Expect-le/article/1629

${变量##样式}       由前边对比、删最长的http://www.cndba.cn/Expect-le/article/1629

${变量%样式}        由后边对比、删最短的

${变量%%样式}       由后边对比、删最长的

取代或删除部分字符串

只替换第一个对比符号的字符串(如果删除,替换字符处为空)

${变量/样式/替换字符串}

a="root:x:0:0:root:/root:/bin/bash"
b=${a/:/,}
echo $b

$b值为root,x:0:0:root:/root:/bin/bash

替换所有对比符合的字符串(如果删除,替换字符处为空)http://www.cndba.cn/Expect-le/article/1629

${变量//样式/替换字符串}                

a="root:x:0:0:root:/root:/bin/bash"
b=${a//:/,}
echo $b

$b值为root,x,0,0,root,/root,/bin/bash 

b=${a/#s /} 删除以s开头的行以空格结尾

b=${a/%s /} 删除以s结尾的行

四、变量扩展:取变量名称列表、数组索引列表

取变量名称列表

${!开头字符串@} 或${!开头字符串*}    

echo ${!x@} 或${!x*}         以x开头的变量名称。
a1=11
a2=dfds
b=sfs

echo ${!a@}  值为a1、a2

取数组索引列表

${!数组变量[@]} 或${!数组变量[*]}

[root@Shell ~]# cat 1.sh 
#!/bin/bash
#
a=(one two three four five)
for i in "${!a[@]}"
do
   echo "第$i个字符串为${a[$i]}"
done
[root@Shell ~]# bash 1.sh

第0个字符串为one

第1个字符串为two

第2个字符串为three

第3个字符串为four

第4个字符串为five

[root@Shell ~]# 

五、命令替换

这里的命令替换指的是把命令执行后的标准输出放入变量中,有两种写法:

新式写法:变量名称=$(命令)

旧式写法:变量名称=`命令`

旧式写法的引号为反引号,一般位于Tab键上方。

[root@Shell ~]# ls /home/
lost+found  nagios  xguest
[root@Shell ~]# cat 1.sh 
#!/bin/bash
#
a=$(ls /home)
for f in $a
do
 echo $f
done
[root@Shell ~]# bash 1.sh 
lost+found
nagios
xguest
[root@Shell ~]#

IFS是指定分隔符,默认是空白或Tab

六、算术扩展

如果a=8+4 b=$a echo $b 输出结果肯定为8+4 ,因为bash shell 把任何存储在变量中的值,皆视为以字符组成的字符串。

算术扩展的语法:$((算术式))

a=3+4
b=$a
echo $b

输出则为7

七、单引号、双引号、反引号的区别

单引号字符串的限制:

1、单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;

2、单引号字串中不能出现单引号(对单引号使用转义符后也不行)。http://www.cndba.cn/Expect-le/article/1629

双引号的优点: 

1、双引号里可以有变量

2、双引号里可以出现转义字符http://www.cndba.cn/Expect-le/article/1629

反引号

反引号括起来的东西是一个执行的命令

date是一个可以查看日期的命令

PWD是内部变量,echo $PWD显示当前路径

我们看一下使用不同的符号会有什么效果

1、美元符号$在单、双引号的表现,单引号中的$将保留它的字面意思,双引号中的$将发生变量引用

[root@Shell ~]# echo '$PWD'
$PWD
[root@Shell ~]# echo "$PWD"
/root

2、反斜杠/在单、双引号中的表现,单引号中/将保留它的字面意思,双引号中的/转义后边的字符(失去特殊意义)

[root@Shell ~]# echo '/$PWD'
/$PWD
[root@Shell ~]# echo "/$PWD"
$PWD

3、反引号与其它两种符号不同,反引号包围起来的字符串将被运行,取其结果。

[root@Shell ~]# echo 'date'
date
[root@Shell ~]# echo "date"
date
[root@Shell ~]# echo `date`
Fri May 1 12:39:21 CST 2015

注:反引号中的date被当成命令执行,包含的正是命令从输出信息。

总结:

当需要一个字符串的时候,使用单引号;

当内部包含变量的时候,使用双引号;

当铺捉命令输出的时候,用反引号;


本文出自 “生命不息,奋斗不止!” 博客,请务必保留此出处http://linuxnote.blog.51cto.com/9876511/1641172


用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
Expect-乐

Expect-乐

关注

Without the continuous bitter cold, there can be no fragrant plum blossom

  • 336
    原创
  • 6
    翻译
  • 100
    转载
  • 41
    评论
  • 访问:1548199次
  • 积分:1957
  • 等级:核心会员
  • 排名:第4名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ