高级变量包含三个部分
1、变量扩展
2、命令替换
3、算术扩展

在Bash Shell中,$算符会触发到上述三种扩展,基本形式如下:
    基本型             扩展种类            例子            
${变量名称}            变量扩展        ${filename}
$(命令)                命令替换        $(ls /)
$((算术式))            算术扩展        $((5+3))

变量存在表示变量有值(包含空)
一、 变量扩展:测试存在性及空值
测试变量“存在与否”的基本用法
${待测变量-默认值}
如果待测变量有定义(包括为空),则传回待测变量默认值,如果无定义,则传回-后的默认值。
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 56
计算字符串长度
${#变量名称}    传回变量值的字符串长度
[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/ntpdate
由前边(最左开始),对比变量值,删除最长相符合的字符串。
${变量##样式}
a="/usr/sbin/ntpdate"
b=${a##/*/}
echo $b
/*/代表,凡一对/之间有字符串者,对比符合,那$b值为ntpdate
由字符串后面对比,删除相符者
由后边(最右开始),对比变量值,删除最短相符合的字符串。
${变量%样式}

a="/usr/sbin/ntpdate"
b=${a%/*}
echo $b
/*代表,凡一对/之间有字符串者,对比符合,那$b值为/usr/sbin
由后边(最右开始),对比变量值,删除最长相符合的字符串。
${变量%%样式}

a="/usr/sbin/ntpdate"                                 a="www.baidu.com"
b=${a%%/*}                                            b=${a%%.*}
echo $b                                               echo $b  此时 $b为www
/*代表,凡一对/之间有字符串者,对比符合,那$b值为空
小结:
语法                用途
${变量#样式}        由前边对比、删最短的
${变量##样式}       由前边对比、删最长的
${变量%样式}        由后边对比、删最短的
${变量%%样式}       由后边对比、删最长的

取代或删除部分字符串
只替换第一个对比符号的字符串(如果删除,替换字符处为空)
${变量/样式/替换字符串}

a="root:x:0:0:root:/root:/bin/bash"
b=${a/:/,}
echo $b
$b值为root,x:0:0:root:/root:/bin/bash
替换所有对比符合的字符串(如果删除,替换字符处为空)
${变量//样式/替换字符串}    
            
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、单引号字串中不能出现单引号(对单引号使用转义符后也不行)。

双引号的优点: 
1、双引号里可以有变量
2、双引号里可以出现转义字符

反引号
反引号括起来的东西是一个执行的命令
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被当成命令执行,包含的正是命令从输出信息。
总结:
当需要一个字符串的时候,使用单引号;
当内部包含变量的时候,使用双引号;
当铺捉命令输出的时候,用反引号;

Linux Shell 高级变量及字符串的更多相关文章

  1. 学习Linux shell脚本中连接字符串的方法

    这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...

  2. Linux SHELL,环境变量

    SHELL: 在计算机科学中,Shell俗称壳(用来区别于核),是指"提供使用者使用界面"的软件(命令解析器).它类似于DOS下的command和后来的cmd.exe.它接收用户命 ...

  3. Linux Shell数值比较和字符串比较及相关

    说明: 1. 把字符串当成整型进行比较,由于abcd等字符对不上0123当程序尝试去转成二进制时无法完成转换,所以用于数值比较的运算不能用于字符串比较:但是把整型当成字符串进行比较,0123这些数值完 ...

  4. linux shell数值比较和字符串比较

    说明: 1. 把字符串当成整型进行比较,由于abcd等字符对不上0123当程序尝试去转成二进制时无法完成转换,所以用于数值比较的运算不能用于字符串比较:但是把整型当成字符串进行比较,0123这些数值完 ...

  5. Linux Shell编程变量赋值和引用

    我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):   #!/bin/sh  ...  注意:最好使用“! ...

  6. Linux shell 环境变量及有效范围

    每当我们使用ssh客户端远程登陆一个服务时,操作系统就会给我们分配一个新的shell,并且这个shell继承了操作系统的永久环境变量.在当前的shell执行一个sh文件,都会临时产生一个子shell, ...

  7. Linux Shell 高级编程技巧3----运行级别脚本介绍

    3.运行级别脚本介绍    3.1.运行级别        运行级别介绍:            0    关机            1    单用户模式            2    多用户模式 ...

  8. Linux Shell 高级编程技巧2----shell工具

    2.shell工具    2.1.日志文件        简介            创建日志文件是很重要的,记录了重要的信息.一旦出现错误,这些信息对于我们排错是非常有用的:监控的信息也可以记录到日 ...

  9. Linux Shell 高级编程技巧1----深入讨论(awk、<<)

    1.深入讨论(awk.<<)    1.1.深入讨论awk        记录和域,模式和动作,正则表达式和元字符            基础教程中已经介绍        条件和逻辑操作符 ...

随机推荐

  1. v4l2 spec 中文 Ch01【转】

    转自:http://blog.csdn.net/wuhzossibility/article/details/6638245 目录(?)[-] Chapter 1 通用APICommon API El ...

  2. Mac下Lua环境搭建

    lua源文件下载安装 到官网安装了lua包,我安装的是 lua-5.3.1 解压之后,命令行cd进入到src目录下,输入make macosx 完成后cd ..到上一层目录, 输入sudo make ...

  3. SpringMvc+Spring+Mybatis+Maven整合

    一.建立数据库表,使用generator自动生成相关代码: /* SQLyog Ultimate v11.24 (32 bit) MySQL - 5.1.62-community : Database ...

  4. 武汉天喻的NFS 磁盘问题

    public void AsyncPaper() { while (true) { try { var jsonText = RedisHelper.BlockPopItemFromList(&quo ...

  5. OpenJDK中java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/ImageFormatException解决办法

    http://www.cnblogs.com/xusweeter/p/9667801.html

  6. 51nod 1432 独木舟【贪心】

    1432 独木舟 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两 ...

  7. 「kuangbin带你飞」专题十七 AC自动机

    layout: post title: 「kuangbin带你飞」专题十七 AC自动机 author: "luowentaoaa" catalog: true tags: - ku ...

  8. N皇后问题(C++实现和函数式编程实现)

    题意 在 N * N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.求出有多少种合法的放置方法. C++实现(位运算 ...

  9. 最小生成树【p2121】 拆地毯

    题目描述--->p2121 拆地毯 分析 这题为什么是最大生成树. 先来bb两句 题目为拆地毯,让我们剩下k个地毯. 题目想要我们求得最大的美丽度. 且要求我们 保留的地毯构成的图中,任意可互相 ...

  10. HDOJ 3516 Tree Construction 四边形优化dp

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=3516 题意: 大概就是给你个下凸包的左侧,然后让你用平行于坐标轴的线段构造一棵树,并且这棵树的总曼哈顿 ...