shell常错记录

    技术2022-07-03  105

                                                     Shell中常错注解

    注:Linux中对空格等格式控制的很严格。要注意有些地方一定要有,有的地方一定不能有

    变量赋值时=号两边不能有空格

    在用UE打开shell脚本时,windowsLinux环境不同,所以回车换行等也会不同,会报出某些莫名奇妙的错误,尽量使用VI来编辑

     

    1#![dsw1] /bin/sh

    注:此行可以不写,但如写了这必须按上,/不能反。#!后面给出的路径名必须是正确,否则将会出现一个错误消息,通常是Command not found

    2dsw=[dsw2] "how are you"

    为变量赋值时=号左右不能有空格

    3     index=`expr $index+1`

           expr要求操作数与操作符之间用空格隔开,而且必须用反引号,以告知shell这是一个命令。.

    双引号[dsw3] 

    使用双引号可引用除字符美元符号($、反引号(`、反斜线(/外的任意字符或字符串。

    单引号

    单引号与双引号类似,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了其特殊含义,会将引号里的所有字符,包括引号都作为一个字符串。

    $ echo `date` [dsw4]   -----------------àdate

    反引号

    反引号用于设置系统命令的输出到变量。s h e l l 将反引号中的内容作为一个系统命令,并执行其内容。使用这种方法可以替换输出为一个变量。反引号可以与引号结合使用。

    两种方法防止变量扩展:

    (1)使用单引号,放置在单引号中的变量将失去扩展

    (2)使用反斜杠/echo “/$num”

    注意在比较运算符的两端加上空格,否则就成了赋值运算。       

    if [ "x$1" = "xSCP" ]   #x是为了增加可读性,也属于个人习惯.

     

    字符串测试:

    string                                   string不为空白字串

    -n string                        string的长度大於0

    -z string                         string的长度等於0

    string1=string2               string1等於string2

    string1!=string2              string1不等於string2

     

    数字比较区

    int1 -gt int2                    int1大於int2

    int1 -ge int2                   int1大於等於int2

    int1 -eq int2                   int1等於int2

    int1 -ne int2                   int1不等於int2

    int1 -le int2                    int1小於等於int2

    int1 -lt int2                     int1小於int2

     

    文件测试

    -r filename                     档案可读取

    -w filename                    档案可写入

    -x filename                     档案可执行

    -f filename                     档案为一般档

    -d filename                     档案为目录

    -s filename                     档案为非空的一般档$0 程序名字

     

    $n                   n个参数值n=1..9

    $*                   所有命令行参数

    $@          所有命令行参数,如果它被包含在引号里,形如"$@",则每个参数也各自被引号包括

    $#                    命令行参数个数

    $$                   当前进程的进程ID(PID)

    $!                   最近后台进程的进程ID

    $?[dsw5]                 最近使用命令的退出状态

     

    逻辑测试:

    "-a"代表逻辑AND 运算

    "-o"代表逻辑OR运算

    "!" 代表NOT 运算。

     

    C风格条件测试[dsw6] 

    字符串测试:[dsw7] 

    string1 > string2    string1 < string2

    整形测试:[dsw8] 

    int1 = int2              int1 != int2

    int1 > int2               int1 < int2

    int1 >= int2              int1 <= int2

    逻辑测试:[dsw9] 

    &&      [dsw10] [dsw11] ||

     

     

    函数调用方式

    Show()

    {

    }

    直接Show [dsw12]            

     

    5、有时候变量名与其他文字混淆,可以使用花括号来告诉shell我们要打印的是num变量

    num=2

    echo "this is the ${num}nd"

    这将打印: this is the 2nd

    6. 使用命令替换

    这是一个相当有用的方法。如果想要使某个命令的输出成为另一个命令的参数时,就一定要使用这个方法。我们将命令列於两个"`" 号之间,而Shell 会以这个命令执行後的输出结果代替这个命令以及两个"`" 符号。

    <eg>

    str='Current directory is '`pwd`

    echo $str

    结果如下:

    Current directory is /users/cc/mgtsai

    这个意思是pwd 这个命令输出"/users/cc/mgtsai",而後整个字串代替原来的`pwd` 设定str 变量,所以str 变量的内容则会有pwd 命令的输出。<eg>

    number=`expr $number + 1`

    这就是先前所提要作数值运算的方法,基本上expr命令只将运算式解,而後输出到标准输出上。如果要将某变量设定成其值,非得靠命令替换的方式不可。这个例子是将number变量的值加1 後再存回number变量。

     

    二、执行命令

    Bourne Shell中有五种方法执行一个命令,而这五种方式所产生的果有些许的不同。

    (1). 使用sh命令                                                           

    sh command 这个档案必须是Bourne ShellScript,但这个档案并不一定要设成可执行。除此之外和直接下命令的方式一样。

    (2). 使用exec命令

    exec command 此时这个Script将会被所执行的命令所取代。当这个命令执行完毕之後,这个Script也会随之结束。

    (3).使用./sh

    三、流程控制

    1、在介绍流程控制之前,我们先来看看test命令。test命令的参数是条件判断式,当条件为真时则传回非零值,而条件为伪时则传回零。在所有的流程控制都必须用到test命令来判断真伪。

    2、通常用" [ ] [dsw13] "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。

    3

    #!/bin/sh

    if [ [dsw14] "$SHELL" = [dsw15] "/bin/bash" ]; then

    echo "your login shell is the bash (bourne again shell)"

    else

    echo "your login shell is not bash but $SHELL"

    fi

     

     

     

     

     

     

     

     

     

     

     

     

    产用有用的命令

    head –n 文件名                 用于输出文件的前n

    tail  -n 文件名                 用于输出文件的最后n

    wc l/c/w 文件名               统计输入总共有多少行l/字符c/单词w 

     

     

     

     

    2:tee ${logFileName}是将文件流引入logFileName目录中

    3:touch ${logFile}创建文件

    4:sleep 时间

     

     

     

     

     

     

    源码区:

    #!/bin/sh

    echo "The system time is " `date`

    echo "**************************"

    echo "please enter a password"

    echo "**************************"

    read pd

    if [ "-$pd" = "-dsw" ];then

            echo "the password is right"

    else

            echo "the password is error"

    fi

     

    #!/bin/sh

    echo "The system time is " `date`

    num=0

    for a in 1 2 3 4

    do

            echo $a

            num=`expr $num+$a`

            echo $num

    done

     

    #!/bin/sh[dsw16] 

    echo "The system time is " `date`

    num=0

    for a

    do

            echo $a

            num=`expr $num+$a`

            echo $num

    done

     

    #!/bin/sh

    echo "The system time is " `date`

    echo "**************************"

    echo "please enter a number"

    echo "**************************"

    len=10

    i=0

    while [ ${i} -le ${len} ]

    do

            i=`expr ${i} + 1`

            echo ${i}

    done

     

    #!/bin/sh

    echo "The system time is " `date`

    echo "**************************"

    echo "please enter a number"

    echo "**************************"

    len=10

    i=0

    until [dsw17] [ ${i} -gt ${len} ]

    do

            i=`expr ${i} + 1`

            echo ${i}

    done

     

    #!/bin/sh

    echo "The system time is " `date`

    echo "**************************"

    echo "please enter a number"

    echo "**************************"

    read num

    case $num in

            A|a)[dsw18]  echo 'You entered A.';;

            B|b) echo 'You entered B.';;

            C|c) echo 'You entered C.';;

            *)echo "l don't know what you input";;

    Esac

     

    #!/bin/sh

    echo “Please select operation”

    select [dsw19] operation in “+” “-” “*” “/”

    do

        case $operation in #case

            +”) ......; break;;

    *) echo Invalid select, please try again::

    esac

    done

     


     [dsw1]此之间不可有空格

     [dsw2]此处不可有空格

     [dsw3]单引号可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。

     [dsw4]ESC附近的那个按钮

     [dsw5]用于获取上一条命令执行的返回结果

     [dsw6] 注:在使用C风格条件测试时,一定要比非C风格时多加一个[],

     [dsw7]格式

    if [[ $str > test ]]; then

        ......

    fi

     [dsw8]格式

    if (( $num <= 0 )); then

        ......

    fi

     [dsw9]格式

    if [[ $str = test && $num = 0 ]]; then

        ......

    fi

     [dsw10]C风格实列

    #!/bin/sh

    echo "*******************"

    echo "please enter a number"

    echo "*******************"

    if [[ $1 = "dsw" || $2 -eq 1234 ]];then

            echo "success"

    else

            echo "failed"

    fi

     [dsw11]C风格实列

    #!/bin/sh

    echo "*******************"

    echo "please enter a number"

    echo "*******************"

    if [ $1 = "dsw" -a $2 -eq 1234 ];then

            echo "success"

    else

            echo "failed"

    fi

     [dsw12]不用()

     [dsw13]注意:空格

     [dsw14]这里一定要有空格,不然得不到正确的结果

     [dsw15]这里有空格则为比较符,没空格则为赋值运算符

     [dsw16]执行shsh sh.sh 1 2 3 4 5 6 7 8,这里的参数好像会自动放入a变量中

     [dsw17]条件为假时进入循环

     [dsw18]

    *  任意字串

    ?  任意字元

    [abc] a, b, c三字元其中之一

    [a-n] an的任一字元

    |    多重选择

    abc[abc]区别       

     [dsw19]selectin后面在””号中的字符串做为菜单,而且有默认的ID,从1开始


    最新回复(0)