Ubuntu Shell基础

0. 怎样编写Shell脚本

# 1.编写脚本
vi showHello.sh
> #!/bin/sh
> #showHello.sh
> #To show hello to somebody
> echo -n “Enter Your Name:”
> read NAME
> echo “Hello,$NAME!> :wq
# 2. 为脚本添加可执行权限
chmod u+x ShowHello.sh
# 3. 运行脚本
./showHello.sh

1. Shell编程之变量篇

  • 变量可以定制用户本身的工作环境,使用变量可以保存有用信息,使系统获知用户相关设置,也用于保存暂时信息。
  • 变量一般都用大写字母表示
  • 使用 echo命令可以显示单个变量的取值,要在变量名前面加$符号, eg. echo $NAME.
  • 如果设置变量时,不想再改变其值,可以将其设置为只读,只要在变量名前加readonly
  • 使用set命令可以显示所有本地定义的shell变量
  • 使用unset 变量名可以清除对变量的定义

shell 变量通常分为以下几种类型

2. Shell编程之条件测试篇

  1. 文件状态测试

    -d 目录 -r 可读
    -f 常规文件 -w 可写
    -L 符号连接 -x 可执行
    -s 文件长度大于0,非空 -u 文件有suid位设置

    示例: [ -s haison.c ] 0表示成功,其他为失败,下同。

  2. 逻辑操作

    • -a 逻辑与(and),操作符两边均为真,结果为真,否则为假。
    • -o 逻辑或(or),操作符两边一边为真,结果为真,否则为假。
    • ! 逻辑否,条件为假,结果为真,反之。

    示例: [ -r haison.c –a –w hai.c ]

  3. 字符串测试

    = 两个字符串相等 -z 空串
    != 两个字符串不相等 -n 非空串

    示例:[ -z $SHELL ]

  4. 数值测试

    -eq 数值相等(equalto) -lt 第一个数小于第二个数(less than)
    -ne 数值不相等(notequal to) -le 第一个数小于等于第二个数
    -gt 第一个数大于第二个数(greaterthan) -ge 第一个数大于等于第二个数

    示例:[ “10” -eq “12” ]

3. Shell编程之控制结构篇

  1. 选择结构
    • if 语句:if then else 提供条件测试
    • case 语句:允许匹配模式、单词或值
  2. 循环结构
    • for语句:每次依次处理列表内的信息,直至循环耗尽。
    • until语句:不常用。条件在循环末尾,至少执行一次。
    • while语句:条件在循环头部
  1. if 语句

    # 格式1
        if  [ 条件 ]
        then
          命令1
          命令2
        fi   
    # 格式2
        if  [ 条件 ] ; then命令
        fi   
    # 格式3
        if  [ 条件 ]
        then
          命令1
        else
          命令2
        fi   
    # 格式4
        if  [ 条件1 ]
        then
          命令1
        elif [ 条件2 ]
        then  
          命令2
        else 
          命令3
        fi   
    
    示例
    #!/bin/sh
    #ifTest
    #to show the method of if 
    echo -e "Enter the first integer:\c"
    read FIRST
    echo -n "Enter the second integer:"
    read SECOND
    if [ "$FIRST" -gt "$SECOND" ]
        then 
           echo "$FIRST is greater than $SECOND"
        elif [ "$FIRST" -gt "$SECOND" ]
    then 
        echo "$FIRST is less than $SECOND" 
    else
        echo "$FIRST is equal to $SECOND" 
    fi
    
  2. case语句

    格式

    case 值 in

    模式1)

    ​ command1

    ​ command2

    ​ …

    ​ commandN

    ​ ;;

    模式2)

    ​ command1

    ​ command2

    ​ ;;

    esac

    取值后面必须为单词in,每一个模式必须以右括号结束。取值可以为变量或常数。取值检测匹配的每一个模式,一旦模式匹配,其间所有命令开始执行直至;;。执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用*号捕获该值,再接受其他输入。

    #!/bin/sh
    #caseTest
    #to  test the method of case
    #USER=`whoami`
    echo 'Please input your name:'
    read USER
    case $USER in
    	root) echo “You can do all the operations”
    	;;  
    	zhen) echo "You can do some operations”         
    	;;        
    	*) echo "Sorry,you can not do anything"      
    	;;
    esac 
    
  3. for 循环

    # 格式 1
    for var in item1 item2 ... itemN
    do
        command1
        command2
        ...
        commandN
    done
    # 格式 2
    for var in item1 item2 ... itemN; do command1; command2… done;
    

    当变量值在列表里,for循环即执行一次所有命令,使用变量名访问列表中取值。命令可为任何有效的shell命令和语句。in列表可以包含替换、字符串和文件名。

    嵌套循环可以将一个for循环嵌在另一个for循环里

    #!/bin/sh
    #forTest
    #to test the method of for
    COUNTER=0
    for FILES in *
    do  
         COUNTER=`expr $COUNTER + 1`
    done  
    echo "There are $COUNTER files in `pwd` "
    
  4. until循环

    # 格式
    until condition
    do
        command
    done
    

    until循环执行一系列命令直至条件为真时停止。until循环与while循环在处理方式上刚好相反。

    一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。

    #!/bin/sh
    #untilTest
    #to test the mothod of until
    IS_ROOT=`who|grep root`
    until [ "IS_ROOT" ]
    do  
        IS_ROOT=`who|grep root`    
        sleep 5
    done
    echo "Watch it.root in!"
    

  5. while循环

    while condition
    do
        command
    done
    

    While循环用于不断执行一系列命令,也用于从输入文件中读取数据。虽然通常只有一个命令,但在while和do之间可以放几个命令。命令通常用作测试条件,只有当命令的退出状态为0时,do和done之间命令才被执行,如果退出状态不是0,则循环终止。

    #!/bin/sh
    #whileTest
    #to test the method of while 
    
    COUNTER=0
    while [ $COUNTER  -lt 10 ]
    do
       echo $COUNTER
       COUNTER=`expr $COUNTER + 1`
    done
    
    while read LINE
    do
      echo $LINE
    done < names.txt
    

4. Shell编程之函数篇

Syntax格式: 函数名 () { ​ 命令 }

示例1
#!/bin/sh
#funTest
#to test the function
DATE=`date`
Hello()
{
  echo “Hello,today is $DATE}
echo "---- run start ----"
Hello
echo "---- run finish ----"

5. 简单实例

References

[1]. http://www.runoob.com/linux/linux-shell.html

[2]. http://www.jianshu.com/p/e1c8e5bfa45e

[3]. https://www.cnblogs.com/cosiray/archive/2012/03/02/2377099.html

Table of Contents