shell 一

时间:2023-09-02 12:40:08

  1.shell是什么
  
  shell是一种脚本语言
  
  可以使用逻辑判断、循环等语法
  
  可以自定义函数
  
  shell是系统命令的集合
  
  shell脚本可以实现自动化运维,能大大增加我们的运维效率
  
  2.shell脚本结构和执行
  
  开头需要加#!/bin/bash
  
  以#开头的行作为解释说明
  
  脚本的名字以.sh结尾,用于区分这是一个shell脚本
  
  [root@feature1 ~]# cat 1.sh
  
  #!/bin/bash
  
  touch /tmp/1.txt
  
  chmod 600 /tmp/1.txt
  
  mv /tmp/1.txt /tmp/2.txt
  
  [root@feature1 ~]# bash 1.sh
  
  [root@feature1 ~]# bash -x 1.sh
  
  + touch /tmp/1.txt
  
  + chmod 600 /tmp/1.txt
  
  + mv /tmp/1.txt /tmp/2.txt
  
  [root@feature1 ~]# bash -n 1.sh
  
  #-n 查看有没有语法错误
  
  执行方法有两种
  
  chmod +x 1.sh; ./1.sh
  
  bash 1.sh
  
  查看脚本执行过程 bash -x 1.sh
  
  查看脚本是否语法错误 bash -n 1.sh
  
  3.date命令
  
  date +%Y-%m-%d, date +%y-%m-%d 年月日
  
  date +%H:%M:%S = date +%T 时间
  
  [root@feature1 ~]# date +%Y-%m-%d
  
  2019-03-08
  
  [root@feature1 ~]# date +%Y
  
  2019
  
  [root@feature1 ~]# date +%y
  
  19
  
  [root@feature1 ~]# date +%m
  
  03
  
  [root@feature1 ~]# date +%d
  
  08
  
  [root@feature1 ~]# date +%M
  
  43
  
  [root@feature1 ~]# date +%H
  
  15
  
  [root@feature1 ~]# date +%S
  
  41
  
  [root@feature1 ~]# date +%F
  
  2019-03-08
  
  [root@feature1 ~]# date +%T
  
  15:43:51
  
  [root@feature1 ~]# date +%Y@%m@%d
  
  2019@03@08
  
  date +%s 时间戳
  
  [root@feature1 ~]# date +%s
  
  1552031164
  
  date -d @1504620492
  
  [root@feature1 ~]# date -d @1
  
  Thu Jan 1 08:00:01 CST 1970
  
  [root@feature1 ~]# date -d @1552031164
  
  Fri Mar 8 15:46:04 CST 2019
  
  date -d "+1day" 一天后
  
  date -d "-1 day" 一天前
  
  date -d "-1 month" 一月前
  
  date -d "-1 min" 一分钟前
  
  [root@feature1 ~]# date -d "+1day"
  
  Sat Mar 9 15:48:31 CST 2019
  
  [root@feature1 ~]# date -d "-1day"
  
  Thu Mar 7 15:48:40 CST 2019
  
  [root@feature1 ~]# date -d "-1hour"
  
  Fri Mar 8 14:48:47 CST 2019
  
  [root@feature1 ~]# date -d "+hour"
  
  Fri Mar 8 16:48:52 CST 2019
  
  [root@feature1 ~]# date -d "+week"
  
  Fri Mar 15 15:48:59 CST 2019
  
  date +%w, date +%W 星期
  
  [root@feature1 ~]# date +%w
  
  5
  
  [root@feature1 ~]# date +%W
  
  09
  
  [root@feature1 ~]# date -d "-70day" +%W
  
  52
  
  [root@feature1 ~]# date -d "-50day" +%W
  
  02
  
  4.shell脚本中的变量
  
  当脚本中使用某个字符串较频繁并且字符串长度很长时就应该使用变量代替
  
  使用条件语句时,常使用变量 if [ $a -gt 1 ]; then ... ; fi
  
  引用某个命令的结果时,用变量替代 n=`wc -l 1.txt`
  
  写和用户交互的脚本时,变量也是必不可少的
  
  read -p "Input a number: " n; echo $n 如果没写这个n,可以直接使用$REPLY
  
  内置变量 $0, $1, $2… $0表示脚本本身,$1 第一个参数,$2 第二个 .... $#表示参数个数
  
  [root@feature1 ~]# a=`date +%w`
  
  [root@feature1 ~]# echo $a
  
  [root@feature1 ~]# a=$(date +%W)
  
  [root@feature1 ~]# echo $a
  
  09
  
  [root@feature1 ~]# read -p "请输入一个数字:" n
  
  请输入一个数字:8
  
  [root@feature1 ~]# echo $n
  
  8
  
  [root@feature1 ~]# read -p "请输入一个数字:"
  
  请输入一个数字:6
  
  [root@feature1 ~]# echo $REPLY
  
  6
  
  [root@feature1 ~]# vim 2.sh
  
  #!/bin/bash
  
  echo "\$1=$1"
  
  echo "第二个参数是$2"
  
  echo "第二个参数是$3"
  
  echo "本脚本一共有$#个参数"
  
  [root@feature1 ~]# sh 2.sh 1 2 3 a
  
  $1=1
  
  第二个参数是2
  
  第二个参数是3
  
  本脚本一共有4个参数
  
  [root@feature1 ~]# sh 2.sh aa bb cc dd
  
  $1=aa
  
  第二个参数是bb
  
  第二个参数是cc
  
  本脚本一共有4个参数
  
  [root@feature1 ~]# sh 2.sh aa bb cc dd 55
  
  $1=aa
  
  第二个参数是bb
  
  第二个参数是cc
  
  本脚本一共有5个参数
  
  [root@feature1 ~]# sh 2.sh aa bb
  
  $1=aa
  
  第二个参数是bb
  
  第二个参数是
  
  本脚本一共有2个参数
  
  [root@feature1 ~]# cat 2.sh
  
  #!/bin/bash
  
  echo "\$1=$1"
  
  echo "第二个参数是$2"
  
  echo "第二个参数是$3"
  
  echo "本脚本一共有$#个参数"
  
  echo “\$0是$0”
  
  [root@feature1 ~]# sh 2.sh 2 o
  
  $1=2
  
  第二个参数是o
  
  第二个参数是
  
  本脚本一共有2个参数
  
  “$0是2.sh”
  
  [root@feature1 ~]# chmod +x 2.sh
  
  [root@feature1 ~]# ./2.sh
  
  $1=
  
  第二个参数是
  
  第二个参数是
  
  本脚本一共有0个参数
  
  “$0是./2.sh”
  
  数学运算a=1;b=2; c=$(($a+$b))或者$[$a+$b]
  
  [root@feature1 ~]# a=1
  
  [root@feature1 ~]# b=2
  
  [root@feature1 ~]# c=$(($a+$b))
  
  [root@feature1 ~]# echo $c
  
  3
  
  [root@feature1 ~]# c=$[$a+$b]
  
  [root@feature1 ~]# echo $c
  
  3
  
  # $(($a+$b))=$[$a+$b]
  
  5.shell中的逻辑判断
  
  格式1:if 条件 ; then 语句; fi
  
  格式2:if 条件; then 语句; else 语句; fi
  
  格式3:if …; then … ;elif …; then …; else …; fi
  
  逻辑判断表达式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意到处都是空格
  
  [root@feature1 ~]# vim if1.sh
  
  #!/bin/bash
  
  a=10
  
  if [ $a -gt 5]
  
  then
  
  echo ok
  
  fi
  
  [root@feature1 ~]# sh -x if1.sh
  
  + a=10
  
  + '[' 10 -gt '5]'
  
  if1.sh: line 3: [: missing `]'
  
  #直接命令行也是可以的。换行用;
  
  [root@feature1 ~]# a=10; if [ $a -gt 5 ]; then echo ok; fi
  
  ok
  
  [root@feature1 ~]# a=10
  
  [root@feature1 ~]# if [ $a -gt 5 ]
  
  > then
  
  > echo ok
  
  > fi
  
  ok
  
  [root@feature1 ~]# if [ $a -gt 5 ]; then echo ok; fi
  
  [root@feature1 ~]# if [ $a -gt 5 ]; then echo ok; else echo "not ok"; fi
  
  ok
  
  [root@feature1 ~]# vim if1.sh
  
  [root@feature1 ~]# cat if1.sh
  
  #!/bin/bash
  
  a=10
  
  if [ $a -gt 5]
  
  then
  
  echo ok
  
  else
  
  echo "not ok"
  
  fi
  
  [root@feature1 ~]# vim if2.sh
  
  [root@feature1 ~]# cat if2.sh
  
  #!/bin/bash
  
  a=2
  
  if [ $a -gt 5 ]
  
  then
  
  echo ok
  
  elif [ $a -gt 3 ]
  
  then
  
  echo "very ok"
  
  else
  
  echo "not ok"
  
  fi
  
  [root@feature1 ~]# sh -x if2.sh
  
  + a=2
  
  + '[' 2 -gt 5 ']'
  
  + '[' 2 -gt 3 ']'
  
  + echo 'not ok'
  
  not ok
  
  #逻辑判断的嵌套
  
  [root@feature1 ~]# vim if3.sh
  
  [root@feature1 ~]# cat if3.sh
  
  #!/bin/bash
  
  a=10
  
  if [ $a -gt 5 ]
  
  then
  
  if [ $a -lt 20 ]
  
  then
  
  echo "ok"
  
  else
  
  echo "very ok"
  
  fi
  
  else
  
  echo "not ok"
  
  fi
  
  [root@feature1 ~]# sh -x if3.sh
  
  + a=10
  
  + '[' 10 -gt 5 ']'
  
  + '[' 10 -lt 20 ']'
  
  + echo ok
  
  ok
  
  可以使用 && || 结合多个条件
  
  if [ $a -gt 5 ] && [ $a -lt 10 ]; then == if [ $a -get 5 -a $a -lt 10]
  
  if [ $b -gt 5 ] || [ $b -lt 3 ]; then == if [$b -gt 5 -0 $ -lt 3]
  
  6.if 判断文件、目录属性
  
  [ -f file ]判断是否是普通文件,且存在
  
  [ -d file ] 判断是否是目录,且存在
  
  [ -e file ] 判断文件或目录是否存在
  
  [ -r file ] 判断文件是否可读
  
  [ -w file ] 判断文件是否可写
  
  [ -x file ] 判断文件是否可执行
  
  [root@feature1 ~]# if [ -f 1.sh www.xycheng178.com]; then echo 1; fi
  
  1
  
  [root@feature1 ~]# if [ -d 1.sh ]; then echo 1; fi
  
  [root@feature1 ~]# ls -l /tmp/mysql.sock
  
  srwxrwxrwx. 1 mysql mysql 0 Mar 5 09:38 /tmp/mysql.sock
  
  [root@feature1 ~]# if [ -d /tmp/mysql.sock ]; then echo 1; fi
  
  [root@feature1 ~]# if [ -f /tmp/mysql.sock ]; then echo 1; fi
  
  [root@feature1 ~]# if [ -d /tmp/mysql.sock ]; then echo 1; fi
  
  [root@feature1 ~]# if [ www.yongshi123.cn-e /tmp/mysql.sock ]; then echo 1; fi
  
  1
  
  [root@feature1 ~]# if [ www.dfgjpt.com-e /tmp/ ]; then echo 1; fi
  
  1
  
  [root@feature1 ~]# if [ www.68076.cn -e /tmp/12 ]; then echo 1; fi
  
  #判断/root/ 下有没有ab.sh 没有的话 执行echo "1111">ab.sh
  
  [root@feature1 ~]# if [www.yinmaoyule178.com -f /root/ab.sh ]; then echo 1; else echo "1111" >ab.sh; fi
  
  [root@feature1 ~]# cat ab.sh
  
  1111
  
  root用户对文件的读写比较特殊,即使一个文件没有给root用户读或者写的权限,root用户照样可以读或者写
  
  7.if判断的一些特殊用法
  
  if [ -z "$a" ] 这个表示当变量a的值为空时会怎么样
  
  if [ -n "$a" ] 表示当变量a的值不为空
  
  [root@feature1 ~]# a=
  
  [root@feature1 ~]# echo $a
  
  [root@feature1 ~]# if [ -z "$a" ]; then echo "a为空"; fi
  
  a为空
  
  [root@feature1 ~]# a=1
  
  [root@feature1 ~]# if [ -z "$a" ]; then echo "a为空"; fi
  
  #加!是取反
  
  [root@feature1 ~]# if [ ! -z "$a" ]; then echo "a不为空"; fi
  
  a不为空
  
  [root@feature1 ~]# if [ www.120xh.cn-n "$a"www.68079.cn ]; then echo "a不为空"; fi
  
  a不为空
  
  [root@feature1 ~]# ls 123
  
  [root@feature1 ~]# echo $?
  
  0
  
  [root@feature1 ~]# ls 35
  
  ls: cannot access 35: No such file or directory
  
  [root@feature1 ~]# echo $?
  
  2
  
  [root@feature1 ~]# if ! ls 35 ; then echo "指令执行不成功"; fi
  
  ls: cannot access 35: No such file or directory
  
  指令执行不成功
  
  [root@feature1 ~]# if !www.dfgjyl.cn ls 35 &>/dev/null; then echo "指令执行不成功"; fi
  
  指令执行不成功
  
  if grep -q '123' 1.txt; then 表示如果1.txt中含有'123'的行时会怎么样 if [ ! -e file ]; then 表示文件不存在时会怎么样
  
  [root@feature1 ~]# if grep -q www.jiahuayulpt.com'123' 1.sh ; then echo "1.sh文件中包含有123关键字"; fi
  
  if (($a<1)); then …等同于 if [ $a -lt 1 ]; then… [ ] 中不能使用<,>,==,!=,>=,<=这样的符号
  
  [root@feature1 ~]# if (($a>2))www.thd178.com/ ; then echo "a大于2"; fi
  
  [root@feature1 ~]# a=10
  
  [root@feature1 ~]# if (($a>2)); then echo "a大于2"; fi