shell常错记录

来源:互联网 发布:精灵耳饰淘宝网 编辑:程序博客网 时间:2024/04/28 20:09

                                                 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开始