ningleesherry 发表于 2018-8-19 07:20:03

[SHELL]shell scripts笔记(1)

  自己没事总结了点基础的东西,以备不时之需。
  一.判断式:
  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]
查看完整版本: [SHELL]shell scripts笔记(1)