shell脚本常用功能备忘录

shell脚本常用功能备忘录

 

  • bash常用功能备忘
    • 背景
    • 基本流程控制
      • 一些说明
      • 整数数字比较 字符串比较 文件属性判断
      • if elif else 格式
      • for 循环
      • do while
      • util命令
      • shift命令
    • 常用操作
      • 日期时间操作
        • 时间格式化
        • 时间加减
    • 函数
      • shell参数说明
      • 函数定义
      • 函数总结

 

背景

工作中偶尔要跟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命令使用限制 不能有正则表达式扩展

整数数字比较 字符串比较 文件属性判断

在shell脚本中也会存在一些逻辑运算判断 比如说数字运算判断 字符串属性判断 文件属性判断等

  • 字符串判断
运算符 操作 说明
= “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

用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 的执行才会执行循环,当条件为true时退出循环 
util格式

util  条件表达式
do 
command
done 

shift命令

// TODO

常用操作

日期时间操作

获取时间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
%s 从 1970 年 1 月 1 日 00
%S 秒(00..61)
%T 直接显示时间 (24 小时制)
%X 相当于 %H
%Z 显示时区 %a
%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

 传递给脚本或函数的参数。是一个数字,表示第几个参数。

例如,第一个参数是1,第二个参数是$2。

$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@  传递给脚本或函数的所有参数。被双引号包含时,与* 稍有不同
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

函数定义

函数格式

function_name () { 
   commands  ; 
   commands; 
}

将函数传入的第一个参数加一并返回

increment  () {
 sum = `expr $1 + 1`;
 return $sum;
}

执行函数 increment 2 
查看函数执行结果 echo $?

函数总结

shell脚本的函数不能定义形参,这是于通用编程语言的差别 
函数内部的变量在函数外也可以返回,没有局部变量这一说
函数必须先定义再使用

你可能感兴趣的:(linux,shell,备忘录)