zoukankan      html  css  js  c++  java
  • shell笔记

    本笔记主要是记录一些shell中使用的重要知识点,方便以后查询。

    1. 关于编写shell脚本的良好习惯

    --列出脚本的功能

    --列出脚本的版本资讯

    --列出脚本的作者和联系方式

    --列出脚本的修改记录

    --提前设置环境变量

    --在特殊的代码位置,加上注释,方便别人查看

    注意:以上建议只是参考了别人的说法,具体使用与否请根据实际情况而定。

    2. 利用read命令获取用户的输入信息

    1 read -p "请输入一个值:" var
    2 
    3 echo $var

    使用者输入的信息将会保存到变量var中。

    3. 利用date命令获取日期

    1 date1=$(date --date='2 days ago' +%Y%m%d)  # 前两天的日期
    2 date2=$(date --date='1 days ago' +%Y%m%d)  # 前一天的日期
    3 date3=$(date +%Y%m%d)                      # 今天的日期

    4. 在shell中做数学计算

    1 read -p "first number:  " firstnu
    2 read -p "second number: " secnu
    3 total=$(($firstnu*$secnu))             # 注意是两个括号
    4 echo $total

    还有一种方式,如下:

    1 declare -i total=$firstnu*$secnu
    2 echo $total

    但推荐第一种方式,$(( ))。

    5.  使用test命令做判断

    使用格式:test -option filename

     1 判断用户是否输入信息,-z用于判断字符串的长度是否为0:
     2 read -p "Input a filename : " filename
     3 test -z $filename && echo "You MUST input a filename." && exit 0
     4 
     5 判断文件是否存在:
     6 test ! -e $filename && echo "The filename '$filename' DO NOT exist" && exit 0
     7 
     8 判断文件的类型和权限(对于当前用户的权限)
     9 test -f $filename && filetype="regulare file"
    10 test -d $filename && filetype="directory"
    11 test -r $filename && perm="readable"
    12 test -w $filename && perm="$perm writable"
    13 test -x $filename && perm="$perm executable"

    6. 使用中括号[]做判断

    1 read -p "Please input (Y/N): " yn
    2 [ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK, continue" && exit 0
    3 [ "$yn" == "N" -o "$yn" == "n" ] && echo "Oh, interrupt!" && exit 0
    4 
    5 这里的-o表示或的意思。

    7. 关于脚本参数

     1 echo "The script name is        ==> $0"
     2 echo "Total parameter number is ==> $#"
     3 [ "$#" -lt 2 ] && echo "The number of parameter is less than 2.  Stop here." && exit 0
    4 5 echo "Your whole parameter is ==> '$@'" 6 echo "The 1st parameter ==> $1" 7 echo "The 2nd parameter ==> $2" 8 9 执行结果: 10 [root@www scripts]# sh sh07.sh theone haha quot 11 The script name is ==> sh07.sh <==档名 12 Total parameter number is ==> 3 <==果然有三个参数 13 14 Your whole parameter is ==> 'theone haha quot' <==参数的内容全部 15 The 1st parameter ==> theone <==第一个参数 16 The 2nd parameter ==> haha <==第二个参数
     1 关于shift命令的作用,主要是移除脚本的参数:
     2 echo "Total parameter number is ==> $#"
     3 echo "Your whole parameter is   ==> '$@'"
     4 
     5 shift   # 进行第一次‘一个参数的 shift 6 
     7 echo "Total parameter number is ==> $#"
     8 echo "Your whole parameter is   ==> '$@'"
     9 
    10 shift 3 # 进行第二次‘三个参数的 shift11 
    12 echo "Total parameter number is ==> $#"
    13 echo "Your whole parameter is   ==> '$@'"

    8. 条件判断

     1 read -p "Please input (Y/N): " yn
     2 
     3 if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
     4     echo "OK, continue"
     5     exit 0
     6 fi
     7 if [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
     8     echo "Oh, interrupt!"
     9     exit 0
    10 fi

    多重复杂的条件判断:

    1 read -p "Please input (Y/N): " yn
    2 
    3 if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then
    4     echo "OK, continue"
    5 elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then
    6     echo "Oh, interrupt!"
    7 else
    8     echo "I don't know what your choice is"
    9 fi

    参数的内容判断:

    1 if [ "$1" == "hello" ]; then
    2     echo "Hello, how are you ?"
    3 elif [ "$1" == "" ]; then
    4     echo "You MUST input parameters, ex> {$0 someword}"
    5 else
    6     echo "The only parameter is 'hello', ex> {$0 hello}"
    7 fi

    关于网络服务检测:

    1 testing=$(netstat -tuln | grep ":80 ")   # 查看 port 80 在否?
    2 
    3 if [ "$testing" != "" ]; then
    4     echo "WWW is running in your system."
    5 fi
    6 testing=$(netstat -tuln | grep ":22 ")   # 查看 port 22 在否?
    7 if [ "$testing" != "" ]; then
    8     echo "SSH is running in your system."
    9 fi

    综合使用:

    1 read -p "Please input your demobilization date (YYYYMMDD ex>20090401): " date2
    2 
    3 
    4 # 2. 测试一下,这个输入的内容是否正确?利用正规表示法啰~
    5 date_d=$(echo $date2 |grep '[0-9]{8}')   # 看看是否有八个数字
    6 if [ "$date_d" == "" ]; then
    7     echo "You input the wrong date format...."
    8     exit 1
    9 fi

    9. case语句

     1 case $1 in                             # 现在使用,可以用上面两行替换!
     2   "one")
     3     echo "Your choice is ONE"
     4     ;;
     5   "two")
     6     echo "Your choice is TWO"
     7     ;;
     8   "three")
     9     echo "Your choice is THREE"
    10     ;;
    11   *)
    12     echo "Usage $0 {one|two|three}"
    13     ;;
    14 esac

    10. 在case中使用函数

     1 function printit(){
     2     echo -n "Your choice is "     # 加上 -n 可以不断行继续在同一行显示
     3 }
     4 
     5 echo "This program will print your selection !"
     6 case $1 in
     7   "one")
     8     printit; echo $1 | tr 'a-z' 'A-Z'  # 将参数做大小写转换!
     9     ;;
    10 
    11   "two")
    12     printit; echo $1 | tr 'a-z' 'A-Z'
    13     ;;
    14 
    15   "three")
    16     printit; echo $1 | tr 'a-z' 'A-Z'
    17     ;;
    18 
    19   *)
    20     echo "Usage $0 {one|two|three}"
    21     ;;
    22 esac

    11. 区分脚本的参数和函数的参数

     1 function printit(){
     2     echo "Your choice is $1" 3 }
     4 
     5 # 这里的$1是脚本的参数
     6 case $1 in
     7   "one")
     8     printit 1  # 请注意,这里的1会当作函数的参数使用
     9 
    10     ;;
    11   "two")
    12     printit 2
    13     ;;
    14   "three")
    15     printit 3
    16     ;;
    17   *)
    18     echo "Usage $0 {one|two|three}"
    19     ;;
    20 esac

    12. while循环

    当条件为真时,才执行循环。

    1 s=0  # 这是加总的数值变数
    2 i=0  # 这是累计的数值,亦即是 1, 2, 3....
    3 while [ "$i" != "100" ]
    4 do
    5     i=$(($i+1))   # 每次 i 都会增加 1 
    6     s=$(($s+$i))  # 每次都会加总一次!
    7 
    8 done

    13. until循环

    当条件成立时,循环停止。

    1 until [ "$yn" == "yes" -o "$yn" == "YES" ]
    2 do
    3     read -p "Please input yes/YES to stop this program: " yn
    4 done

    14. for循环

    1 for animal in dog cat elephant
    2 do
    3     echo "There are ${animal}s.... "
    4 done
    1 users=$(cut -d ':' -f1 /etc/passwd)  # 撷取帐号名称
    2 for username in $users               # 开始回圈进行!
    3 do
    4         id $username
    5         finger $username
    6 done
     1 network="192.168.1"     
     2 for sitenu in $(seq 1 100)
     3 do
     4     # 底下的程式在取得 ping 的回传值是正确的还是失败的!
     5     ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1
     6 
     7     # 开始显示结果是正确的启动 (UP) 还是错误的没有连通 (DOWN)
     8     if [ "$result" == 0 ]; then
     9         echo "Server ${network}.${sitenu} is UP."
    10     else
    11         echo "Server ${network}.${sitenu} is DOWN."
    12     fi
    13 done

    扫描目录下的文件:

     1 read -p "Please input a directory: " dir
     2 if [ "$dir" == "" -o ! -d "$dir" ]; then
     3     echo "The $dir is NOT exist in your system."
     4     exit 1
     5 fi
     6 
     7 filelist=$(ls $dir)        # 列出所有在该目录下的档案名称
     8 
     9 for filename in $filelist
    10 do
    11     perm=""
    12     test -r "$dir/$filename" && perm="$perm readable"
    13     test -w "$dir/$filename" && perm="$perm writable"
    14     test -x "$dir/$filename" && perm="$perm executable"
    15     echo "The file $dir/$filename's permission is $perm "
    16 done
    1 for (( i=1; i<=$nu; i=i+1 ))
    2 do
    3     s=$(($s+$i))
    4 done

    15. 脚本的语法检查和调试

    1 语法检查
    2 # sh -n script
    3 
    4 调试
    5 # sh -x script

    脚本中的常用格式是:

    1. 变量设定

    2. 函数定义

    3. case ... esac语句使用

    4. RETVAL变量

  • 相关阅读:
    [Spring框架]Spring 事务管理基础入门总结.
    [Maven]Eclipse插件之Maven配置及问题解析.
    编程哲学的几点感悟
    用ASP.NET Core MVC 和 EF Core 构建Web应用 (十)
    用ASP.NET Core MVC 和 EF Core 构建Web应用 (九)
    C# 中的特性 Attribute
    用ASP.NET Core MVC 和 EF Core 构建Web应用 (八)
    用ASP.NET Core MVC 和 EF Core 构建Web应用 (七)
    C# 调用 WebApi
    用ASP.NET Core MVC 和 EF Core 构建Web应用 (六)
  • 原文地址:https://www.cnblogs.com/t-road/p/6729135.html
Copyright © 2011-2022 走看看