Linux与unix shell编程指南
第14章 环境和shell变量 |
1、使用变量时,尽量用花括号将之括起来,防止shell误解变量值。
2、设置变量时的不同模式
variable-name=value | 设置实际值到variable-name |
variable-name+value | 如果设置了variable-name,则重设其值 |
variable-name:?value | 如果未设置variable-name,显示未定义用户错误信息 |
variable-name?value | 如果未设置variable-name,显示系统错误信息 |
variable-name:=value | 如果未设置variable-name,设置其值 |
variable-name:-value | 同上,但是取值并不设置到variable-name,可以被替换 |
3、使用unset命令清除设置,如:
~$ PC=enterprise
~$ echo ${PC}
enterprise
~$ unset PC
~$ echo ${PC}
4、使用set命令显示所有本地shell变量。
5、将变量并排可以使变量结合在一起:
echo ${variable-name}${variable-name}...
如:
~$ FIRST="Bruce "
~$ SURNAME="Willis"
~$ echo ${FIRST}${SURNAME}
Bruce Willis
6、有时要测试是否已经设置或初始化变量。如果未设置或初始化,就可以使用另一个值。此命令格式为:
${variable:-value}
如:
~$ COLOR="blue"
~$ echo "The sky is ${COLOR:-gray} today"
The sky is blue today
~$
~$ unset COLOR
~$ echo "The sky is ${COLOR:-gray} today"
The sky is gray today
上面的例子并没有将实际值传给变量,需使用下述命令完成此功能:
${variable:=value}
如:
~$ echo ${COLOR} ~$ echo "The sky is ${COLOR:=gray} today"
The sky is gray today
~$ echo ${COLOR}
gray
7、测试变量是否取值,然后返回带有系统错误信息的结果,如下面例子测试变量file是否取值:
~$ echo "The file is ${FILE:?}"
-bash: FILE: 参数为空或未设置
以上结果可读性不好,但是可以加入自己的脚本以增加可读性。如:
~$ echo "The file is ${FILE:?" sorry cannot locate the variable files"}"
-bash: FILE: sorry cannot locate the variable files
8、设置只读变量,格式如下:
variable-name=value
readonly variable-name
如:
~$ TYPE_DEV="/dev/rmt/0n"
~$ echo ${TYPE_DEV}
/dev/rmt/0n
~$ readonly TYPE_DEV
~$ TYPE_DEV="/dev/rmt/1n"
-bash: TYPE_DEV: 只读变量
要查看所有只读变量,使用命令readonly即可。
9、环境变量
环境变量用于所有用户进程(经常称为子进程)。登录进程称为父进程。shell中执行的用户进程均称为子进程。不像本地变量(只用于现在的shell)环境变量可用于所有子进程,包括编辑器、脚本和应用。
所有环境变量均为大写,环境变量应用于用户和进程前,必须用export命令导出。格式如下:
VARIABLE_NAME=value;export VARIABLE_NAME
或
VARIABLE_NAME=value
export VARIABLE_NAME
使用env命令可以查看所有的环境变量。
10、位置变量参数
如果要向一个shell脚本传递信息,可以使用位置参数完成此功能,。参数相关数目传入脚本,此数目可以任意多,单只有前9个可以被访问,使用shift命令可以改变这个限制。
如果向脚本传递Did You See The Full Moon信息,下面的表格讲解了如何访问每一个参数:
$0 | $1 | $2 | $3 | $4 | $5 | $6 | $7 | $8 | $9 |
<> | Did | You | See | The | Full | Moon |
11、特定变量参数
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个 |
$$ | 脚本运行的当前进程ID |
$! | 后台运行的最后一个进程的进程ID号 |
$@ | 与$#相同,但是使用时加引号,并在引号中返回每个参数 |
$- | 显示shell使用的当前选项,与set命令功能相同 |
$? | 显示最后命令的退出状态,0表示没有错误,其他任何值表明有错误 |
第15章 引号 |
1、反引号
反引号用于设置系统命令的输出到变量。
下面的例子中,如:
~$ echo `date`
2014年 04月 11日 星期五 16:03:13 CST
2、反斜线
如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字符包含有特殊意义:&*+^$`"|?。如:
~$ echo $$
1830
~$ echo \$$
$$
第17章 条件测试 |
对文件、字符串和数字使用test命令;
对数字和字符串使用expr命令。
expr命令和执行数值输出。使用最后退出状态命令$?可测知test和expr,二者均以0表示正确,1表示返回错误。
1、测试文件状态
test一般有两种格式,即:
test condition
或
[condition]
使用方括号时,要注意在条件两边加上空格。
常用条件表达式:
-d | 目录 |
-f | 正规文件 |
-L | 符号链接 |
-r | 可读 |
-s | 文件长度大于0、非空 |
-w | 可写 |
-u | 文件有suid位设置 |
-x | 可执行 |
如:
~/tools$ ls -l a.vim
-rw------- 1 xxx xxx 31424 11月 3 09:17 a.vim
~/tools$ [ -w a.vim ]
~/tools$ echo $?
0
~/tools$ test -w a.vim
~/tools$ echo $?
0
~/tools$ [ -x a.vim ]
~/tools$ echo $?
1
2、测试时使用逻辑操作符
有时比较两个文件状态,shell提供三个逻辑操作完成此功能:
-a | 逻辑与 |
-o | 逻辑或 |
! | 逻辑否 |
如:
~/tools$ ls -l a.vim grep.vim
-rw------- 1 xxx xxx 31424 11月 3 09:17 a.vim
-rw------- 1 xxx xxx 32997 11月 3 10:42 grep.vim
~/tools$ [ -w a.vim -a -w grep.vim ]
~/tools$ echo $?
0
~/tools$ [ -w a.vim -a -x grep.vim ]
~/tools$ echo $?
1
3、字符串测试
有5种格式:
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_operator string ]
[ string string_operator string ]
string_operator可为
= | 两个字符串相等 |
!= | 两个字符串不等 |
-z | 空串 |
-n | 非空串 |
如:
~/tools$ [ -z $VARIABLE_NAME ]
~/tools$ echo $?
0
~/tools$ VARIABLE_NAME="name"
~/tools$ [ -z $VARIABLE_NAME ]
~/tools$ echo $?
1
4、测试数值
一般格式如下:
"number" numeric_operator "number"
或
[ "number" numeric_operator "number" ]
numberic_operator可为:
-eq | 相等 |
-ne | 不相等 |
-gt | 第一个数大于第二个数 |
-lt | 第一个数小于第二个数 |
-ge | 第一个数大于或等于第二个数 |
-le | 第一个数小于或等于第二个数 |
如:
:~/tools$ NUMBER=130
:~/tools$ [ "$NUMBER" -eq "130" ]
:~/tools$ echo $?
0
可以使用逻辑操作符将两个测试表达式结合起来,只能在一对方括号中使用,如:
:~/tools$ [ "990" -le "995" -a "123" -gt "33" ]
:~/tools$ echo $?
0
:~/tools$ [ "990" -le "995" -a "123" -gt "133" ]
:~/tools$ echo $?
1
5、expr用法
一般用于整数值,但也可用于字符串,一般格式如下:
expr argument operator argument
如:
:~/tools$ expr 10 + 10
20
使用乘号时,必须用反斜线屏蔽其特定含义,如:
:~/tools$ expr 30 * 30
expr: 语法错误
:~/tools$ expr 30 \* 30
900
expr在循环中用于增量计算,如:
:~/tools$ LOOP=0
:~/tools$ `expr $LOOP + 1`
expr也有模式匹配功能,可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任意字符串重复0次或多次,如:
:~/tools$ VALUE=account.doc
:~/tools$ expr $VALUE : '.*'
11
在expr中可以使用字符串匹配操作,这里使用模式.doc抽取文件附属名:
:~/tools$ expr $VALUE : '\(.*\).doc'
account
Linux与unix shell编程指南的更多相关文章
- Linux与Unix shell编程指南(完整高清版).pdf
找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分 ...
- Linux 与 unix shell编程指南——学习笔记
第一章 文件安全与权限 文件访问方式:读,写,执行. 针对用户:文件属主,同组用户,其它用户. 文件权限位最前面的字符代表文件类型,常用的如 d 目录:l 符号链 ...
- 摘自《Linux与unix shell编程指南》
shift运行后,$#随之减少:如果需要知道命令行中输入的最后一个参数(通常是一个文件名),可以有两种选择:使用命令 eval echo \$$#;使用shift命令:shift 'expr $# - ...
- Linux Unix shell 编程指南学习笔记(第五部分)
第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符.该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比方: ...
- Linux Unix shell 编程指南学习笔记(第四部分)
第十六章 shell脚本介绍 此章节内容较为简单,跳过. 第十七章 条件測试 test命令 expr命令 test 格式 test condition 或者 [ conditio ...
- Linux Unix shell 编程指南学习笔记(第三部分)
第十三章 登陆环境 登陆系统时.输入username和password后.假设验证通过.则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profi ...
- Linux Unix shell 编程指南学习笔记(第二部分)
第七章 正則表達式介绍 匹配行首与行尾 匹配数据集 职匹配字母和数字 句点 "." 匹配随意单字符. ^,在行首 匹配字符串或字符序列,如查询当前文件夹下的全部文件夹: ls - ...
- Linux学习之Shell编程基础
转自:http://my.oschina.net/itblog/blog/204410 1 语法基本介绍1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来 ...
- linux下的Shell编程(3)shell里的流程控制
if 语句 if 表达式如果条件命令组为真,则执行 then 后的部分.标准形式: if 判断命令,可以有很多个,真假取最后的返回值 then 如果前述为真做什么 [ # 方括号代表可选,别真打进去了 ...
随机推荐
- elasticsearch用法
基本原理 搜索引擎的索引 倒排序 由value查找key 数据库的索引 由key查找value 用于解决分库分表后的排序分页 like查找 性能问题 日志库的全文搜索 spring集成时使用的不是re ...
- win10安装navisworks失败,怎么强力卸载删除注册表并重新安装
一些搞设计的朋友在win10系统下安装navisworks失败或提示已安装,也有时候想重新安装navisworks的时候会出现本电脑windows系统已安装navisworks,你要是不留意直接安装n ...
- zabbix的MariaDB数据库改变存储位置
#创建 mkdir /公司缩写/mysql #停止数据库服务 systemctl status mariadb.service systemctl stop mariadb.service # ...
- Mybatis-Plus的分页插件
使用的是:Mybatis-Plus的分页插件https://baomidou.gitee.io/mybatis-plus-doc/#/?id=%E7%AE%80%E4%BB%8B 1.Mapper.j ...
- 一次面试留下的实际应用问题。关于HttpModule,IIS集成模式。
资料来自<IIS7开发与管理完全手册> 周五面试时有点紧张,没能静下心思考,当时隐约想到这个解决方案,但因面试环境和心态确未能明确的表述. 回家的地铁上已经找到解决办法. 要点:1基于IH ...
- caffe之那些依赖的库
1. Boost库 Boost是一个可移植的,提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一.Boost强调对跨平台的支持,编译与平台无关.Caffe采用C++为主要开发语言 ...
- Mybatis 入门之resultMap与resultType讲解实例
resultMap:适合使用返回值是自定义实体类的情况 resultType:适合使用返回值得数据类型是非自定义的,即jdk的提供的类型 resultMap : type:映射实体类的数据类型 id: ...
- 原创:CentOS 环境中 Zabbix 3.4 的安装部署实践
IT管理工作中,如果没有对服务器.网络设备.服务.进程.应用等的监控,往往是用户发送问题报告后才知道出了问题.事后救火显得被动,不能从容面对问题. 才有了部署一套网络监控系统的想法,机缘巧合下结识了Z ...
- JavaScript常见排序算法
1.冒泡排序 function bubble_sort(arr) { if (arr.length <= 1) { return arr; } var len = arr.length; for ...
- python基础修改haproxy配置文件
1.通过eval(),可以将字符串转为字典类型. 2.Encode过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数.两个函数的唯一区别就是dump把py ...