zoukankan      html  css  js  c++  java
  • 【linux之shell脚本】

    一、简介

    机器语言
    汇编语言
    高级语言
    面向过程 C Shell Perl
    面向对象 java python c++

    强语言:先编译再执行 java c++
    弱语言:边编译边执行 shell python php

    魔数(magic number)
    shebang 程序入口 必须放在第一行
    #!/bin/bash
    #
    echo "hello,world."

    写完一个脚本,如何执行获得结果?
    ①bash Script-file
    ②source Script-file = . Sicript-filecript-file
    ③chmod +x Script-file; ./Script-file

    bash -x 看脚本执行的过程

    二、变量

    1、定义:

    变量名=变量值
    在内存中申请一个空间,取名叫“变量名”;然后将变量值存入该内存空间
    一般情况下,一个变量只能存储一个变量值

    2、分类

    根据使用的范围,可以分为:
    环境变量:能够在当前shell及其子shell中生效的变量
    本地变量:只能在当前shell中生效的变量
    局部变量:只能在当前的程序段中生效的变量
    位置变量:$0, $1, $2, ...
    特殊变量:$?, $$, $*, ...

    定义环境变量:
    1.export 变量名=变量值
    2.declare -x 变量名=变量值
    3.变量名=变量值 export 变量名

    定义本地变量:
    变量名=变量值

    定义局部变量:
    local 变量名=变量值

    4、获得变量值的方法

    echo ${变量名}

    ANIMAL=pig

    there are 3 ${ANIMAL}s

    3、变量名的命名规则

    1.只能是字母或下划线开头,并且整个名字只能包括字母、数字、下划线
    2.变量名严格区分大小写
    3.新设置的变量名不要跟已经存在并生效的变量名重复
    4.定义新的变量名的时候,最好做到见名知义

    4、位置变量

    $1,$2,$3,...

    shift 
    与位置有关的几个特殊变量
    $#:参数总数
    $*,$@:列表显示所有参数 

    三、测试语句test

    • 条件测试语句

    test Condition
    [ Condition ]
    [[ Condition ]]

    • 整数测试

    -eq:等于
    -ge:大于等于
    -gt:大于
    -le:小于等于
    -lt:小于
    -ne:不等于

    • 字符串测试

    -n 不为空
    -z 为空
    =、==:字符串的内容是否相同
    !=:字符串的内容是否不同

    [ $A != $B ]

    • 文件状态测试

    -d:测试指定的文件是否为目录
    -e:测试指定的文件是否存在
    -f:测试指定的文件是否为普通文件
    -r:测试指定的文件对于当前用户是否有读权限
    -w:测试指定的文件对于当前用户是否有写权限
    -x:测试指定的文件对于当前用户是否有执行权限

    四、算术运算

    shell中的算术运算 + - * / %(模运算)
    A=2
    B=3

    1.let C=$A+$B
    echo $C
    
    2.C=$[$A+$B] C=$[$A**$B] 2的三次方
    
    3.C=$(($A+$B))
    
    4.C=`expr $A + $B`

    自身加一
    let A++
    let A+=1

     

    四、脚本的控制结构

    顺序结构:shell脚本执行的默认结构
    分支机构:也叫条件选择结构,只有符合条件的命令才会被执行
    循环结构:在符合条件的情况下重复执行某些命令

    • if条件分支结构

    1.单分支结构(只处理条件为真的时候的命令语句)
    if condition;
    then
    statement1
    ......
    fi


    2.双分支结构(不管条件为真为假,都有命令要被处理)
    if condition;then
    statement1
    ......
    else
    statement1
    fi


    3.多分支结构
    if condition;then
    statement1
    ......
    elif condition2;then
    statement2
    ......
    else
    statement1
    fi

    exit #
    在执行脚本的过程中遇到exit命令,不再执行后面的其他命令,直接推出脚本。在退出脚本之后,返回执行状态返回值为#。0~127(3~126 )

    • 循环结构

    1.for循环:
    for 变量名 in 变量值列表;do
    循环体(一组重复执行的语句)
    done

    • 变量值列表

      1.一组整数:
        ①{1..100} 从1到100
        ②seq 1 100  从1到100
        ③seq 1 2 10  # 1 3 5 7 9
      2.`cut -d: -f 1 /etc/passwd    
    
    SUM=0  
    for I in {1..100};do 
     let SUM+=$I
    done
    echo #SUM
    
    for ((I=1;I<100;I+=1));do
    • case

    case 变量值 in 
    Condition1)
      statment1
      ...
      ;;
    Condition2)
      statment2
      ...
      ;;
    ConditionN|ConditionN+1)
      statmentN
      ...
      ;;
    *)
      statment
      ...
      ;;
    esac
    显示用户信息,printuser root 1
    vim printuser
    #!/bin/bash
    #
    case $2 in 
    1)
      echo `grep "^$1>" /etc/passwd | cut -d: -f$2` ;;
    2)
      echo `grep "^$1>" /etc/passwd | cut -d: -f$2` ;;
    3)
      echo `grep "^$1>" /etc/passwd | cut -d: -f$2` ;;
    4)
      echo `grep "^$1>" /etc/passwd | cut -d: -f$2` ;;
    5)
      echo `grep "^$1>" /etc/passwd | cut -d: -f$2` ;;
    6)
      echo `grep "^$1>" /etc/passwd | cut -d: -f$2` ;;
    7)
      echo `grep "^$1>" /etc/passwd | cut -d: -f$2` ;;
    *)
      echo "Usage: `basename $0` Username {1-7}"
      ;;
    esac
    服务启动脚本
    service.sh  {start|stop|restart|status}
    vim service.sh
    #!/bin/bash
    # 
    case $1 in 
    start)
      echo "starting service ..." ;;
    stop)
      echo "stopping service ..." ;;
    restart)
      echo "Before starting, we must stop it."  ;;
    status)
      echo "service is running ..." ;;
    *)
      echo "`basename $0` {start|stop|restart|status}" ;;
    esac

    循环

    while CONDITION;do   如果条件为真就执行循环体                             当
      循环体                                                                 
    done
    当CONDITION为真的时候,执行循环体中的语句,否则退出循环
    
    until CONDITION;do                                                       直到
     循环体
    done
    当CONDITION为假的时候,执行循环体中的语句,否则退出循环
    
    死循环
    while : ;do
      循环体
    done 
    
    循环嵌套
    
    
    continue
      立刻结束本次循环,进入下一次循环
    break
      循环体的执行会强行中断,退出循环,继续执行脚本其他命令
      
      [ $SUM -gt 10000 ] && break
      
    I=0
    while read LINE;do
      USERID=`echo $LINE | cut -d : -f 3`
      [ $UERID -lt 50 -a $USERID -gt 100 ] && continue 
      echo $LINE && let I++
      [ $I -eq 6 ] && break
    done < /etc/passwd
    
    
    I=0  
    USERLIST=`sort -n -t ":" -k 3 /etc/passwd
    for j in $USERLIST;do
    USERID=`echo $j | cut -d : -f 3`
    [ $UERID -lt 50 -a $USERID -gt 100 ] && continue 
    echo $j && let I++
    [ $I -eq 6 ] && exit 0
    done
  • 相关阅读:
    短期阅读的书籍
    Expert .NET 2.0 IL Assembler 译者序
    Prism研究(for WPF & Silverlight)4.从Hello World开始(实战篇)
    (翻译) 《C# to IL》第一章 IL入门
    不申请连任MVP了,把机会留给新人吧!
    (翻译) 《C# to IL》第三章 选择和循环
    Prism研究(for WPF & Silverlight) 13
    (翻译) 《C# to IL》第二章 IL基础
    Resharper使用体会及一些资料
    推荐一个PD Report Model
  • 原文地址:https://www.cnblogs.com/smallmars/p/8461505.html
Copyright © 2011-2022 走看看