shell变量

将某一个变量的值,作为另一个变量的变量名的方法:

#!/bin/bash
name=yushuang
var=name
res=`eval echo ‘$’”$var”`
echo $res

 

说明:第一步: “$var”  –>name

第二步: echo ‘$’”$var” –>$name

第三步: `eval $name` –>yushuang

一.基础

我们定义一个变量(等号两边不能有空格)

FILEPATH=/var/home/sss
FILEFILENAME=test001

在引用这个变量是我们可以直接使用$后面跟上变量的名字

比如:       $FILEPATH
还可以 :  ${FILEPATH}

使用${}这种方式的好处是可以方便的实现两个变量的连接,同时看着也比较清楚。

${FILEPATH}/${FILEFILENAME}

这样便可以表示这个文件的全路径了


二. 此外有时我们会看到

$1,$2这种形式,这代表执行shell时,传递进来的参数


三. 此外我们还会看到下面的这些形式

1.如果变量米有赋值或为空,使用value的值

${variable:-value}

2.如果变量米有赋值或为空,使用value的值,并把变量赋值为value

${variable:=value}

3.检验变量是否为空

${variable:?}


以下是一些不常用的


$0  shell的命令本身(包括完整路径)
$1到$9 数字表示shell 的第几个参数
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同。
$- 显示shell使用的当前选项。
$? 显示最后命令的执行状况。0表示没有错误。

高级变量包含三个部分
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
计算字符串长度
**$