shell 学习笔记3

发布时间:2019-07-05 09:51:46编辑:auto阅读(1703)

    ####shell结构
    #!指定执行脚本的shell
    #注释行
    命令和控制结构
     第一步:创建一个包含命令和控制结构的文件
     第二步:修改这个文件的权限使它可以执行,chmod u+x
     第三步:执行./example(或sh example,使用此方式执行时加-x,可以看到执行过程)

    #!/bin/bash  指定执行脚本的shell程序
    #This is to show  描述
    echo "Our first example shell"    命令……
    echo #This inserts an empty line in output.
    echo "We are currently in the following directory"
    /bin/pwd
    echo
    echo "This directory contains the following files"
    /bin/ls

    ####example.sh
    #!/bin/bash     执行脚本的shell
    #auto mail for system info 描述
    /bin/date +%F >> /tmp/sysinfo 获取日期
    echo "disk info:" >> /tmp/sysinfo 
    /bin/df -h >> /tmp/sysinfo 获取硬盘信息
    echo >> /tmp/sysinfo  打印空行
    echo "online users:" >> /tmp/sysinfo
    /usr/bin/who | /bin/grep -v root >> /tmp/sysinfo 获取在线用户(不包令root)
    echo >> /tmp/sysinfo
    echo "memory info:" >> /tmp/sysinfo 获取内存信息
    /usr/bin/free -m >> /tmp/sysinfo
    echo >> /tmp/sysinfo
    #write root
    /usr/bin/write root < /tmp/sysinfo && /bin/rm /tmp/sysinfo
    # crontab -e
    # 0 9 * * 1-5 script  计划任务(每天早上9:00)

    ####shell变量
     以字母或下划线开头,一般变量名为大写字母。
     #位置变量:
     ls -l file1 file2 file3
     $0  指命令本身
     $1  file1
     $2  file2
     ……
     $n
     ##特殊变量
     $* 这个程序的所有参数
     $# 这个程序的参数个数
     $$ 这个程序的pid
     $! 执行上一个后台命令的pid
     $? 执行上一个命令的返回值。
      ##examle
       #!/bin/bash
      #test special varibale
      echo '$# is :' $#
      echo '$* is :' $*
      echo '$? is :' $?
      echo '$$ is :' $$
      echo '$0 is :' $0
     sh example.sh file1 file2 file3 file4
     
     ##返回结果
     $# is : 4
     $* is : file1 file2 file3 file4
     $? is : 0
     $$ is : 17379
     $0 is : example

    ####shell命令
     read:从键盘读入数据,赋值给变量
      #example
       #!/bin/sh
       read first second third
       echo "the first parameter is $first"
       echo "the second parameter is $second"
       echo "the third parameter is $third"
     expr:对整数型变量进行算术运算,小数点后省略。
      #example
       expr 3 + 5
       expr $var - 5
        expr $var1 / $var2
       expr $var3 \*10
      #example2
       #!/bin/bash
        a=10 b=30 c=30
        value1=`expr $a + $b + $c`
     test:变量测试语句,用于测试变量是否相等,是否为空,文件类型等
      test 测试条件
       #example
        test str1=str2
        test strl!=str2
        test -n str1 是否为空
       test -d file    是否为目录
       test -x file 是否可执行

       #example2
        if test -d $1 then
         ……
        fi
       test -d $1 ==== [-d $1]
       #example3
       #检测web服务是否启动。
        #!/bin/bash
         web=`/usr/bin/pgrep httpd`
         if [ $web != ""]
         then
          echo "The web service is running"
         else
          echo "The web serviec in not running"
                 /etc/init.d/httpd start
       ##if多条件判断结构  fi
      
        if  条件1 then
            命令1
       elif 条件2 then
            命令2
       else
            命令3
       fi
        #!/bin/bash
         echo "please input a file name:"
         read file_name
         if [ -d $file_name ]
         then
          echo "$file_name is a directory"
         elif [ -f $file_name ]
         then
          echo "$file_name is a common file"
         elif [ -c -o -b $file_name ]
         then
          echo "$file_name is a device file"
         else
          echo "$file_name is an unknow file"
         fi
        -a 并且  -o  或
       ##example
        #!/bin/bash
         if [$# -ne 2 ]; then
          echo "Not enough parameters"
          exit 0
         fi
         if [$1 -eq $2 ]; then
          echo "$1 equals $2"
         elif [ $1 -lt $2 ]; then
          echo "$1 littler than $2"
         elif [ $1 -gt $2 ]; then
          echo "$1 greater than $2"
         fi
      for   done语句
       格式:for 变量 in 名字表
             do
              命令列表
             done
       ##example
        #!/bin/sh
         for DAY in Sunday Monday Tuesday Wednesday Thursday Friday Saturday
         do
          echo "The day is $DAY"
         done
    awk -F 域分隔符 '命令'
     #example1 检测系统中UID为0的用户
      awk -F: '$3==0 {print $1}' /etc/password
     #example2 检测系统中密码为空的用户
      awk -F: 'length($2)==0 {print $1}' /etc/shadow
     #example3
      #!/bin/bash
      echo "Please input the username:"
      read username
      grep $username /etc/passwd > /dev/null 2> /dev/null
      if [ $? -eq 0 ]
      then
       echo "username is : $username"
      else
       echo "user $username does not exist"
       exit 1
      fi
       echo
       #list /etc/passwd info
       userinfo=`grep ^$username:x /etc/passwd`
       userid=`echo $userinfo |awk -F : '{print $3}'`
       groupid=`echo $userinfo |awk -F : '{print $4}'`
       homedir=`echo $userinfo |awk -F : '{print $6}'`
       shell=`echo $userinfo |awk -F : '{print $7}'`
       #get group name from GID
       grouptmpname=`cat /etc/group | grep :x:$groupid`
       groupname=`echo $grouptmpname | awk -F : '{print $1}'`
       echo "user id is : $userid"
       echo "default group is : $groupname"
       echo "home directory is : $homedir"
       echo "shell is : $shell"
       echo "group members info:"
       #get group members
       groups=`groups $username`
       echo $groups
       echo
       #get login info
       userlogin=`who | grep $username`
       if [ "$userlogin" != "" ]
       then
        echo "$username is online"
       else
        echo "$username NOT logged in"
       fi

    ###example for for
     #!/bin/bash
     username=$1
     ps aux |grep $username |awk '{print $2}' > /tmp/temp.pid
     killid=`cat /tmp/temp.pid`
     for pid in $killid
     do
      kill -9 $pid 2> /dev/null
     done
    select 变量 in 关键字
    do
     command 1
     ……
     command 2
    done
     #example
     #!/bin/bash
      echo "What is your favourity OS?"
      select var in "Linux" "Unix" "Windows" "Other"
      do
       break
      done
      echo "You have selected $var"
    ##case
     case ... esac 语句,格式:
      case 变量 in
       字符串1) 命令列表1
        ;;
       ...
       字符串n) 命令列表n
              ;;
      esac
     ##example
      #!/bin/bash
      echo "***************************"
      echo "Please select your operation:"
      echo "Press "C" to Copy"
      echo "Press "D" to Delete"
      echo "Press "B" to Backup"
      echo "***************************"
      read op
      case $op in
       c)
        echo "Your selection is Copy"
        ;;
       D)
        echo "Your selection is Delete"
        ;;
       B)
        echo "Your selection is Backup"
        ;;
       *)
        echo "Invalide selection"
      esac
    while语句,格式:
     while 条件
     do
      命令
     done
     #example
     #!/bin/bash
     num=1
     while [ $num -le 10 ]
     do
      SUM=`expr $num \* $num`
      echo $SUM
      num=`expr $num + 1`
     done

     #example2
     #!/bin/bash
     echo "please input username:"
     read name
     echo "please input number:"
     read num
     n=1
     while [ $n -le $num ]
     do
      useradd $name$n
      n=`expr $n + 1`
     done
     echo "please input the password:"
     read passwd
     m=1
     while [ $m -le $num ]
     do
      echo $passwd |passwd --stdin $name$m
      m=`expr $m + 1`
     done

     

    echo 12345 |passwd --stdin shedon    "12345"为设置的密码  shedon为用户

    until语句,格式:
     until 条件
     do
      命令
     done
     until类似while循环,不同的是until是条件返回值为假时才继续执行。
     #example
      #!/bin/bash
      until [ -x /etc/inittab ]
      do
       /bin/ls -l /etc/inittab
       exit 0
      done
     #example2
     #!/bin/bash
     echo "Press Y/y to stop..."
     read input
     until [ $input = "Y" ] || [ $input = y]
     do
      echo "error input,please try again..."
      read input
     done
     echo "stop here!"

     #########跳出循环:break 和 continue
     break  跳出循环
     continue 跳出本次循环

    shift指令:参数左移,每执行一次,参数向左移一位,$#的值减1,用于分别处理每个参数,移出去的参数不再可用


    ####函数应用
     函数定义:
      函数名()
      {
       命令序列 
      }
     函数的调用:不带()
      函数名 参数1 参数2 ...
    #######函数中的变量:
     均为全局变量,没有局部变量
    #######函数中的参数:调用函数时,可以传递参数,在函数中用$1 $2...来引用

    ###sh -x script
     将执行脚本并显示所有变量值
    ###sh -n script
     不执行脚本只是检查语法模式,将返回所有语法错误。


    ###普通用户脚本执行权限
    sh 执行
    1.普通用户对脚本文件有r权限
    2.对脚本所在目录有rx权限

    脚本直接执行
    1.普通用户对脚本文件有rx权限
    2.对脚本所在目录有rx权限
     

关键字