Bash 变量、配置及测试运算简介
bash 变量说明
根据变量的生效范围为标准:
-
本地变量:生效范围为当前 shell 进程,对当前 shell 进程之外的进程或当前 shell 的子进程和父进程均无效。
-
环境变量:生效范围为当前 shell 进程及其子进程。
-
局部变量:生效范围为当前 shell 进程中某代码片段(函数)。
-
位置变量:
$1
,$2
,$3
等来表示,用于让脚本在脚本代码中调用通过外部脚本或命令行传递给它的参数。 -
特殊变量:
$?
,$0
,$*
,$@
,$#
等来表示,系统自带用户存储特殊数据。
本地变量
变量赋值
name='value'
(1) 直接字串,name="username"
;
(2) 变量引用,name="$username"
;
(3) 命令引用,name=$(COMMAND)
;
变量引用
${name}
, $name
""
弱引用,其中的变量引用会被替换为变量值;
''
强引用,其中的变量引用不会被替换为变量值,而保持原字符串;
显示已定义的所有变量
set
销毁变量
unset name
环境变量
bash 有许多内建的环境变量: PATH , SHELL , UID , HISTSIZE , HOME , PWD , OLD , HISTFILE , PS1 等,自建环境变量时尽可能避免跟系统内建变量冲突。
变量赋值
export name=VALUE
, declare -x name=VALUE
变量引用
$name
, ${name}
显示所有环境变量
export
, env
, printenv
销毁环境变量
unset name
变量命名法则
-
不能使程序中的保留字:例如
if
,for
; -
只能使用数字、字母及下划线,且不能以数字开头;
-
见名知义;
只读变量
readonly name=VALUE
declare -r name=VALUE
位置变量
在脚本代码中调用通过命令行传递给脚本的参数;
$1
, $2
, $3
对应调用第1、第2、第3参数;
$0
命令本身;
$*
传递给脚本的所有参数;
$@
传递给脚本的所有参数;
$#
传递给脚本的参数的个数;
shift [n]
剔除参数,n表示剔除n个,可多次使用。
eg1:
echo $1
shift
echo $1 # 由于前一个$1被剔除,此时$1为实际$2的值
eg2:
echo $1
shift 3
echo $1 # 由于$1-$3被剔除,此时$1为实际$4的值
bash配置文件
profile
为交互式登录的 shell 提供配置:
生效范围
-
全局
/etc/profile
/etc/profile.d/*.sh
-
个人
~/.bash_profile
-
功用
(1) 用于定义环境变量;
(2) 运行命令或脚本;
读取顺序
/etc/profile > /etc/profile.d/*.sh > ~/.bash_profile > ~/.bashrc > /etc/bashrc
bashrc
为非交互式登录的shell提供配置:
-
su UserName
; -
图形界面下打开的终端;
-
执行脚本;
生效范围
-
全局
/etc/bashrc
-
个人
~/.bashrc
-
功用
(1) 定义命令别名;
(2) 定义本地变量;
读取顺序
~/.bashrc > /etc/bashrc > /etc/profile.d/*.sh
bash算术运算符
+, -, *, /, %, **
实现算术运算的方式
-
以加法为例:
-
let a=$a+$b
; -
a=$[$a+$b]
,建议使用; -
a=$(($a+$b))
; -
a=$($a + $b + $c ...)
,某些特殊运算符需要转义,不建议使用;
-
内建的随机数生成器
$RANDOM
-
取60以内的随机数(60的余数必定小于60)
a=$[$RANDOM%60+1]
增强型赋值
+=, -=, *=, /=, %=
let a+=1
等价于 a=$[$a+1]
;
自增,自减:
++, --
let a++
等价于 a=$[$a+1]
;
let a--
等价于 a=$[$a-1]
;
bash条件测试
测试命令
test EXPRESSION
系统内建命令;
[ EXPRESSION ]
系统内建命令,等价于test,对系统兼容性更佳;
[[ EXPRESSION ]]
bash关键字,只能在bash下使用,但是对命令兼容性和扩展性更佳;
具体使用可通过 help test
、 help [
、 help [[
查看;
数值测试:
-gt
是否大于;
-ge
是否大于等于;
-eq
是否等于;
-ne
是否不等于;
-lt
是否小于;
-le
是否小于等于;
字符串测试:
==
是否等于;
>
是否大于;
<
是否小于;
!=
是否不等于;
=~
左侧字符串是否能够被右侧的PATTERN所匹配;
-z "STRING"
测试字符串是否为空,空则为真,不空则为假;
-n "STRING"
测试字符串是否不空,不空则为真,空则为假;
用于字符串比较时的用到的操作数都应该使用引号!
文件测试
help test
可查看所有参数,比较常用的有如下几类。
存在性测试
-a FILE
文件存在性测试,存在为真,否则为假;
-e FILE
等价于 -a FILE
;
存在性及类别测试
-b FILE
是否存在且为块设备文件;
-c FILE
是否存在且为字符设备文件;
-d FILE
是否存在且为目录文件;
-f FILE
是否存在且为普通文件;
-h FILE
或 -L FILE
存在且为符号链接文件;
-p FILE
是否存在且为命名管道文件;
-S FILE
是否存在且为套接字文件;
文件权限测试
-r FILE
是否存在且可读;
-w FILE
是否存在且可写;
-x FILE
是否存在且可执行;
文件特殊权限测试
-g FILE
是否存在且拥有 sgid 权限;
-u FILE
是否存在且拥有 suid 权限;
-k FILE
是否存在且拥有 sticky 权限;
文件大小测试
-s FILE
是否存且非空;
文件是否打开
-t fd
fd 表示文件描述符是否已经打开且与某终端相关;
-N FILE
文件自从上一次被读取之后是否被修改过;
-O FILE
当前有效用户是否为文件属主;
-G FILE
当前有效用户是否为文件属组;
双目测试
FILE1 -ef FILE2
FILE1 与 FILE2 是否指向同一个设备上的相同 inode ;
FILE1 -nt FILE2
FILE1 是否新于 FILE2 ;
FILE1 -ot FILE2
FILE1 是否旧于 FILE2 ;
组合测试条件
-
第一种方式:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND
eg:
[ -e FILE ] && [ -r FILE ]
[[ -e FILE && -r FILE ]]
-
第二种方式:
EXPRESSION1 -a EXPRESSION2
EXPRESSION1 -o EXPRESSION2
! EXPRESSION
eg:
[ -z "$HOSTNAME" -o "$HOSTNAME"=="localhost.localdomain" ] && hostname www.huangzhongzhang.cn