bash常用功能备忘
背景
工作中偶尔要跟shell脚本打交道 但是shell脚本又不是频繁使用工具,再加上shell脚本本身的知识体系不够系统化。每次使用时一些基本的用法也要google确定下,现在特地整理下常用功能 做成模板方便以后参考使用
基本流程控制
一些说明
test命令
test命令用于表达式求值 并返回布尔值 ,如果表达式求值结果为true"退出状态"为0,为false退出状态为非0值 用 #?查看"退出状态"
test 1 -eq 1
echo $? # 显示为0 表示1 -eq 1执行结果为true
另外可以使用[]代替test命令 [ 逻辑表达式 ] 注意: 逻辑表达式和"[" "]"必须有空格 比如
[ 1 -eq 1 ]
test命令使用限制 不能有正则表达式扩展
整数 字符串 文件 测试
字符串判断
= | "string1" = "string2" | 等于操作 |
!= | "string1" != "string2" | 不等于操作 |
-z string | -z string | 判断字符串长度是否等于0 |
-n string | -n string | 判断字符串长度是否不等于0 |
整数比较操作
int1 –eq int2 | Int1 is equal to int2 |
int1 –ne int2 | Int1 is not equal to int2 |
int1 –gt int2 | Int1 is greater than int2 |
int1 –ge int2 | Int1 is greater than or equal to int2 |
int1 –lt int2 | Int1 is less than int2 |
int1 –le int2 | Int1 is less than or equal to int2 |
文件属性判断
–b filename | Block special file |
–c filename | Character special file |
–d filename | Directory existence |
–f filename | Regular file existence and not a directory |
–g filename | Set-group-ID is set |
–k filename | Sticky bit is set |
–p filename | File is a named pipe |
–r filename | File is readable |
–s filename | File is nonzero size |
–u filename | Set-user-ID bit is set |
–w filename | File is writable |
–x filename | File is executable |
if elif else 格式
if格式
if 逻辑表达式
then
执行语句
fi
其中逻辑表达式有两种写法 用[]
if [ 表达式 ]
if [ 1 != 2]
then
echo "1 != 2"
fi
举个工作日还是周末判断例子
day_of_week=`date +"%u"`
echo "day_of_work=${day_of_week}"
if [ $day_of_week = 6 ] || [ $day_of_week = 7 ]; then
echo "holiday"
else
echo "workday"
fi
上面例子需要注意的是 逻辑与操作"||" 在两个[ ]之间 而不是预想的
[ $day_of_week = 6 || $day_of_week = 7 ]
用test if test 表达式 比如
if test 1 != 2
then
echo "1 != 2"
fi
if elif else 格式
if 条件表达式
then
执行语句
elif 条件表达式
then
执行语句
else
执行语句
fi
代码例子
#!/bin/sh
current_hour=`date +%H`
echo "currnet time is $current_hour"
if [ ${currnet_hour} -lt 12 ]; then
echo "Good Morning"
elif [ ${currnet_hour} -lt 18 ]; then
echo "Good Afternoon"
else
echo "Good evening"
fi
for 循环
格式
for 变量名 in 列表
do
命令
done
打印字符串
for fruit in apple orange banana
do
echo $fruit
done
按行显示文件内容
for line in `cat /etc/passwrd`
echo $line
done
$* 与 $@的区别
do while
while格式
while command
do
command
done
例子
num = 0
while [ $num -lt 10 ]
do
echo -n $num
num = `expr $num + 1`
done
echo "循环之后 num值是 $num "
util命令
util命令格式与while一样 但是与while相反,只有条件表达式执行为false 的执行才会执行循环,当条件为非0时退出循环 util格式
util 条件表达式
do
command
done
shift命令
常用操作
日期时间操作
获取时间date命令 ####时间格式化 比如显示当前日期
date "+%Y%m%d"
%n : 下一行
%t : 跳格
%H : 小时(00..23)
%I : 小时(01..12)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数
%S : 秒(00..61)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区 %a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期与时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)
时间加减
date +%Y%m%d //显示现在天年月日 date +%Y%m%d --date="+1 day" //显示后一天的日期
date +%Y%m%d --date="-1 day" //显示前一天的日期
date +%Y%m%d --date="-1 month" //显示上一月的日期
date +%Y%m%d --date="+1 month" //显示下一月的日期
date +%Y%m%d --date="-1 year" //显示前一年的日期
date +%Y%m%d --date="+1 year" //显示下一年的日期
或者更简单点的 date=date -d -${t}day '+%Y%m%d'
//为t为前几天
函数
shell参数
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
函数定义
函数格式 function_name () { commands ; commands; } 将函数传入的第一个参数加一并返回
increment () {
sum = \`expr $1 + 1\`;
return $sum;
}
执行函数 increment 2 查看函数执行结果 echo $?
函数参数和返回值 函数总结 shell脚本的函数不能定义形参,这是于通用编程语言的差别 函数内部的变量在函数外也可以返回 函数必须先定义再使用