shell script 学习笔记~~~~

什么是shell script:

    shell script是利用shell的功能所写的一个“程序”(program), 这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令和数据流重定向等功能,以达到我们想要的处理目的。

shell script编写中的注意事项:

    1、命令的执行是从上到下,从左到右地分析执行

    2、命令与参数间的多个空格都会被忽略

    3、空白行也将被忽略,并且【tab】键所得的空白同样视为空格

    4、如果读取到一个Enter符号(CR),就尝试开始执行改行(或该串)命令

    5、可以使用“\[Enter]”来扩展至下一行

    6、#号可作为注释,任何加在#后面的数据将全部被视为批注文件而被忽略(我觉得#!/bin/bash不是)

编写第一个script:

  #!/bin/bash

  # print "Hello World!"

  PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin

  export PATH

  echo -e "Hello World! \n"

  exit 0

1、文件开头指定一个或多个解释脚本程序的shell,如#!/bin/bash

*如果指定,注意/bin不要漏了“/”,否则用./方式执行会找不到路径。

*不指定的话一般默认以/bin/sh执行shell脚本

2、常见的两种执行方式

            sh +filename

            ./filename 

变量

运行shell时,会同时存在三种变量:

1) 局部变量

    局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量

    所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell变量

    shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行.

变量的定义:

定义变量时,变量名不加美元符号($),如:

variableName="value"

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

•               首个字符必须为字母(a-z,A-Z)。

•               中间不能有空格,可以使用下划线(_)。

•               不能使用标点符号。

•               不能使用bash里的关键字(可用help命令查看保留关键字)。

变量定义举例

mywork="/home/chenht/share/linux"

myNum=100

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:

name="zhiwei"

echo $name

echo ${name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。

重新定义变量

已定义的变量,可以被重新定义,如:

                mywork="/home/yinzw/share/linux"

echo ${mywork}

这样写是合法的,但注意,第二次赋值的时候不能写 $mywork="/home/yinzw/share/linux" , 使用变量的时候才加美元符($)。

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash

mywork="/home/yinzw/share/linux"

readonly mywork

mywork="/home/yinzw/share"

运行脚本,结果如下:

/bin/sh: NAME: This variable is read only.

删除变量

使用 unset 命令可以删除变量。语法:

unset variableName

变量被删除后不能再次使用;unset 命令不能删除只读变量。

举个例子:

#!/bin/sh

mywork="/home/yinzw/share"

unset mywork

echo $mywork

上面的脚本没有任何输出。

 

shell 特殊变量:

前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。

特殊变量列表

变量        含义

$0           当前脚本的文件名

$n           传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。

$#           传递给脚本或函数的参数个数。

$*            传递给脚本或函数的所有参数。

$@          传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。

$?           上个命令的退出状态,或函数的返回值。

$$           当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

 命令行参数

     运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

#!/bin/bash

echo "File Name: $0"

echo "First Parameter : $1"

echo "First Parameter : $2"

echo "Quoted Values: $@"

echo "Quoted Values: $*"

echo "Total Number of Parameters : $#"

$* 和 $@ 的区别

    $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。

但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

退出状态

    $? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。

    退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。

Shell替换:

Shell运算符

Shell注释

Shell字符串

Shell数组

Shell echo命令

    echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串。命令格式:

显示转义字符

echo "\"It is a test\""

结果将是:"It is a test"

双引号也可以省略。

显示变量

name="OK"

echo "$name It is a test"

结果将是:OK It is a test

同样双引号也可以省略。

如果变量与其它字符相连的话,需要使用大括号({ }):

mouth=6

echo "${mouth}-1-2009"结果将是:

6-1-2009

显示换行

echo  "OK\n"

echo "It is a test"

输出:    OK

It is a test

显示不换行

echo "OK\c"

echo "It is a test"

输出:OK It is a test

显示结果重定向至文件

echo "It is a test" > myfile原样输出字符串

若需要原样输出字符串(不进行转义),请使用单引号。例如:

echo '$name\"'显示命令执行结果

echo `date`结果将显示当前日期

Shell if else语句

if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:

  • if ... fi 语句;
  • if ... else ... fi 语句;

•      if ... elif ... else ... fi 语句。

1) if ... else 语句

if ... else 语句的语法:

if [ expression ]

then

   Statement(s) to be executed if expression is true

fi

如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。

最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写,后面也会遇见。

 

注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。

 

举个例子:

#!/bin/sh

 

a=10

b=20

if [ $a == $b ]; then

echo "a is equal to b"

fi

if [ $a != $b ];  then

echo "a is not equal to b"

fi

运行结果: a is not equal to b

2) if ... else ... fi 语句

if ... else ... fi 语句的语法:

if [ expression ]

then

   Statement(s) to be executed if expression is true

else

   Statement(s) to be executed if expression is not true

fi如果 expression 返回 true,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句。

3) if ... elif ... fi 语句

if ... elif ... fi 语句可以对多个条件进行判断,语法为:

 

Shell case esac语句

case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构。

case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case 值 in

模式1)

    command1

    command2

    command3

    ;;

模式2)

    command1

    command2

    command3

    ;;

*)

    command1

    command2

    command3

    ;;

esac

case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;; 与其他语言中的 break 类似,意思是跳到整个 case 语句的最后。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

 

下面的脚本提示输入1到4,与每一种模式进行匹配:

echo 'Input a number between 1 to 4'

echo 'Your number is:\c'

read aNum

case $aNum in

                                1)  echo 'You select 1'

                                 ;;

                                 2)  echo 'You select 2'

                                 ;;

                                3)  echo 'You select 3'

                                ;;

                                4)  echo 'You select 4'

                                 ;;

                                *)  echo 'You do not select a number between 1 to 4'

                                ;;

Shell for循环

与其他编程语言类似,Shell支持for循环。(注意for后面变量名没有$)

for循环一般格式为:

for 变量 in 列表

do

    command1

    command2

    ...

    commandN

done

列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。

in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

例如,顺序输出当前列表中的数字:

for loop in 1 2 3 4 5

do

    echo "The value is: $loop"

done

运行结果:

The value is: 1

The value is: 2

The value is: 3

The value is: 4

The value is: 5

顺序输出字符串中的字符:

for str in 'This is a string'

do

    echo $str

done运行结果:

This is a string

显示主目录下以 .bash 开头的文件:

#!/bin/bash

 

for FILE in $HOME/.bash*

do

   echo $FILE

done运行结果:

/root/.bash_history

/root/.bash_logout

/root/.bash_profile

/root/.bashrc

Shell while循环

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while command

do

   Statement(s) to be executed if command is true

done

命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。

 

以下是一个基本的while循环,测试条件是:如果COUNTER小于5,那么返回 true。COUNTER从0开始,每次循环处理时,COUNTER加1。运行上述脚本,返回数字1到5,然后终止。

COUNTER=0

while [ $COUNTER -lt 5 ]

do

    COUNTER='expr $COUNTER+1'

    echo $COUNTER

done

运行脚本,输出:

1

2

3

4

5

while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

echo 'type <CTRL-D> to terminate'

while read FILM

do

    echo "Yeah! great film the $FILM"

done

运行脚本,输出类似下面:

type <CTRL-D> to terminate

enter your most liked film: Sound of Music

Yeah! great film the Sound of Music

Shell until循环

until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until 循环更加有用。

until 循环格式为:

until command

do

   Statement(s) to be executed until command is true

done

command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

Shell跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 break 和 continue 来跳出循环。

break命令

break命令允许跳出所有循环(终止执行后面的所有循环)。

 

在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环。例如:

break n表示跳出第 n 层循环。

continue命令

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

Shell函数

函数可以让我们将一个复杂功能划分成若干模块,让程序结构更加清晰,代码重复利用率更高。像其他编程语言一样,Shell 也支持函数。Shell 函数必须先定义后使用。

Shell 函数的定义格式如下:

function_name () {

    list of commands

    [ return value ]

}

如果你愿意,也可以在函数名前加上关键字 function:

function function_name () {

    list of commands

    [ return value ]

}

函数返回值,可以显式增加return语句;如果不加,会将最后一条命令运行结果作为返回值。

Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:“numeric argument required”。

如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。

先来看一个例子:

 

另外,还有几个特殊变量用来处理参数,前面已经提到:

特殊变量 说明

$# 传递给函数的参数个数。

$* 显示所有传递给函数的参数。

$@ 与$*相同,但是略有区别,请查看Shell特殊变量。

$? 函数的返回值。

 

Shell输入输出重定向

Shell文件包含

 

转载于:https://www.cnblogs.com/wisdomyzw/p/5546284.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值