Shell脚本之变量类型、算数运算符、条件测试
变量赋值:
name=Value
name=$user
name=Command
,name=$(Command)
#反引号是老的用法,$()是新的用法,不管是在学习测试中,还是在实际工作中,$()的用法都是被推荐的。
#!/bin/bash
#
Sum=$(echoseq $1 $2
| tr “ “ “+” | bc) #################可以正确输出
echo “$1到$2的和为:$Sum”
Sum1=echo ``seq $1 $2
| tr “ “ “+” | bc`` #################输出报错
echo “$1到$2的和为:$Sum1”
变量引用:$name,${name}
显示已定义的所有变量:set
删除变量:unset name
环境变量:对当前shell及其子shell有效
变量赋值:export name=value
declare -x name=value
显示所有环境变量:export、env、printenv
删除变量:unset name
bash内置的环境变量有:PATH, SHELL, USRE,UID,HISTSIZE, HOME, PWD, OLDPWD, HISTFILE, PS1
局部变量:对当前shell进程中某段代码片段有效(通常指函数)
位置变量:$1 $2……表示,用于让脚本在脚本代码中通过调用命令行中的传递的参数,1和2 分别代表第一个参数和第二个参数,shift可以替换参数
特殊变量:$?:判断执行结果0-255
$0:脚本名称
$:命令行中传递的所有参数,且当做一个整体
$@:命令行传递的所有参数,每个参数当做一个整体
$#:命令行中传递的参数总数,与$@只在被双引号包起来才会看出差异,可从下段脚本中看去区别
root@Centos7.2 /testdir # cat arg1.sh arg2.sh
#!/bin/bash
#
echo 1st is $1
echo 2st is $2
echo all args are is “$
“
#!/bin/bash
#
./arg1.sh “$“
echo ============i
./arg1.sh “$@”
echo ==============
echo $
echo $@
root@Centos7.2 /testdir # ./arg2.sh 1 2 3
1st is 1 2 3
2st is
all args are is 1 2 3
============i
1st is 1
2st is 2
all args are is 1 2 3
==============
1 2 3
1 2 3
只读变量:只读变量不能修改删除
变量赋值:readonly name=value 、declare -r name=value
PATH变量定义位置:.bash_profile –> $PATH:$HOME/bin
PATH=$PATH:$HOME/.local/bin:$HOME/bin –.local/bin centos7普通用户有的隐藏的目录,可以放写隐藏的脚本
写脚本的时候可以先mkdir /home/bin 在bin目录下写脚本,可省去相对路径。
source bash.sh 也可以执行脚本:其执行过程相当于直接在当前shell进程中进行,而不是开一个子进程进行,所有脚本执行完,echo 变量,还可以查看到变量的值。(正常父进程是不能查看子进程的变量的)
shadow 默认权限000 但是root用户属于超级用户 可读可写,但是如果文件没有x权限,root也不能执行
算数运算符
bash中的算数运算符:+、-、、/、%、**(平方) 注意:在使用expr的时候“” 要转义“*”
实现算数运算:
let var=算数表达式
var=$[算数表达式]
var=$((算数表达式))
var=$(expr arg1 arg2 arg3) 注意:每个参数之间要用空格隔开
root@cenots6.8 # echo $(expr 5 * 2 - 1)
9
declare -i var=数字
echo ‘算数表达式’| bc
随机数生成器:echo $[RANDOM%50]:0-49之间的随机数
echo $[RANDOM%50+1]:1-50之间的随机数
$RANDOM :1-32767
#!/bin/bash
echo xxx;(echo zzz;exit) ############():代表开个子shell,exit退出子shell非当前shell
echo yyy
$? 变量保存最近的命令退出状态
测试命令:test [expression]
[ $a = $b ] 判断 一对[]或两对[[]] 都可以
[[ $a == $b ]] 两个等号也可以
[ -f /bin/cat -a -x /bin/cat ] 此时必须使用 一对[] 否则会报错
数值测试:
-gt:大于
-ge:大于等于
-lt:小于
-le:小于等于
-eq:等于
-ne:不等于
字符串测试:
==:是否相等
>:大于(比较ascll码)
<:小于
!=:是否不等于
=~:左侧字符串是否能够被右侧的PATTERN所匹配,注意: 此表达式一般用于[[ ]]中;
-z “string”:判断字符串是否为空,如果为空则为真
-n “string”:判断字符串是否为空,如果不为空则为真
注意:用于字符串比较的时候,操作数应该使用引号
存在性测试:
-a file:文件存在为真,否则为假
-e file:同-a
存在性及类别测试:
-b FILE:是否存在且为块设备文件 block
-c FILE:是否存在且为字符设备文件 char
-d FILE:是否存在且为目录文件 dir
-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 非
如: [ -e FILE ] && [ -r FILE ]
第二种方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
转自:马哥linux运维