shell脚本常用功能备忘录

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脚本的函数不能定义形参,这是于通用编程语言的差别 函数内部的变量在函数外也可以返回 函数必须先定义再使用

猜你喜欢

转载自junlintianxia.iteye.com/blog/2282537