脚本当中,引用的变量有如下几种:
1 局部(本地)变量 只对当前shell进程起效,切换终端或退出再登录都会丢失已对变量赋值的值.
2 全局(环境)变量 对所有终端都起效.已作为文件存在于电脑内.比如 $PATH
局部变量的赋值 可以是直接赋值,也可以引用或命令引用
直接赋值 变量名 = 变量值
变量引用赋值 变量名="引用的变量"
命令引用赋值 变量名=命令
或$(命令)
ls -l
显示已赋值的所有变量 set+回车
删除变量 unset+变量名
全局(环境)变量的赋值
用命令赋值:固定格式
declare -x+变量名=变量值 给全局变量赋值
declare -x也可以查看所有环境变量.与export一样
env及printenv也能显示已存在的环境变量。
删除环境变量也可以使用 unset+变量名来实现
引用变量时候,变量值后面有别的字符串,为了确定变量值的范围,会用大括号将取值范围圈起来。
变量还可细分为只读变量和位置变量
只读变量:只能声明,但不能修改和删除
声明只读变量:
readonly name readonly -p+变量名,查看系统内置的只读变量.
declare -r name 只读变量会被子shell继承当中的值,但是只读属性不继承,举例:
查看只读变量:
readonly –p
不管什么类型的变量,只要退出shell都会被清除.
export +变量 设置全局变量,能被子shell所继承其中的值。
位置变量 用于从命令行向Shell脚本传递参数,$1表示第1个参数、$2表示第2个参数等,$0为脚本的名字,
从${10}开始,参数号需要用花括号括起来,如${10}、${11}、${100}、…。$*和$@一样,表示从$1开始的全部参数
位置变量中有一些特殊变量:
特殊变量 特殊的位置变量具有特殊的含义,其值不能由用户重新设置。所有的预定义特殊变量都由$符号与
另一个符号组成,常用的预定义特殊变量如下所示。
$?, $0, $*, $@, $#,$$. 其中
$? 表示上一条命令执行后的退出状态(返回值),为十进制数。一般命令执行成功返回值为0,错误值为非0.
$0 获取当前执行脚本的文件名,包括路径
$* 表示命令行中的所有位置参数组成的字符串,全部参数合为一个字符串.
$@ 表示命令行中的所有位置参数组成的字符串,但是每个参数都是独立字符串.参数之间为或的关系.
$和$@看起来一样,但是用$和$@分别将,第二个脚本的参数引用第一个脚本的参数时:
$*是引用第一个脚本的所有参数,参数是一个整体
而$@只引用第一个脚本的第一个参数.参数是独立的个体.
$# 表示实际位置参数个数(不包括Shell脚本名)
$$ 表示当前进程号PID
$! 表示上一个后台命令对应的进程号.
返回值: 脚本的返回值取决于脚本当中最后一个命令。
脚本运行失败后,使用echo $?可以查看返回值.然后用vim进入脚本,搜索返回的值,就可以看到是因为什么原因,
导致运行失败了.返回值是可以自定义的,平时自己写脚本时,在每条命令结果后补上exit+数字,就可以自定义了.
利用$?可以确认脚本报错位置,帮助自己纠错.
bash算法
bash中的算术运算:help let +,-, *, /, %取模(取余), **(乘方)
实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式] 举例 # a=$[3+2] # echo $a # 5
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 ...)
(5) declare–i var = 数值
(6) echo ‘算术表达式’ | bc
bc默认不保留小数点,可以事先定义小数点为位 scale=10 小数点后保留10位.
进制转换 obase2是2进制,ibase10是10进制,先指定要转换为几机制,再指定由几机制开始转
obase与ibase的顺序不能颠倒。
$RANDOM是随机数变量,默认是0-9999,可以设置具体范围.比如:
一般作为抽奖系统来使用.
乘法符号有些场景中需要转义 比如*,需要写为
bash有内建的随机数生成器:$RANDOM(0-32767)
echo $[$RANDOM%50]:0-49之间随机数
declare -i +变量 可以将一个整数值赋给变量。bash中,不加此选项,也可以读出来整数值。
增强型赋值 +=,-=, *=, /=, %= 代表着自加自减..再赋值的意思.
用 let 变量名+=数字 来表示
也可以写为
num=$[$num+1]的形式.即 num=$[$num+1]=let num+=1
如果固定只加1的话,可以写为 num++即可,同理 num--,也是固定减1
脚本的逻辑算法
1为真,0为假.
逻辑中的与和或
与代表着和的意思,a与b代表着a和b的意思.指定条件当中.a条件与b条件,
代表着a和b的条件必须同时满足才可以.
或是或者的意思,a或b代表着a或者b的意思.指定条件当中.a条件或b条件,
代表着a和b的条件满足一个就可以了.
真和假分别对应与和或的时候:
与的时候 或的时候
真与真为真 真与真为真
真与假为假 真与假为真
假与真为假 假与真为真
假与假为假 假与假为真
逻辑中的非:!
非真即假
非假即真
短路运算,这里的短路指的是 条件在与和或之间的运算关系
短路运算
短路与
第一个条件为假,结果必定为假,所以后续条件无须再去判断.
第一个为真的时候,第二个必须要参与运算.
短路或
第一个为真,结果必定为真.所以后续条件无须再去判断.
第一个为假的时候,第二个必须要参与运算.
&&和||
&&符号是当前一个命令执行结果为真(成功)的时候,那么接着执行&&后面的命令.而
||符号是当前一个命令执行结果为假(失败)的时候,那么接着执行||后面的命令.
脚本当中,()是将指定范围作为一个整体来处理,而( &)不光将括号内作为一个整体,还
将其中的命令单独放入一个shell中去运行,所以直接(exit)会退出当前终端,而( &)不会
退出当前终端。
异或:
^
异或的两个值,相同为假,不同为真
使用read来把输入值分配给一个或多个shell变量
read 后面的字符 都被视为变量,随后键入的值就是该变量的值
-p 指定要显示的提示
-s 静默输入,一般用于密码
不想让人看到所输入的密码.可以在脚本中加入如下几行:
或者 read -sp“输入密码”
-n N 指定输入的字符长度N -N 5 指定输入字符长度为5,输入少于5个会等待,直到输入第五个后自动结束。
-d ‘字符’ 输入结束符
-t N TIMEOUT为N秒 -t 5 等待5秒。
read 从标准输入中读取值,给每个单词分配一个变量
所有剩余单词都被分配给最后一个变量
bash如何展开命令行
把命令行分成单个命令词
展开别名
展开大括号的声明 {}
展开波浪符声明 ~
命令替换 $ 和 ``
再次把命令行分成命令词
展开文件通配 *、?、[abc]等等
准备I/0重导向 <、>
运行命令
反斜线 \ 会使随后的字符按原意解释 一个\只会使一个,紧邻着它的那个字符按愿意解释.
加引号来防止扩展
单引号 ’防止所有扩展 ‘‘单引号内所有字符都将视为一个整体.
双引号 ”也防止所有扩展,但是以下情况例外: ""双引号内所有字符都将视为一个整体,除了这四种.
$(美元符号) - 变量扩展
`(反引号) - 命令替换
\(反斜线) - 禁止单个字符扩展
!(叹号) - 历史命令替换
bash的配置文件 按生效范围划分,存在两类:
1 全局配置:/etc/profile /etc/profile.d/*.sh /etc/bashrc
2 个人配置: ~/.bash_profile 及 ~/.bashrc
这五个配置文件,系统启动时读取的顺序根据启动类型分为:
一、 交互式登录
交互式登录分为:
(1)直接通过终端输入账号密码登录
(2)使用“su - UserName” 切换的用户
这时的执行顺序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc
--> /etc/bashrc
其实在交互式登录时候,只读两个文件/etc/profile和~/.bash_profil。
/etc/profile当中指向读取 /etc/profile.d/*.sh当中所有以.sh结束的文件.
而~/.bash_profil当中,指向读取~/.bashrc和/etc/bashrc
二、非交互式登录
非交互式登录分为:
(1)su UserName
su不加-就是仅切换到这个用户上,这时上个用户的变量值,umask值等都会保存下来,相当于一个继承的子shell.
(2)图形界面下打开的终端
(3)执行脚本
(4)任何其它的bash实例
这时的执行顺序:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
/etc/bashrc中存在一个判断,若用户读取过/etc/profile.d/.sh当中的文件,就不再读取,没有的话就去读.
而非交互式登录并没有去读,所有当读取到/etc/bashrc时候,自动转去/etc/profile.d/.sh当中读取文件.
按功能划分,存在两类:profile类和bashrc类
其中,profile类:为交互式登录的shell提供配置全局:
/etc/profile, /etc/profile.d/*.sh
个人:~/.bash_profile
功用:
(1) 用于定义环境变量
(2) 运行命令或脚本
而bashrc类
为非交互式和交互式登录的shell提供配置全局:/etc/bashrc
个人:~/.bashrc
功用:
(1) 定义命令别名和函数
(2) 定义本地变量
配置文件可以通过文本编辑工具,如nano,vim之类进行更改,通过配置文件可以添加别名,开机信息显示等设置,
修改后的profile和bashrc不会立即胜过,需要立即生效两种方法:
1重新启动shell进程
2 使用.+profile或.+~/.bashrc 或source+profile或~/.bashrc
比如:
. ~/.bashrc 或 source profile 都可以使改过的文件立即生效.
想使修改的配置,无论是交互还是非交互登录都有效果,那么就把修改内容放在/etc/profile.d/*.sh当中去.
而如果想使修改过的变量,只能自己使用,其他人不可见的话,那么家目录下的.bashrc是最好的选择.
直接运行脚本,相当于又开了一个子shell来启动,里面的变量值不能被当前shell所用.
若想对当前shell起效.最好使用sorce或.+脚本名字来启动,这样进程还是是在当前shell进程下.
而在脚本中设置的变量值,回到当前shell中,也不会影响当前shell,运行脚本就相当于单独开了一个shell.
bash在退出时,会执行如下操作
1 保存在~/.bash_logout文件中(用户)
2 在退出登录shell时运行
3 用于
4 创建自动备份
5 清除临时文件
可以在这个文件中编辑如下命令 rm -rf /var/log/messages
这样可以清除自己在这台电脑上的痕迹.
特殊变量$- 它的值为
himBH,分别对应如下
h:hashall,打开这个选项后,Shell 会将命令所在的路径hash下来,避免每次都要查询。通过
set +h将h选项关闭
i:interactive-comments,包含这个选项说明当前的 shell 是一个交互式的 shell。所谓的交互
式shell,在脚本中,i选项是关闭的。
m:monitor,打开监控模式,就可以通过Job control来控制进程的停止、继续,后台或者前台执
行等。
B:braceexpand,大括号扩展 set +B后,echo {1..100}不再扩展大括号了,只会显示{1..100}
H:history,H选项打开,可以展开历史列表中的命令,可以通过!感叹号来完成,例如“!!”返回
上最近的一个历史命令,“!n”返回第 n 个历史命令
原文:http://blog.51cto.com/13477118/2124752