SHELL基础语法

    • Shell脚本的第一行必须是如下格式:

    v#!/bin/sh

    符号#!用来指定该脚本文件的解析程序。在上面例子中使用/bin/sh来解析该脚本。当编辑好脚本后,如果要执行该脚本,还必须使其具有可执行属性。

    chmod +x filename

    shell编程中,所有的变量都由字符串组成

    并且不需要预先对变量进行声明,s1:

    #!/bin/sh

    #set variable a

    a="hello world"

    # print a

    echo "A is:"

    echo $a

    有时候变量名很容易与其他文字混淆,比如:

    S13:

    num=2

    echo "this is the $numnd“

    这并不会打印出"this is the 2nd",而仅仅打印"thisis the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell们要打印的是num变量:

    num=2

    echo "this is the ${num}nd"

    这将打印:this is the 2nd

    • 默认变量
    • $# :传入脚本的命令行参数个数

    v$* :所有命令行参数值,在各个参数值之间

    留有空格

    v$0 :命令本身(shell文件名)

    v$1 :第一个命令行参数

    v$2 :第二个命令行参数

    S2:

    #!/bin/sh

    echo "number of vars:"$#

    echo "values of vars:"$*

    echo "value of var1:"$1

    echo "value of var2:"$2

    echo "value of var3:"$3

    echo "value of var4:"$4

    运行./s2 1 2 3 4

    输出结果:?

    • 局部变量

    在变量首次被赋值时加上local关键字可以声明一个局部变量,例s3:

    #!/bin/bash

    hello="var1"

    echo $hello

    function func1 {

    local hello ="var2"

    echo $hello

    }

    func1

    echo $hello

    • 变量(注意)

    1.  变量赋值时,“=”左右两边都不能有空格

    2.  BASH中的语句结尾不需要分号

    • IF语句

    vif [ expression ]

    then

    #code block

    fi

    vif [ expression ]

    then

    #code block

    else

    #code block

    Fi

    vif [ expression ]

    then

    #code block

    else if [ expression ]

    then

    #code block

    else

    #code block

    fi

    fi

    vif [ expression ]; then

    #code block

    elif [ expression ]

    then

    #code block

    else

    #code block

    fi

    Fi

    • 比较

    比较操作整数操作字符串操作

    相同 -eq =

    不同 -ne !=

    大于 -gt >

    小于 -lt <

    大于或等于 -ge

    小于或等于 -le

    为空 -z

    不为空 -n

    例:

    比较整数ab是否相等:if [ $a = $b ] (也可用eq

    判断整数a是否大于整数bif [ $a -gt $b ]

    比较字符串ab是否相等:if [ $a = $b ]

    判断字符串a是否为空:if [ -z $a ]

    判断整数变量a是否大于bif [ $a -gt $b ]

    注意:

    在“[”和“]”符号的左右都留有空格“=”左右都有空格

    • 判断

    -e 文件已经存在

    -f 文件是普通文件

    -s 文件大小不为零

    -d 文件是一个目录

    -r 文件对当前用户可以读取

    -w 文件对当前用户可以写入

    -x 文件对当前用户可以执行

    S5

    #!/bin/sh

    folder=/home

    [ -r "$folder" ] && echo "Can read $folder"

    [ -f "$folder" ] || echo "this is not file"

    • for循环

    for循环结构与C 语言中有所不同,在BASH for 环的基本结构是:

    for var in [list]

    do

    #code block

    done

    $var 是循环控制变量,[list]var 需要遍历的一个集合,do/done对包含了循环体,相当于C 语言中的一对大括号。另外如果dofor 被写在同一行,必须在do前面加上;”。如:

    for$varin [list];do

    S7:

    #!/bin/bash

    for day in Sun Mon Tue Wed Thu Fri Sat

    do

    echo $day

    done

    v如果列表被包含在一对双引号中,则被认为是一个元素,S8:

    #!/bin/bash

    for day in "Sun Mon Tue Wed Thu Fri Sat“

    do

    echo $day

    Done

    For循环(注意)

    上面的例子中,在for 所在那行,变量day 是没有加"$" 符号的,而在循环体内,echo所在行变量$day是必须加上"$" 符号的。

    • while循环

    while循环的基本结构是:

    while [ condition ]

    do

    #code block

    done

    until循环的基本结构是:

    until [ condition ]

    do

    #code block

    done

    whileuntil的区别在于while是为真时执行,until是为假时执行

    • Case语句

    BASH中的case 结构与C 语言中的switch 语句的功能比较类似,可以用于进行多项分支控制。

    case"$var"in

    condition1 )

    ;;

    condition2 )

    ;;

    *)

    default statments;;

    esac

    S12:

    #!/bin/bash

    echo "Hit a key, then hit return."

    read Keypress

    case "$Keypress" in

    [A-Z] ) echo " Uppercase letter";;

    [a-z] )  echo " Lowercase letter";;

    [0-9] )  echo "Digit";;

    * ) echo "Punctuation, whitespace, or other";;

    esac

    • 关于bash在控制台下的快捷键

    ctrl+u 删除光标以前的所有字符

    ctrl+d 删除光标以前的一个字符

    ctrl+k 删除光标以后的所有字符

    ctrl+h 删除光标以后的一个字符

    ctrl+t 调换光标前两个字符的次序

    ctrl+a 移动光标到最前面

    ctrl+e 移动光标到最后面

    ctrl+p 上一个命令

    ctrl+n 下一个命令

    ctrl+s 锁定输入

    ctrl+q 解除锁定

    ctrl+f 移动光标到后一个字符

    ctrl+b 移动光标到前一个字符

    ctrl+x 标记一个位置

    ctrl+c 清除当前的输入

     

原文地址:https://www.cnblogs.com/owenyang/p/3579131.html