LInuxDay8——shell脚本编程基础
Posted Welcome My blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LInuxDay8——shell脚本编程基础相关的知识,希望对你有一定的参考价值。
变量
变量即命名的内存空间
在shell中所有变量默认都当成字符型变量,bash不支持浮点型变量
变量的命名规则:
不能使程序中的保留字:例如if, for
只能使用数字、字母及下划线,且不能以数字开头
见名知义
统一命名规则:驼峰命名法
按变量的生效范围可分为:
局部变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
环境(全局)变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片断,通常指函数
位置变量:$1, $2, ...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:$?, $0, $*, [email protected], $#,$$
局部变量:
变量赋值:VAR=‘value’
字符串:Name=“root”
变量引用:Name=“$USER”
命令引用:Name=·whoami·
变量引用:${VAR}
"":弱引用,其中的变量引用会被替换为变量值
‘‘:强引用,其中的变量引用不会被替换为变量值,而保持原字符串
set 显示已定义的所有变量
unset VAR删除已定义的变量
局部变量只在当前bash生效
环境变量:
变量声明:
export name=VALUE
declare -x name=VALUE
显示环境变量的命令:
env
printenv
export
declare -x
bash内置的环境变量
PATH
SHELL
USER
UID
HOME
PWD
SHLVL 是记录多个 Bash 进程实例嵌套深度的累加器
LANG
HOSTNAME
HISTSIZE
- 上一个命令执行后的最后一个参数
只读变量(常量)
声明:
readonly VAR
declare -r VAR
readonly -p 查看只读变量
位置变量
$1,$2...:对应脚本参数位置
shift:踢出前一个位置变量
$#:脚本参数的个数
$0:表示脚本的绝对路径,如果是符号链接则表示符号链接的绝对路径
$*:传递给脚本的所有参数,全部参数合为一个字符串
[email protected]:传递给脚本的所有参数,每个参数为独立字符串
[email protected] $* 只在被双引号包起来的时候才会有差异
set -- 清空所有位置变量
退出状态
$?:脚本或命令的退出状态,0为成功,非0(1-255)为失败
exit [#]:自定义退出状态码,并退出当前bash进程
如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
算术运算
运算符:
+
-
*
/
%:取模
**:乘方
^:异或
-
-
[[email protected] ~]# a=3 [[email protected] ~]# b=5 [[email protected] ~]# echo $a $b 3 5 [[email protected] ~]# a=$[a^b];b=$[a^b];a=$[a^b] #a和b的值互换 [[email protected] ~]# echo $a $b 5 3
-
算术运算表示法:
let VAR=算术表达式
VAR=$[算术表达式]
VAR=$((算术表达式))
VAR=$(expr 算术表达式,但是运算符中间需要有空格)
echo ‘算术表达式‘ |bc
$RANDOM:bash内置随机数生成器(0-32767)
条件测试
逻辑运算
0,true
1,false
与:
1 与 1 = 1
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0
或:
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
非:
! 1 = 0
! 0 = 1
条件测试(test)
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
EXPRESSION前后必须有空白字符
条件测试,为真则返回0,为假则返回1
命令间的逻辑关系
CMD1 && CMD2:逻辑与,如果CMD1返回为真,则CMD2执行;否则CMD2不执行
CMD1 || CMD2:逻辑或,如果CMD1返回为假,则CMD2执行,否则CMD2不执行
CMD1 || { CMD2;CMD3; }:如果CMD1返回为假,则执行CMD2和CMD3
测试符:
变量测试:
-v:变量是否设置
数值测试
-eq:等于
-ne:不等于
-lt:小于
-le:小于等于
-gt:大于
-ge:大于等于
字符串测试
==:相等
>:大于,比较ASCII码
<:小于,比较ASCII码
!=:不等
=~:左侧字符串是否能够被右侧的PATTERN所匹配,用[[ STRING =~ PATTERN ]],PATTERN必须为扩展的正则表达式
hostping.sh
-z:是否为空
-n:是否为不空
文件测试
-a == -e:是否存在
-b:是否为块设备
-c:是否为字符设备
-d:是否为目录
-f:是否为普通文件
-h == -L:是否为符号链接
-p:是否为管道文件
-S:是否为套接字文件
-r:是否可读
-w:是否可写
-x:是否可执行
-u:是否有SUID权限
-g:是否有SGID权限
-k:是否有sticky权限
-s:是否是非空文件
-t fd:文件描述符是否在打开状态
-N:文件自从上一次被读取之后是否被修改过
-O:当前有效用户是否为文件属主
-G:当前有效用户是否为文件属组
文件属性双目测试
FILE1 -ef FILE2:FILE1是否是FILE2的硬链接
FILE1 -nt FILE2:FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2:FILE1是否旧于FILE2
组合条件测试
组合测试条件
-a:与关系(并且)
-o:或关系(或者)
! :非关系
摩根定律:
!(A -o B) = !A -a !B
!(A -a B) = !A -o !B
read命令
使用read来把输入值分配给一个或多个shell变量,
read 从标准输入中读取值,给每个单词分配一个变量
所有剩余单词都被分配给最后一个变量
选项:
-p:输入提示信息
-s:静默输入,用于输入密码时
-n #:限定输入字符串的长度
-d ‘EOF‘:当匹配到结束符时自动结束
-t #:超时时间
#!/bin/bash # read -t 5 -p "please input head number: " HEADNU read -t 5 -p "please input feet number: " FEETNU echo -e "chook number is $((($FEETNU-2*$HEADNU/2)))\n$(($HEADNU-$((($FEETNU-2*$HEADNU/2)))))"
以上是关于LInuxDay8——shell脚本编程基础的主要内容,如果未能解决你的问题,请参考以下文章