检查脚本中的语法错误
bash -n script.sh
预览执行结果
bash -x script.sh
运行data目录下所有的脚本
run-parts /data
bash和+x 开始子进程运行脚本
source和 . 在当前进程运行脚本
bash展开命令行优先级:
1、把命令行分成单个单词
2、展开别名
3、展开大括号的声明
4、展开波浪符声明
5、命令替换
6、再次把命令行分成命令词
7、展开文件统配
8、准备I/O重定向
9、运行命令
bash的配置文件,添加别名和变量
按生效范围划分:
全局配置:/etc/profile
/etc/profile/*.sh
/etc/bashrc
个人配置:~/.bash_profile 存放用户环境变量或开机启动的命令
~/.bashrc 存放别名或者函数
~/.bash_logout 存放退出执行命令
交互式登录:su - user
非交互式登录:su user或脚本、图形界面
/etc/profile/*.sh 和 ~/.bashrc 和 /etc/bashrc 交互式、非交互式登录都可使用
/etc/profile 和 ~/.bash_profile 只有交换式登录可用
set:显示所有变量
unset:删除变量
exit #:指定退出状态码
alias:显示别名,bash脚本不支持别名
变量命名法则:
1、不能使用程序中的保留字
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法
生效范围划分变量类型:
局部变量:当前shell进程
环境变量(全局变量):当前shell进程及其子进程,export或declare声明
位置变量:$1,$2,...来表示,用于表示运行脚本后面的参数,(set -- 清空所有位置变量)
$?:判断命令执行结果,0是表示成功,其他失败
$0:命令本身
$*:双引号下,全部参数合成一个字符串传递给脚本
$@:双引号下,每个参数为独立的字符串传递给脚本
$#:显示参数的个数
$$:显示当前进程号
$-:h-记录命令路径,i-交互式shell,m-监控模式,B-大括号扩展,H-历史命令
特殊变量:
():开启子shell执行,不影响当前shell环境
{}:不开启子shell,影响当前shell环境
shift n 把后面第n个参数变成到第一个参数
bash内置的环境变量:
PATH 决定shell将到哪些目录中寻找命令或程序
SHELL
USER
UID
HOME
PWD
SHLVL bash嵌套深度
LANG
MAIL
HOSTNAME
HISTSIZE
_:前面命令的最后一个字符串
RANDOM:生成随机数(0-32767)
算术运算
let var=算术表达式
var=$[算术表达式]
var=$((算术表达式))
$?:判断命令执行结果,0是表示成功,其他失败
短路与 && 正确就执行
短路或 || 不正确就执行
非(取反) !
0&&0=0
0&&1=0
1&&0=0
1&&1=1
cmd1 && cmd2
如果cmd1为假,cmd2不需要执行,反之cmd1为真,cmd2执行
0||0=0
0||1=0
1||0=0
1||1=1
cmd1 || cmd2
如果cmd1为真,cmd2不需要执行,反之cmd1为假,cmd2执行
短路或、短路与,后面命令一起执行加{;}
false || { echo cmd1 ; echo cmd2; }
cmd1 && cmd2 || cmd3
cmd2 true
cmd1 true 执行cmd2
cmd1 false 执行cmd3
异或 ^
0^1=1
0^0=0
1^1=0
1^0=1
两个值相同为假,不同为真
条件测试语句:(布尔值:0为真,1为假)
= > <
!= 不等于
=~ 左侧表达式能否被右边扩展正则表达式匹配,与[[ ]]配合使用
格式:
test $s1 = $s2
[ $1 = $2 ] 用于简单的字符串或数字比较
[[ $1 == $2 ]] 使用正则表达式
逻辑测试:
-a 并且,表达式相同为真
-o 或者,表达式一个真,就为真
数字测试:
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
字符串测试:
= 等于则为真
!= 不相等则为真
-z 字符串的长度为零则为真
-n 字符串的长度不为零则为真
=~ 左侧表达式能否被右边扩展正则表达式匹配,与[[]]配合使用
文件测试:
-e 文件存在则为真
-r 文件存在且可读则为真
-w 文件存在且可写则为真
-x 文件存在且可执行则为真
-s 文件存在且至少有一个字符则为真
-d 文件存在且为目录则为真
-f 文件存在且为普通文件则为真
-c 文件存在且为块特殊文件则为真
文件特殊权限测试:
-u 文件存在且有suid权限
-g 文件存在且有sgid权限
-k 文件存在且有sticky权限
read 输入值分配给一个或多个shell变量
-p 指定要显示的提示
-s 静默输入,一般用于密码
-n # 指定输入的字符长度#
-d x 设置‘x’输入结束符
-t # TIMEOUT为#秒
read x y z <<<"i j k" 变量批量赋值
练习1:
硬盘使用率超过80%报警:
abc=`df |grep "sd" |tr -s " " "%" |cut -d "%" -f5 |sort -nr |head -1`
[ "$abc" -ge 80 ] && echo "disk will be full"
练习2:
鸡兔同笼(头35 脚94)
read -p "head number " h
read -p "feet number " f
chook=$[(h*4-f)/2]
rabbit=$[h-chook]
echo "chook number is $chook ; rabbit numer is $rabbit "
练习3:
判断yes or no
read -p "Do you agree?yes or no: " ans
&& echo "Please input yes or no"
[[ $ans =~ ^([Yy]|[Yy][Ee][Ss])$ ]] && echo "your answer is yes"
[[ $ans =~ ^([Nn]|[Nn][Oo])$ ]] && echo "your answer is no"
练习4:
修改PATH变量,新加变量建议放在前面
vim /etc/profile.d/*.sh
PATH=/usr/local/apache/bin:$PATH
. /etc/profile.d/*.sh