Shell编程

、Shell编程

1、系统内核与Shell
·shell编程提供的是用户与操作系统kernal沟通的桥梁(广义的shell)
·shell是对kernal-API的包装,通过shell可以调用一切系统底层的功能
·图形用户界面也是一个shell应用程序
·Terminal也是一个shell应用程序(狭义的shell)
·shell脚本程序则是指系统自带的或自定义的运行在Terminal终端的程序,通常代码量不大
·运行在狭义shell(即终端)上的程序称为shell小程序,所使用的开发语言,即shell语言
·bash是最流行的shell脚本解释器,其它著名的解释器还有sh、zsh等
·扩展名是什么都行,文件是否可执行取决于【权限、内容、解释器】而非扩展名
2、编写Shell脚本
2.1 变量

整型、浮点型

字符串

拼接
"i am $name!"
"i am ${name}!"
长度
${#name}
切片
${name:0:3}
检索
index $name abc
注意:下标从1开始
2.2 数组
定义数组
arr=(a b c d)
arr[0]=a;arr[1]=b;arr[2]=c

访问元素
  - ${arr[0]}
长度
全部元素长度:${#arr[*]}
全部元素长度:${#arr[@]}
单个元素长度:${#arr[0]}
2.3 环境变量
  • 定义位置和作用范围
    • 个别用户:家目录/.bashrc
    • 全体用户:/etc/profile (访问前需要先source /etc/profile)
    • 进程内有效:用户自定义的脚本中
  • 定义环境变量:export MYNAME=”sname”
  • 追加环境变量:export PATH=$PATH:”/home/sname/Desktop/”
  • 使修改生效:source filename或reboot
  • 不管环境变量定义在哪个文件中,只要进程或用户有source 它的权限,就能先source然后访问它的值

函数与参数

  • 定义函数:funcname(){…}
  • 调用函数:funcname
  • 调用函数:funcname arg1 arg2 …
  • $0 文件名
  • 1, 1 , 2,$3… 传入的参数
  • $# 参数长度
  • $* 大参数串
  • $@ 大参数数组
2.4 输入输出
read
 read x;echo $x
 read -p "input your pwd:" -s password    -p(prompt)
 在终端输出提示,-s(silent)安静模式终端不显示输入的字符
echo
 echo "$a and text"
 echo "expr ... and text"
 echo content >> filename
 echo -n "请输入你的名字:"    不换行输出
printf
  printf "%d,%s,%10.2f" a b c
  printf "%-d,%-s,%-10.2f" a b c    使用右对齐
  printf "www.baidu.com\n"
2.5 运算符

算数运算符

  • + - * / %

逻辑运算符

&&
||
!

关系运算符

-gt,-ge
-lt,-le
-eq,-ne

字符串运算符

[[ a = b ]]
[[ a != b ]]
[[ -z mstr ]]    判断字符串长度是否为0
[[ -n mstr ]]    判断字符串长度是否不为0
[[ mstr ]]   判断字符串是否存在

文件运算符

-d filename    判断是否文件夹
-f filename    判断是否普通文件(数据文件)
-r filename   判断是否可读
-w filename    判断是否可写
-x filename    判断是否可执行
-e filename    判断文件是否存在
2.7 程序关键字
unset a    释放变量
readonly a    将a设置为只读
let
- let c=$a+$b
- let "a++"
- let "a+=2"

expr
- a=`expr $a - 1`
2.8流程控制
if
 if [[ ... ]];then ...;fi
 if [[ ... ]];then ...;else ...;fi
 if [[ ... ]];then ...;elif [[ ... ]];then ...;else ...;fi
for
 for i in 1 2 3    do    ...    done
 for (( i=1;i<10;i++ ))
while
 while [[ $mint<=10 ]]    do    ...    done
 while read value    do    ...    done
 while true    do    ...    done
until
 until [[ $a -lt 1 ]]    do    ...    done
case
 case $level in  A)  echo "very good" ;; B) echo "not bad"     ;; C) 
 echo "work harder"     ;; esac
break,continue
2.9 脚本依赖
  • source ./01hello.sh
3.0 案例
  • 问候命令 hello

    
    #!/bin/bash
    
    
    #↑声明shell解释器位置
    
    
    word="Hello Shell"
    echo $word
  • 数学计算命令 calc

    
    #!/bin/bash
    
    
    # calc --add 3 4 执行结果为7
    
    
    
    #第一个参数为--add时,做加法
    
    if [[ $1 = "--add" ]];then
    echo --add
    echo $(($2+$3))
    
    
    #第一个参数为--sub时,做减法
    
    elif [[ $1 = "--sub" ]];then
    echo --sub
    echo $(($2-$3))
    
    
    #第一个参数为--mul时,做乘法
    
    elif [[ $1 = "--mul" ]];then
    echo --mul
    echo $(($2*$3))
    
    
    #第一个参数为--div时,做除法
    
    elif [[ $1 = "--div" ]];then
    echo --div
    echo $(($2/$3))
    
    
    #第一个参数为--div时,做求余
    
    elif [[ $1 = "--mod" ]];then
    echo --mod
    echo $(($2%$3))
    
    
    #第一个参数为其它时,提示错误
    
    else
    echo $1
    echo fuck off,不支持的操作符
    fi
  • 显示文件信息 fileinfo

    
    #!/bin/bash
    
    
    #fileinfo ~/hello 显示该文件的权限和内容
    
    
    fileinfo(){
    
    
      # 如果文件不存在,报错退出
      if [[ ! -e $1 ]];then
          echo "$1 doesn't exist!"
          return 0
      fi
    
      echo $1:
    
      #判断和输出文件的读写执行权限
      if [[ -r $1 ]];then
          echo -n "readable,"
      else
          echo -n "NOT-readble,"
      fi
    
      if [[ -w $1 ]];then
          echo -n "writable,"
      else
          echo -n "NOT-writable,"
      fi
    
      if [[ -x $1 ]];then
          echo "executable"
      else
          echo "NOT-executable"
      fi
    
      #通过Linux的标准命令,输出文件内容
      echo -e "\ncontents":
      echo ====================
      cat $1
      echo ====================
    }
    
    
    # 调用函数,传入文件位置参数
    
    fileinfo $1

  • 拷贝内容 mycp

    
    #!/bin/bash
    
    
    #用户通过mcp srcfile dstfile实现拷贝
    
    
    #通过mcp -a srcfile dstfile实现追加
    
    
    #拷贝完成后询问用户是否立即查看
    
    
    docp(){
    
    
    #判断是新建还是追加
    
    append=0
    if [[ $1 = "-a" ]];then
      append=1
      srcfile=$2
      dstfile=$3
    else
      append=0
      srcfile=$1
      dstfile=$2
    fi
    echo "srcfile:$srcfile,dstfile:$dstfile"
    
    
    #判断源文件是否存在
    
    if [[ ! -e $srcfile ]];then
      echo "stupid! souce file does not exist!"
      return 0
    fi
    
    
    #如果目标文件不存在则创建
    
    if [[ ! -e $dstfile ]];then
      touch $dstfile
    fi
    
    
    #写入文件
    
    if [[ $append -eq 1 ]];then
      cat < $srcfile >> $dstfile
    else
      cat < $srcfile > $dstfile
    fi
    
    
    #询问用户是否要查看目标文件
    
    echo -n "$srcfile written to $dstfile successfully! read it now?[y/n]:"
    read temp
    if [[ $temp = 'y' ]];then
      echo "content:"
      echo ====================
      cat < $dstfile
      echo ====================
    fi
    
    }
    
    
    #调用函数,传入参数
    
    docp $1 $2 $3
  • 猜数字游戏 guessnum

#!/bin/bash

#生成随机数,此处的rand命令需要安装一下
answer=`rand --max 1000`
#answer=$(cat /dev/urandom | head -n 10 | cksum | awk -F ' ' '{print $1}')
#answer=$(($answer%1000))
echo $answer

while true
do
    #提示用户输入
    echo -n "please enter a num between 0~1000:"
    read guess

    #看答案
    if [[ $guess = "drop it" ]];then
        echo "the answer is:$answer"
        break
    fi

    #对比
    if [[ $guess -eq $answer ]];then
        echo "bingo!the answer is:$answer"
        break
    elif [[ $guess -gt $answer ]];then
        echo "too big!"
    else    
        echo "too small!"       
    fi
done

echo "GAME OVER!"

转载自:https://blog.csdn.net/u010986776/article/details/79911659

posted @ 2018-05-21 21:04  轻松学编程  阅读(79)  评论(0编辑  收藏  举报