shell编程之变量

 

Shell变量核心基础知识与实践

1.shell变量知识

1.什么是变量?
就是用一个字符或字符串,表示一堆的内容,这个字符或字符串就叫变量,如x=1,x就是变量,=赋值,=表示相等,等号右边的内容,变量的内容。
2.Shell变量特性
默认情况下,在bash Shell中是不会区分变量是什么类型 的,例如:常见的变量类型为整数、字符串、小数等。
3.Shell变量分类
变量可分为两类:环境变量(全局变量)和普通变量 (局部变量)。环境变量也可称为全局变量,可以在创 建他们的Shell及其派生出来的任意子进程Shell中使用, 环境变量又可分为自定义环境变量和bash内置的环境变 量。普通变量也可称为局部变量,只能在创建他们的 Shell函数或Shell脚本中使用。普通变量一般由开发者在开发脚本程序时创建。

1.2 shell环境变量(全局变量)介绍

环境变量一般是用export内置命令导出的变量,用于定义Shell的运行环境,保证Shell命令的正确执行。Shell通过环境变量来确定登录用户名、命令路径、 终端类型、登录目录等,所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器、Shell脚本和各类应用。

1.2.1 操作shell环境变量

1.显示环境变量
echo $变量名字
env,set
2.定义环境变量,3种方法:变量名尽量大写
1)export A=1
2)B=1
export B
3)declare
declare -x A=1
3.取消环境变量
unset 变量名

1.2.2 环境变量初始化与对应文件生效顺序

1.环境变量的文件:
全局文件
    /etc/profile
    /etc/bashrc
用户环境变量文件
    ~/.bashrc
    ~/.bash_profile
2.环境变量初始化与对应文件生效顺序:优先加载/etc/profile,然后加载~/.bash_profile再次加载~/.bashrc,最后加载/etc/bashrc
~/.bash_profile  4
~/.bashrc 3 
/etc/bashrc 2
/etc/profile 1

1.3 普通变量(局部变量)

当前用户或者脚本中生效,离开当前用户或者脚本就会失效

1.3.1 操作shell普通变量

1.定义普通变量
规则:见名知意,字母、数字、下划线,3者组合,以字母开头
1)OldboyAge=1
2)oldboy_age=1
3) oldboyAge=1  ###驼峰语法
2.变量内容
字符串:
变量名=value     #<==不加引号。 ##解析变量或者命令,然后输出,纯数字选择不加引号。
变量名=’value’   #<==加单引号。 ###所见即所得
变量名=”value”   #<==加双引号。 ##解析变量或者命令,然后输出,字符串默认选择双引号,可以把要定义的内容作为一个整体。
3.命令变量
变量名=`ls`
变量名=$(ls)

1.3.2 普通变量定义及输出小结

针对变量名: 
1)变量名的定义要有一定的命令规范,并且要见名知意,OldboyAge=1,推荐使用驼峰语法。
2)变量名仅能使用字母、数字、下划线中的任意多个字符,并且要字母开头。
针对变量内容:
3)在脚本中定义普通字符串变量,尽量把变量的内容用双引号括起来。
4)单纯数字的变量内容可以不加引号。
5)希望变量的内容原样输出需加单引号。
6)希望变量值引用命令并获取命令的结果就用反引号或$()。
针对赋值符号: 
7)变量定义使用赋值符号(=),赋值符号两端不要有空格。
针对变量输出: 
8)使用或者输出变量的内容,可用$变量名,例如:echo $OldboyAge。
9)若变量名(db)后面有其他字符连接的时候,就必须给变量名加上大括号{},例如:$db_t就要改成${db}_t

1.4 Shell特殊重要变量

1.4.1 shell特殊位置变量

在Shell中存在一些特殊且重要的变量,例如:0、1、$#,我们称之为特殊位置参数变量,要从命令行、函数、或脚本执行等处传递参数时,就需要在 Shell脚本中使用位置参数变量

位置变量作用说明企业应用
$0 获取当前脚本的名称,如脚本前面跟着路径的话,那就获取脚本的路径加名称 一般在启动脚本的结尾会使用$0获取脚本的路径和名字给用户提示用
$n 获取当前脚本的第n个参数值,n=1..9,当n为0时表示文件名,如果n大于9,则需要用大括号括起来,例如${10},接的参数以空格分隔 一般用于选择脚本的启动,停止等
$* 获取当前脚本所有传参的参数,不加引号作用同$@,如果给$加上引号,例如:"$",则表示将所有的参数视为单个字符,例如"$1 $2 $3" 当需要接收脚本后面所有参数时,但是又不知道参数个数就用这个变量
$@ 获取当前脚本所有传参的参数,不加引号作用同$*,如果给$@加上引号,例如:"$@",则表示将所有的参数视为不同的独立字符串,例如"$1" "$2" "$3" 当需要接收脚本后面所有参数时,但是又不知道参数个数就用这个变

1.4.2 shell进程特殊状态变量

状态变量作用说明
$? 获取上一个指令的执行状态返回值(成功为0,不成功非0)
$$ 获取当前脚本的进程号(PID)
$! 获取上一个在后台工作进程的进程号
$_ 获取上一个命令或脚本的最后一个参数

1.4.3 shell变量子串知识

ID表达式作用说明
1 ${parameter} 返回${parameter}变量内容
2 ${#parameter} 返回${parameter}内容长度(按字符)
3 ${parameter:offset} 在变量${parameter}中,从位置offset之后提取子符串到结尾
4 ${parameter:offset:length} 在变量${parameter} 中,从位置offset之后提取长度为length的字符串
5 ${parameter#word} 从变量${parameter}开头删除最短匹配的word字符串
6 ${parameter##word} 从变量${parameter}开头删除最长匹配的word字符串
7 ${parameter%word} 从变量${parameter}结尾开始删除最短匹配的word字符串
8 ${parameter%%word} 从变量${parameter}结尾开始删除最长匹配的word字符
9 ${parameter/pattern/string} 使用string替换第一个匹配pattern
10 ${parameter//pattern/string} 使用string替换所有匹配pattern

1.4.4 shell特殊变量扩展

表达式作用说明用途
${parameter:-word} 如果parameter变量为空或未赋值,就会返回字符串替代变量的值 如果变量未定义,则返回备用的值,防止变量为空或者未定义而导致异常
${parameter:=word} 如果parameter变量为空或未赋值,就设置这个变量值为word并返回其值。位置变量与特殊变量不适用 基本同上一个${parameter:-word}相同,不同的是会额外给parameter变量赋值
${parameter:?word} 如果parameter变量为空或未赋值,word字符串将被作为标准错误输出,否则输出变量的值 用于捕捉由于变量未定义而导致的错误,并退出程序
${parameter:+word} 如果parameter变量为空或未赋值,则什么不做,否则word字符串会替代变量的值  

2. shell变量的数值计算

2.1 算术运算符

 

2.2 bash编程常见运算命令汇总

运算操作符与运算命令意义
(()) 用于整数运算的常用运算符
let 用于整数运算,类似(())
expr 用于整数运算,但还有其它的额外功能
s[] 用于整数运算
bc 用于小数或整数运算
awk 用于小数或整数运算
declare 定义变量值和属性,-i参数可以用于定义整形变量,做运算

2.3 双小括号“(())”数值运算的基础语法

运算操作符与运算命令意义
((i=i+1)) 此种书写方法,先运算后赋值法,即将i+1的结果赋值给变量i,不能使用echo"((i=i+1))"的输出形式,可以使用echo $((i=i+1))输出其值
i=可以在前加((i+1))|可以在(())前加符,将表达式运算后赋值给i  
((8>7&&5==5)) 可以进行比较操作,还可以加入逻辑或与逻辑与,用于条件判断
echo 需要直接输出运算表达式结果可以在前加((2+1))|需要直接输出运算表达式结果可以在(())前加  

2.4 let运算语法

语法格式: let 赋值表达式
let赋值表达式同等于((赋值表达式))
    [root@ci-node1 scripts]# aa=12
[root@ci-node1 scripts]# let i=$aa+10
[root@ci-node1 scripts]# echo $i
22
[root@ci-node1 scripts]# 

2.5 expr命令计算基本用法

[root@ci-node1 scripts]# expr 2  +  2
4
[root@ci-node1 scripts]# expr 2  \*  2
4
[root@ci-node1 scripts]# expr 2  /  2
1
注意:使用expr时,运算符与计算的数所必须要有空格隔开,使用*号时需要使用转义符\进行转义

2.5.1 expr其它用法,判断一个数字是否为整数

[root@ci-node1 scripts]# i=5
[root@ci-node1 scripts]# expr $i + 6 &>/dev/null #&>/dev/null表示不保留任务的输出
[root@ci-node1 scripts]# echo $?
0
[root@ci-node1 scripts]# expr $i + 6a &>/dev/null
[root@ci-node1 scripts]# echo $?
2
使用expr判断数字是否为整数,如果echo $?返回0则表示是一个整数,返回非0则表示不是一个整数
    #!/bin/bash
expr 2 + $1 & >/dev/null
if [ $? -ne 0 ]
then 
   echo "这不是一个整数"
else
   echo "这是一个整数"
fi

2.5.2 使用expr判断文件扩展名是否符合要求

#!/bin/bash
expr "$1" : ".*\.txt" &>/dev/null
if [ $? -eq 0 ]
then
    echo "$1 是文本"
else
    echo "$1 不是文本"
fi

2.5.3 使用expr来计算字符串长度

[root@ci-node1 scripts]# oldboy="I am oldboy"
[root@ci-node1 scripts]# expr length "$oldboy"
11

2.6 适合小数运算的bc命令(需先安装bc命令)

[root@ci-node1 scripts]# echo 1.2+3.3|bc
4.5
[root@ci-node1 scripts]# echo 1.2*3.3|bc
3.9
[root@ci-node1 scripts]# echo 1.2/3.3|bc
0
[root@ci-node1 scripts]# echo 1.2%3.3|bc
1.2
[root@ci-node1 scripts]# echo "scale=2;335/113"|bc # scale表示保留几位小数
2.96

2.7 适合小数运算的awk命令

[root@ci-node1 scripts]# echo "335 113"|awk '{print ($1-$2)}' # $1表示第一个数字,$2表示第二个数字
222
[root@ci-node1 scripts]# echo "335 113"|awk '{print ($1*$2)}'
37855
[root@ci-node1 scripts]# echo "335 113"|awk '{print ($1+10)*$2}'
38985

3.特殊内置命令read

shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入中获取,read为bash内置命令,可以通过help read获取帮助
语法格式:read [参数] [变量名]
常用参数:
    -p prompt:设置提示信息
    -t tiemout:设置输入等待时间,单位默认为秒

3.1 基于shell变量输入read命令

将加减乘除计算的脚使用read方式读入整数变量
[root@ci-node1 scripts]# cat 4.sh 
#!/bin/bash
read -p "请输入两个数字:" a b 
echo "a-b=$(($a-$b))"
echo "a+b=$(($a+$b))"
echo "a*b=$(($a*$b))"
echo "a**b=$(($a**$b))"
echo "a/b=$(($a/$b))"
echo "a%b=$(($a%$b))"
[root@ci-node1 scripts]# sh 4.sh
请输入两个数字:11 22
a-b=-11
a+b=33
a*b=242
a**b=-2732210440490168087
a/b=0
a%b=11

4.shell脚本的条件测试与比较

4.1 条件表达式常见语法

条件测试语法说明
test <测试表达式> 利用test命令进行测试表达式的方法,test与测试表达式之间有一个空格
[测试表达式] 这是通过中括号进行测试表达式的方法,与test用法相同,[]边界和内容之间至少 有一个空格
[[测试表达式]] 这是通过双中括号进行测试表达式的方法 ,[[]]边界和内容之间至少 有一个空格
((测试表达式)) 这是通过双小括号进行测试表达式的方法,一般用于if语句里,(())两端不需要空格
(命令表达式) 这是通过小括号进行测试表达式的方法
`命令表达式` 这是通过反引号进行测试表达式的方法

4.2 文件测试表达式的常见功能说明

常用文件测试参数说明
-d(directory) 文件存在且为目录则为真
-f文件,f全拼为file 文件存在且为普通文件则为真
-e(exist) 文件存在则为真,-e不辩别是目录还是文件
-r(read) 文件存在且可读则为真
-s(size) 文件存在且文件大小不为0则为真
-w(write) 文件存在且文件可写则为真
-x(executable) 文件存在且文件可执行则为真
-L(link) 文件存在且为链接文件则为真
f1 -nt(newer than) f2 文件f1比文件f2新则为真,根据修改时间来算
f1 -ot(older than) f2 文件f1比文件f2旧则为真,根据修改时间来算

4.3 字符串测试表达式的常见功能说明

字符串参数说明
-n "字符串" 若字符串长度不为0则为真
-z "字符串" 若字符串长度为0则为真
"字符串" = "字符串" 若字符串相等则为真
"字符串" != "字符串" 若字符串不相等则为真

4.4 整数测试表达式知识

[]与test中使用的比较符号(()) 与[[]]使用的符号说明
-eq(equal) == 等于
-ne(not equal) != 不等于
-gt(greater than) > 大于
-lt(less than) < 小于
-ge(greater equal) >= 大于等于
-le(less equal) <= 小于等于

ps:可以使用man test来查看更多的文件比较符号

4.5 逻辑测试表达式

 

4.6 条件表达式符号的语法对比

 

posted @ 2019-04-22 08:40  游走在边缘的人  阅读(292)  评论(0编辑  收藏  举报