设为首页 收藏本站
查看: 1846|回复: 0

[SHELL]shell scripts笔记(1)

[复制链接]

尚未签到

发表于 2018-8-19 07:20:03 | 显示全部楼层 |阅读模式
  自己没事总结了点基础的东西,以备不时之需。
  一.判断式:
  1.判断符号 &&及||
  检测test是否存在:
  # test -e /haha
  注:test是一个判断文件属性的命令,-e参数判断目录是否存在,执行结果不会显示任何信息,但最后我们可以透过$?或&&及||来展现整个结果
  例如:
  # test -e /haha && echo "exist" ||echo "not exist"
  注: -f参数判断是否为文件,-d判断是否为目录
  实例:
  1).让使用者输入一个文件名,判断这个文件名是否存在,若不存在给予一个filename does not exist的信息,并中断程序。
  2).若这个文档存在,则判断他是文档还是目录,结果输出filename is regular file 或 filename is directory
  3).判断执行者对这个文件或目录所拥有权限,并输出权限目录:
  # vi sh05.sh
  --------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  # 判断是否输入字符串:
  echo -e "Please input a filename,I will check the filename's type and permission. \n\n"
  read -p "Input afilename:"filename
  test -z $filename && echo "You must input a filename." && exit 0
  # 判断文件是否存在,若不存在则提示并退出
  test ! -e $filename && echo "The filename `$filename` do not exist" && exit 0
  # 判断文件类型和属性:
  test -f $filename && filetype="regulare file"
  test -d $filename && filetype="directory"
  test -r $filename && perm="readable"
  test -w $filename && perm="$perm writable"
  test -x $filename && perm="$perm executable"
  # 输出信息:
  echo "The filename:$filename is a $filetype"
  echo "And the permissions are:$perm"
  --------------------
  2.判断符号[]
  判断$HOME变量是否为空:
  # [ -z "$HOME" ];echo $?
  注: 中括号因为用在很多包括通配符,正则表达式中,所以用在shell判别式时,为了与其他用法区分,必须在括号两端用"空格"间隔。
  判断两个变量是否相同
  # [ "$HOME" == "$MAIL" ]
  实例
  1.当执行一个程序时,程序会让用户选择Y或N
  2.如果用户输入Y或y时,就显示OK continue
  3.如果用户输入n或N时,显示oh,interrupt!
  4.如果输入其他字符,就显示 I don't know what fucking your choice is
  利用[] && ||实现
  # vi sh06.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  read -p "Please input (Y/N):" yn
  ["$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 0
  ["$yn" == "N" -o "$yn" == "n" ] && echo "oh,interrupt!" && exit 0
  echo "I don't know what fucking your choice is" && exit 0
  ----------------------
  传参:
  实例:
  1.程序文件名为何?
  2.共有几个参数?
  3.若参数个数小雨2则告知使用者参数数量太少
  4.全部的参数为何?
  5.第一个参数为何?
  6.第二个参数为何?
  # vi sh07.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  echo "The script name is   ==> $0"
  echo "Total parameter number is    ==> $#"
  [ "$#" -lt 2 ] && echo "The number of parameter is less than 2. Stop here." && exit 0
  echo "Your whole parameter is ==> $@"
  echo "The 1st parameter  ==> $1"
  echo "The 2st parameter  ==> $2"
  ----------------------
  条件判断:
  利用if...then
  sh06修改版:
  # vi sh08.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  read -p "Please input (Y/N):" yn
  if [ "$yn" == "Y" ] || [ "$yn" == "y" ];then
  echo "OK,continue"
  exit 0
  elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
  echo "oh,interrupt!"
  exit 0
  else
  echo "I don't know what fucking your choice is"
  exit 0
  fi
  fi
  ----------------------
  实例1:
  1.判断$1是否为hello,如果是,显示 hello,how are you?
  2.如果没加参数,提示用户必须使用参数
  3.如果加入的参数不是hello,就提示用户只能用hello作为参数
  # vi sh09.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  if [ "$1" == "hello" ];then
  echo "Hello,how are you?"
  elif [ "$1" == "" ];then
  echo "You must input parameters,example:{$0 someword}"
  else
  echo "The only parameter is 'hello',example:{$0 hello}"
  fi
  ---------------------
  实例2:
  判断主机常见21,22,25,80是否开启
  # vi sh10.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  PORT=$(netstat -tunl |grep "$1"| sed -n '1p' | awk '{print $4}'| sed 's/^.*://g')
  VAR=$(echo "$1" |bc 2>/dev/null)
  if [ "$1" == "" ]; then
  echo "Please input a port.example:{sh $0 80}"
  elif [ "$VAR" != "$1" ];then
  echo "Please input the right port.example:{sh $0 80}"
  elif [ "$PORT" == "21" ];then
  echo "ftp is running in your system"
  elif [ "$PORT" == "22" ];then
  echo "ssh is running in your system"
  elif [ "$PORT" == "25" ];then
  echo "smtp is running in your system"
  elif [ "$PORT" == "80" ];then
  echo "www is running in your system"
  else
  echo "the port:$1 is not running"
  fi
  ----------------------
  利用if...esac判断
  sh09修改版:
  # vi sh11.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  case $1 in
  "hello")
  echo "Hello,how are you?"
  ;;
  "")
  echo "You must input parameters,example:{sh $0 someword}"
  ;;
  *)
  echo "Usage:{sh $0 hello}"
  ;;
  esac
  ---------------------
  实例2:
  # vi sh12.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  case $1 in
  "one")
  echo "Your choice is ONE"
  ;;
  "two")
  echo "Your choice is TWO"
  ;;
  "three")
  echo "Your choice is "THREE"
  ;;
  *)
  echo "Usage $0 {one|two|three}"
  esac
  ---------------------
  function功能
  实例1:
  # vi sh13.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  function printit(){
  echo -n "Your choice is" # -n表示不断行在同行显示
  }
  echo "This program will print your selection!"
  case $1 in
  "one")
  printit;echo $1 | tr 'a-z' 'A-Z' # 将参数做大小写转换
  ;;
  "two")
  printit;echo $1 | tr 'a-z' 'A-Z'
  ;;
  "three")
  printit;echo $1 | tr 'a-z' 'A-Z'
  ;;
  *)
  echo "Usage $0 {one|two|three}"
  ;;
  esac
  --------------------------
  实例1变种:
  # vi sh14.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  function printit(){
  echo  "Your choice is $1"
  }
  echo "This program will print your selection!"
  case $1 in
  "one")
  printit 1 # printit 后可接参数
  ;;
  "two")
  printit 2
  ;;
  "three")
  printit 3
  ;;
  *)
  echo "Usage $0 {one|two|three}"
  ;;
  esac
  --------------------------
  while do done,until do done(不定循环)
  # vi sh15.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  while [ "$yn" != "yes" -a "$yn" != "YES" ]
  do
  read -p "Please input yes/YES to stop this program:" yn
  done
  echo "OK,you input the correct answer."
  ----------------------
  # vi sh16.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  until [ "$yn" == "yes" -o "$yn" == "YES" ]
  do
  read -p "Please input yes/YES to stop this program:" yn
  done
  echo "OK,you input the correct answer."
  ----------------------
  计算1+2+...+100=?
  # vi sh17.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  s=0
  i=0
  while [ "$i" != "100" ]
  do
  i=$($i+1)
  s=$($s+$i)
  done
  echo "The result of '1+2+3+...+100'=" $s
  -----------------------
  for...do...done (固定循环)
  # vi sh18.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  for animal in dog cat elephant
  do
  echo "There are ${animal}s..."
  done
  ---------------------
  # vi sh19.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  users=$(cat /etc/passwd | awk 'BEGIN {FS=":"} {print $1}')
  for username in $users
  do
  id $username
  # finger $username
  done
  ---------------------
  实例1:
  利用for循环ping网内主机状态
  # vi sh20.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  network="172.24.30"
  for host in $(seq 1 254)
  do
  ping -c 1 -w 1 ${network}.${host}&> /dev/null && result=1 || result=0
  case "$result" in
  "1")
  echo "Server ${network}.${host} is UP."
  ;;
  "0")
  echo "Server ${network}.${host} is DOWN."
  ;;
  esac
  done
  -----------------------
  实例2:
  让用户输入某个文件名,找出该目录内的文件名的权限
  # vi sh21.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  read -p "Please input a directory:" dir
  if[ "$dir" == "" -o ! -d "$dir" ];then
  echo "The $dir is NOT exist in your systemn."
  exit 1
  fi
  filelist=$(ls $dir)
  for filename in $filelist
  do
  perm=""
  test -r "$dir/$filemane" && perm="$perm readable"
  test -w "$dir/$filename" && perm="$perm writable"
  test -x "$dir/$filename" && perm="$perm executable"
  echo "The file $dir/$filename's permission is ${perm}."
  done
  -----------------------
  # vi sh22.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  read -p "Please input a number,I will count for 1+2+..+{your_input}:" nu
  s=0
  for((i=1;i $s"
  ----------------------
  debug
  # sh -x sh22.sh
  习题
  建立一个script,当你执行script时,该script可以显示:
  1.你目前的身份(whoami)
  2.你锁在目录
  # vi test01.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  echo -e "Your name is $(whoami)"
  echo -e "The current directory is $(pwd)"
  ---------------------
  让用户输入一个数字,程序可以由1+2+3+....一直累加到用户输入的数字为止
  # vi test02.sh
  ---------------------
  #!/bin/bash
  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
  export PATH
  read -p "Please input a number,I will count for 1+2+...+{your_input}:" nu
  s=0
  for (( i=1;i

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-553625-1-1.html 上篇帖子: linux的shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量 下篇帖子: 父shell和子shell 变量问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表