• Shell脚本语法


    一 Shell中的数值运算及运算方式差异

    1.数值运算

    [root@localhost ~]# aa=11
    [root@localhost ~]# bb=22
    #给变量aa和变量bb赋值
    

    方式一:

    [root@localhost ~]# dd=$(expr $aa + $bb)
    #dd的值是aa和bb的和。注意“+”号左右两侧必须有空格

    方式二:

    [root@localhost ~]# ff=$(( $aa+$bb ))
    

    方式三:

    [root@localhost ~]# gg=$[ $aa+$bb ]
    

    eg:

    表达式求值:

    $ expr1 + 3
    $ expr2 –1
    $ expr1 * 3 使用*要加转义符
    $ echo `expr1 + 3`
    

     
    注意:表达式中,数字和运算符指教要有空格,出现在语句中要加反引号

    2.运算符优先级

    3.运行方式差异

    #脚本内容如下
    [pingguo@localhostwork]$ cat sh01.sh
    #!/bin/bash
    read -p "please input your first name:" firstName
    read -p "please input your last name:" lastName
    echo -e "
    yourfull name is:"$firstName$lastName
    

    方式一:

    #执行脚本之前
    [pingguo@localhostwork]$ echo $firstName$lastName #无该变量
    [pingguo@localhostwork]$ sh sh01.sh
    please input your first name:zhang
    please input your last name:san
    your full name is:zhangsan
    #执行脚本之后
    [pingguo@localhostwork]$ echo $firstName$lastName #无该变量
    [pingguo@localhostwork]$
    

    原因:

    当使用直接运行的方法来处理时,系统会给予一支新的bash 让我们来运行脚本里面的命令,因此你的firstname, lastname等变量其实是在下图中的子程序bash 内运行的。当脚本运行完毕后,子程序bash 内的所有数据便被移除,因此上表的练习中,在父程序底下echo $firstname时就看不到任何东西了。

    方式二:

    [pingguo@localhostwork]$ source sh01.sh
    please input your first name:zhang
    please input your last name:san
    your full name is:zhangsan
    [pingguo@localhostwork]$ echo $firstName$lastName
    zhangsan
    [pingguo@localhostwork]$
    

    原因:

    二 Shell中的判断式及控制流程语句

    1、判断式

    1.条件判断命令test
    test n1 -参数 n2(或–参数表达式)
    真返回0,假返回1。

    ·test语句的等价形式[ 1 –lt4 ]
    注意:表达式与中括号间有空格。

    整数比较运算符

    eg:

    test 1–lt 4 #判断1<4
    echo $? #结果为0
    

    2.文件测试
    -f存在且是普通文件
    -d存在且是目录
    -s存在且字节数大于0
    -r存在且可读
    -w存在且可写
    -x存在且可执行
    eg:

    test -d “mydoc”
    判断mydoc是否是目录
    

    3、字符串测试
    test s 字符串s非空
    test s1 = s2字符串s1等于s2
    test s1 != s2字符串s1不等于s2
    test-z s字符串长=0,即为空串
    test -n字符串长>0
    4、其他参数
    -a逻辑与
    -o逻辑或
    !逻辑非

    2.控制流程

    seq命令:产生1-9的数字序列

    1.分支结构

    if

    if [ $# -eq 0 ]
    then
         echo “输入了0个参数”
    elif[ $# -gt 1 ]
    then echo “输入了多个参数”
    else echo “输入了1个参数”
    fi
    

    case

    case “$#” in
    0)echo “输入了0个参数”;;
    1)echo “输入了1个参数”;;
    *)echo “输入了多个参数”;;
    esac
    

     注意:每个分支条件后必须以两个分号结尾

    2.循环结构

    for循环

    #输出100内10的倍数
    #for i in {1..9} #大括号中不能有变量
    for i in `seq1 9`
    do
           echo `expr$i* 10`
    done
    或写  echo $(expr$i* 10)
    

     注意:乘号前加转义符,与数字间要有空格。

    while循环

    #求1到100的和
    i=1
    sum=0
    while [ $i –le 100 ]
    do
      sum=$[ $sum+$i ]
      i=$[ $i+1 ]
    done
    echo $sum
    
    #等待特定用户登录,每30秒确认一次
    printf"Enter username:"
    read user
    while true
    do
          if who |grep"$user" > /dev/null
          then
                break
          fi
          sleep 30
    done
    

    3. break可指定跳出几层循环

     eg:

    #!/bin/bash
    str=("a" "b" "c" "d")
    
    for i in ${str[@]}
        do
              echo -n $i
              for j in `seq10`
                  do
                       if [ $j -eq 5 ];then
                            break
                       fi
                  echo -n $j
                  done
               echo
        done
    

     

    4.read

    read 变量1 [变量2 …]
    选项:

    -p:指定读取值时的提示符;
    read –p “please intput a num:”num

    需注意:

    可以从键盘上读取多个变量的值,用户输入数据时,以空格或者Tab键作为分隔。
    如果输入的数据个数不够,则从左到右对应赋值,没有输入的变量为空;
    如果输入的数据个数超了,则从左到右对应赋值,最后一个变量被赋予剩余的所有数据。

    三 Shell中的函数

    1.定义函数的格式为:

    functions 函数名()# function可有可无

    {

    命令1

    . . .

    }

    2.eg:

    #!/bin/sh
    # func1.sh
    hello ()
    {
    echo "Hello there today's date is `date`“
    }
    echo "now going to the function hello”
    hello
    echo “back from the function"
    

    3. 参数可以传递给函数,并由脚本进行访问:
    fname arg1 arg2;#传递参数

    四 Shell数组

    1.数组定义

    方式一:

    可以在单行中使用一列值来定义一个数组:
    array_var= (1 2 3 4 5 6)
    #这些值将会存储在以0为起始索引的连续位置上
    方式二:

    将数组定义成一组“索引-值”:
    array_var[0]="test1"
    array_var[1]="test2"
    array_var[2]="test3"
    array_var[3]="test4"
    array_var[4]="test5"

    2.打印数组所有值及长度

    echo ${array_var[*]}
    test1 test2 test3 test4 test5
    

     个数为长度

    $*——调用shell程序时所传送的全部参数的单字符串,“参数1”“参数2”…形式保存的参数

    echo ${array_var[@]}
    test1 test2 test3 test4 test5
    

    $@“参数1参数2”…形式保存的参数

    #打印数组长度:
    echo ${#array_var[*]}
    5
    

     3.关联数组

    关联数组的下标和值称为键值对,它们是一一对应的关系。在关联数组中,键是唯一的,值可以不唯一。

    注意:在使用关联数组之前,需要使用命令declare -A array 进行显示声明

    eg:

    name=(jim tom lucy)
    declare -A phone
    phone=([jim]=135 [tom]=136 [lucy]=158)
    for i in `evalecho {0..$((${#name[*]}-1))}`
       do
             echo ${name[i]} phone number is ${phone["${name[i]}"]}
       done
    

     结果:

    jimphone number is 135
    tom phone number is 136
    lucyphone number is 158
    
                 语法               描述
            ${!array[*]}       取关联数组所有键
            ${!array[@]}       取关联数组所有键
            ${array[*]}
          取关联数组所有值
            ${array[@]}       取关联数组所有值
            ${#array[*]}       关联数组的长度
            ${#array[@]}       关联数组的长度
  • 相关阅读:
    hdoj 1002 A + B Problem II
    hdoj 1234 开门人和关门人
    hdoj 2203 亲和串
    nyoj 73 比大小
    81B
    信息传递
    bzoj1787
    最少交换次数
    100803C
    火柴排队
  • 原文地址:https://www.cnblogs.com/mlan/p/8617383.html
Copyright © 2020-2023  润新知