bash脚本编程之一 变量、变量类型等
变量的内容
1、变量命名:
1、只能包含字母、数字和下划线,并且不能以数字开头,
2、不应该跟系统中已有的环境变量重名
3、最好能见名知意
2、变量赋值:
设置变量:
变量名称=值
fld_name=value 等号两边不能有空格
注意:用echo 显示变量名的值时,需要用$符号。
针对数字,你可以可以这样为变量赋值,定义一个变量的类型:
3、变量类型:
环境变量:
本地变量(局部变量):
位置变量:
特殊变量(系统变量):
本地变量:作用域为整个bash进程
varname=value
局部变量:作用域只对当前代码段有效
local varname=value
环境变量:作用域为当前shell进程及其子进程
export varname=value "导出“
任意脚本在执行时会启动一个子shell进程,
命令行中启动的脚本会继承当前shell的环境变量
系统自动执行的脚本(跟命令行无关)就需要自我定义需要的各环境变量
位置变量:
$1,$2,....
特殊变量:保持某些特殊数据
$? 上一个命令执行状态返回值
$# 参数的个数
$* 参数列表
$@ 参数列表
$0 命令本身 脚本本身
执行脚本时的脚本路径及名称
程序执行一般有两类返回值
程序执行结果;
执行状态返回代码(0-255)
0表示正确
1-255:错误执行 1,2,127 系统预留 有特殊意义
4、变量取消:
unset varname
撤销fld_name域的值
查看当前shell中的变量
set 不带任何参数和选项
如果查看当前shell中的环境变量
env
export
printenv
字符串变量添加新的变量
PATH添加新的路径
export PATH=$PATH:/usr/local/apsch/bin
5、取得变量值:
$变量名称
${变量名称} $(x) 这个可以用来当做命令调用
如果变量在语句当中被引用,必须要使用${x}才可以,取得数组的变量值时候也需要使用${}来调用
关于变量和引号的关系:
单引号:所见即所得
双引号:使特殊符号生效
6、调整变量的属性:
1、readonly 命令 :定义只读变量
-p:显示目前具有只读属性的变量列表
-f:设定函数不可修改
-a:定义数组不可修改
count环境变量readonly之前可以修改,之后变成只读变量,不可以在修改。
readonly -p 读取只读变量,显示在终端。
2、declare 命令
-r:设定只读变量
-p:显示变量的属性
-a:变量是一个数组
-f:搜寻命令时,只找函数
-i:变量是一个整数
-F:显示所有的函数式名称及其属性
-t:设立变量具有trace属性
-x:设定环境变量
7、数组:
是一种数据结构,有相关的数据项组成,每个数据项,称为数组的元素,且可采用索引的方式取得个元素的值
数组赋值:
1、单个赋值,以index作为索引号,索引号从0开始
# 为数组赋值
#显示数组中所有值方法一
$echo ${a[*]}
#显示数组中所有值方法二
$echo ${a[@]}
#为数组添加数据项
2、使用小括号为数组赋值
a=(1000 2000 3000) 默认空格隔开
#为数组b赋值 记住是小括号,不是大括号
#打印出第一个和第4个数据项
3、为数组中的某一个数据项赋值,默认是从0开始,如果中间出现未比标示的索引项,则从前一个索引项开始计算
a={51 [3]=5 cto [6]=8}
#为数组赋值 #打印出数组中所有值
#验证中间出现的数值是从哪个索引项开始算起的
数组d[7]测试:
显示赋值:
echo ${a[1]}
取出数组中所有的值:
echo ${a[@]} 或者echo ${a[*]}
取得数组元素的个数:
echo ${#a[@]} 或者 echo ${#a[*]}
数组元素及个数:
8.高级变量
${变量名称} 变量扩展
$(命令) 命令替换
$((算术式)) 算术扩展
$(命令) 命令替换:
测试变量存在与否:
${countor:-'num'} 判断条件,如果countor存在,就返回值,如果countor不存在,就把-后接的字符串当做整个变量扩展的结果,并传回
测试变量不存在或为空,传回一个默认值
${myname:-'nick'} 如果待测变量不存在或为空,传回-后的值,存在则传回变量的值
赋值给变量chen:
测试变量不存在或为空,给变量设定一个默认值
${count:=100} 若变量coutn没有值或为空,则把待测变量设定为默认值,
测试变量不存在或为空,传回错误信息
${myname:?"your input error"}
测试变量的存在性:
${myname:+Ture} 若变量存在且值非空,则符合判断
: 空 测空置
- 负向 测不存在
+ 正向 测存在
? 有问题 检查是否完备后再来执行吧
= 设值 给控值变量设定一个默认值
$(命令) 命令替换 此命令等同于·· (esc下的按键,不是单引号)这个在编写脚本的时候很有用
$((算术式))算术扩展:
----借鉴:
字符串切片是从0开始的 在使用${}的时候 大括号内的变量引用前面的$可以不写
${变量:位置起点} ${myname:3}
${变量:位置起点:长度}
1
2
3
4
5
6
7
8
|
#定义变量 [root@lovelace 51cto] # myname=lovelace #取得变量字符串从第三个字符开始到字符串结尾的所有字符 [root@lovelace 51cto] # echo ${myname:3} elace #取得变量字符串中从第四个字符开始,长度为2的字符 [root@lovelace 51cto] # echo ${myname:4:2} la |
取部分参数:
命令行参数是从$1开始的依次类推,$@代表所有参数,命令本身使用$0来表示
${@:起点}:由点开始,取得后面的所有的位置参数
${@:起点:个数}:由起点开始,取得指定个数的位置参数
示例脚本
1
2
3
4
5
6
7
8
9
10
|
#!/bin/bash #Verson:0.1 #Auther:lovelace #Pragram:test argument #取得程序名 echo $0 #取得变量的所有值 echo ${@:1} #取得变量的个数 echo $ # |
执行结果:
1
2
3
4
|
[root@lovelace 51cto] # ./argument.sh 12 32 45 . /argument .sh 12 32 45 3 |
计算字符串长度:
${#变量名称}:传回变量值的字符串长度
expr:也可以统计字符串的长度
1、str="here you are."
len$(expr length "$str")
echo "str 字符串长度是:$len"
2、expr "字符串“:‘。*’
str="here you are."
len=$(expr "$str":'.*')
echo "str字符串长度是:$len"
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@lovelace 51cto] # echo $myname lovelace #使用${#变量名}取得字符串长度 比较常用 [root@lovelace 51cto] # echo ${#myname} 8 #使用${expr length “$变量名”}取得字符串长度 [root@lovelace 51cto] # len=$(expr length "$myname") [root@lovelace 51cto] # echo $len 8 #使用${expr “$变量名” : '.*'}取得字符串长度 [root@lovelace 51cto] # len=$(expr "$myname" : '.*') [root@lovelace 51cto] # echo $len 8 |
变量扩展:对比样式
由字符串前面对比,删除最短的
${变量#样式}
由字符串前面对比,删除最长的
${变量##样式}
1
2
3
4
5
6
7
8
9
10
11
|
#定义一个变量 [root@lovelace 51cto] # path=$(pwd) #查看变量值 [root@lovelace 51cto] # echo $path /home/scripts/51cto #使用对比样式 [root@lovelace 51cto] # echo ${path#*/} home /scripts/51cto #此对比样式可以取得目录名 [root@lovelace 51cto] # echo ${path##/*/} 51cto |
由字符串后面对比,删除最短的
${变量%样式}
由字符串后面对比,删除最长的
${变量%%样式}
1
2
3
4
5
|
#使用此对比样式可以取得路径名 [root@lovelace 51cto] # echo ${path%/*} /home/scripts #使用此对比样式没有任何数据输出 [root@lovelace 51cto] # echo ${path%%/*} |
至于对比样式可以根据自己的思考来获得,这个没有固定的格式
取代或删除部分字符串:
只替换第一个对比符合的字符串
${变量/样式/替换字符串}
替换所有符合的字符串
${变量//样式/替换字符串}
1
2
3
4
5
6
7
8
9
|
#定义一个变量 [root@lovelace 51cto] # echo $myname lovelace #替换第一次出现的l为F [root@lovelace 51cto] # echo ${myname/l/F} Fovelace #替换字符串中所有l为F [root@lovelace 51cto] # echo ${myname//l/F} FoveFace |
删除对比符合的字符串
只删一个
${变量/样式/}
删除全部
${变量//样式/}
#T 行首位置
%LE 最后面
1
2
3
4
5
6
7
8
9
|
#定义一个变量获取IP地址相关的信息 [root@lovelace 51cto] # tmp=$(ifconfig eth0 | grep 'inet addr') #删除对比样式成功的字符串 然后赋值给变量r [root@lovelace 51cto] # r=${tmp/inet addr:/} #删除对比样式成功的字符串 然后赋值给变量ip [root@lovelace 51cto] # ip=${r/ Bcast*/} #打印出变量ip 查看是不是我们想要的结果 [root@lovelace 51cto] # echo $ip 192.168.2.54 |
变量扩展:取变量名称列表、数组索引列表
取变量名称列表:
${!开头字符串@}或${!开头字符串*}
1
2
3
4
5
|
[root@lovelace 51cto] # myname=lovelace;mytest=51cto [root@lovelace 51cto] # echo ${!my@} myname mytest [root@lovelace 51cto] # echo ${!my*} myname mytest |
取数组索引列表:
${!数组变量[@]}或${!数组变量[*]}
1
2
3
4
5
6
|
#取得数组a的所有值 [root@lovelace 51cto] # echo ${a[@]} hello 2 3 nick #取得数组a的索引项 [root@lovelace 51cto] # echo ${!a[@]} 0 1 2 3 |
bash脚本编程之一 变量、变量类型等的更多相关文章
- Bash脚本编程之算术运算
简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence).结合性(associativity)和值,详见Shell Arithmet ...
- Bash脚本编程之数组
数组简介 在bash脚本编程当中,变量是存储单个元素的内存空间:而数组是存储多个元素的一段连续的内存空间. 数组由数组名和下标构成,如下. ARRAY_NAME[SUBSCRIPT] 数组按照下标的类 ...
- Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量
我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...
- 脚本命令高级Bash脚本编程指南(31):数学计算命令
题记:写这篇博客要主是加深自己对脚本命令的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 高等Bash脚本编程指南(31):数学盘算命令 成于坚持,败于止步 操作数字 factor ...
- 高级Bash脚本编程指南(27):文本处理命令(三)
高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...
- 高级bash脚本编程(三)
高级bash脚本编程 知识点 compound 和 comparison -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真. -o 逻辑或 exp1 ...
- 高级Bash脚本编程(一)
高级Bash脚本编程 Bash 它是能力很强的计算机语言,被称为解释性语言或脚本语言,它可以调用所有的UNIX命令和工具再加上公共程序. Bash中的特殊字符 注释(#) (除#!外,#!是用于指定当 ...
- Bash脚本编程总结
bash脚本编程之用户交互: read [option]… [name …] -p ‘PROMPT’ -t TIMEOUT bash -n /path/to/some_script 检测脚本中的 ...
- bash脚本编程知识储备
bash脚本编程: 脚本程序:解释器解释执行: 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习) ...
- Bash脚本编程学习笔记08:函数
官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...
随机推荐
- (实用篇)PHP定时任务获取微信access_token
最近开发微信公众平台,公众号调用各接口时都需使用access_token,access_token是公众号的全局唯一接口调用凭据,开发时需要进行妥善保存. access_token有效期为7200秒 ...
- ionic-native-transitions调用原生页面切换实现ionic路由切换
废话不多说:ionic-native-transitions调用原生页面切换实现ionic路由切换,从而大大提升ionic应用的性能. ionic-native-transitions是一个ionic ...
- python thread 多线程
thread 模块在python3中改为_thread,网上的各种帖子都说不建议新手使用thread,好吃不好吃总得尝尝看. import _thread def print_num(): for i ...
- 【NOIP2012】借教室
因为本校OJ+1s所以用线段树水过了,不去syz的水库水这题还真不知道线段树过不了= = 原题: 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要 向学校申请借教室.教室的 ...
- 论文笔记之:Generative Adversarial Text to Image Synthesis
Generative Adversarial Text to Image Synthesis ICML 2016 摘要:本文将文本和图像练习起来,根据文本生成图像,结合 CNN 和 GAN 来有效的 ...
- java设计6大设计原则
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
- pt-find 使用实例
pt-find - Find MySQL tables and execute actions, like GNU find. 用法:pt-find [OPTION...] [DATABASE...] ...
- StackOverflow程序员推荐的几本书籍
1. <代码大全>史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,<代码大全>注重个人技术,其中所有东西加起来,就是我们本能所说的“编写整洁的代码”.这本书有 ...
- Eclipse中FindBugs插件的应用
在以前的一个开发现场里,经常会收到客户的代码review指摘. 觉得有点神奇是,给客户的文件是编译后的*.class打成war包,客户那边却能指摘出代码中的缺陷bug,而且精确到代码的某一行. 通过* ...
- HTC Vive开发笔记之SteamVR插件集成
重要组件 SteamVR_Camera VR摄像机,主要功能是将Unity摄像机的画面进行变化,形成Vive中的成像画面 使用方法: l 在任一个摄像机上增加脚本 l 点击Expand按钮 完成以上操 ...