文档视界 最新最全的文档下载
当前位置:文档视界 › Linux Shell脚本结构解析以及常用语句说明_总体了解

Linux Shell脚本结构解析以及常用语句说明_总体了解

Linux Shell脚本结构解析以及常用语句说明_总体了解
Linux Shell脚本结构解析以及常用语句说明_总体了解

目录

2 BASH 的基本语法 (2)

2.1最简单的例子—— Hello World! (2)

2.2关于输入、输出和错误输出 (3)

2.3BASH 中对变量的规定(与C 语言的异同) (5)

2.3.1BASH 中的变量介绍 (5)

2.3.1.1简单变量 (5)

关于变量,我们需要注意下面几点: (6)

在比较操作上,整数变量和字符串变量各不相同,详见下表: (7)

列出了BASH 中用于判断文件属性的操作符,见下表: (7)

2.3.1.2关于局部变量 (8)

2.3.2 BASH中的变量与C 语言中变量的区别 (9)

2.4 BASH 中的基本流程控制语法 (9)

2.4.1 if...then...else (9)

2.4.2 for (10)

2.4.3 while (12)

2.4.4 until (12)

2.4.5 case (12)

2.4.6 break/continue (14)

2.5函数的使用 (14)

(1)函数的定义 (14)

(2)函数的参数与返回值 (14)

3 BASH 中的特殊保留字 (15)

3.1保留变量 (15)

3.2随机数 (16)

3.3运算符 (16)

3.4变量的特殊操作--${var}的一些用法 (17)

4.BASH中的其他高级问题 (17)

4.1 BASH 中对返回值的处理 (18)

4.2用BASH 设计简单用户界面 (18)

4.3在BASH 中读取用户输入 (19)

4.4 一些特殊的惯用法 (20)

(1)() 一对括号 (20)

(2):冒号--- 1空命令2求取后面变量的值 (20)

4.5 BASH 程序的调试 (21)

4.6 关于BASH2 (21)

2 BASH 的基本语法

最简单的例子——Hello World!

关于输入、输出和错误输出

BASH 中对变量的规定(与C 语言的异同)

BASH 中的基本流程控制语法

函数的使用

2.1最简单的例子——Hello World!

几乎所有的讲解编程的书给读者的第一个例子都是Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解BASH。

用vi 编辑器编辑一个hello 文件如下:

#!/bin/bash -----#!表示此文件为可执行脚本文件,后边跟的是该文件所用的命令解释器# This is a very simple example-----#注释语句

echo Hello World

这样最简单的一个BASH 程序就编写完了。这里有几个问题需要说明一下:

一,第一行的#! 是什么意思

二,第一行的/bin/bash 又是什么意思

三,第二行是注释吗

四,echo 语句

五,如何执行该程序

#! 是说明hello 这个文件的类型的,有点类似于Windows 系统下用不同文件后缀来表示

不同文件类型的意思(但不相同)。Linux 系统根据"#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过"man magic"命令及/usr/share/magic 文件来了解这方面的更多内容。在BASH 中第一行的"#!" 及后面的"/bin/bash" 就表明该文件是一个BASH 程序,需要由/bin 目录下的bash 程序来解释执行。BASH 这个程序一般是存放在/bin 目录下,如果你的Linux 系统比较特别,bash 也有可能被存放在/sbin 、/usr/local/bin 、/usr/bin 、/usr/sbin 或/usr/local/sbin 这样的目录下;如果还找不到,你可以用"locate bash" "find / -name bash 2> /dev/null" 或"whereis bash" 这三个命令找出bash 所在的位置;如果仍然找不到,那你可能需要自己动手安装一个BASH 软件包了。

第二行的"# This is a ..." 就是BASH 程序的注释,在BASH 程序中从“#”号(注意:后面紧接着是“!”号的除外)开始到行尾的多有部分均被看作是程序的注释。的三行的echo 语句的功能是把echo 后面的字符串输出到标准输出中去。由于echo 后跟的是"Hello World" 这个字符串,因此"Hello World"这个字串就被显示在控制台终端的屏幕上了。需要注意的是BASH 中的绝大多数语句结尾处都没有分号。

如何执行该程序呢?有两种方法:一种是显式制定BASH 去执行:

$ bash hello 或

$ sh hello (这里sh 是指向bash 的一个链接,“lrwxrwxrwx 1 root root 4 Aug 20 05:41 /bin/sh -> bash”)

或者可以先将hello 文件改为可以执行的文件,然后直接运行它,此时由于hello 文件第一行的"#! /bin/bash" 的作用,系统会自动用/bin/bash 程序去解释执行hello 文件的:

$ chmod u+x hello -------为hello文件的属主(u)添加可执行权限(x)

$ ./hello ------------ 运行该可执行文件

此处没有直接“$ hello”是因为当前目录不是当前用户可执行文件的默认目录,而将当前目录“.”设为默认目录是一个不安全的设置。

需要注意的是,BASH 程序被执行后,实际上Linux 系统是另外开设了一个进程来运行的。

2.2关于输入、输出和错误输出

在字符终端环境中,标准输入/标准输出的概念很好理解。输入即指对一个应用程序或命令的输入,无论是从键盘输入还是从别的文件输入;输出即指应用程序或命令产生的一些信息;与Windows 系统下不同的是,Linux 系统下还有一个标准错误输出的概念,这个概念主要是为程序调试和系统维护目的而设置的,错误输出于标准输出分开可以让一些高级的错误信息不干扰正常的输出信息,从而方便一般用户的使用。

在Linux 系统中:标准输入(stdin)默认为键盘输入;标准输出(stdout)默认为屏幕输出;标准错误输出(stderr)默认也是输出到屏幕(上面的std 表示standard)。在BASH 中使用这些概

念时一般将标准输出表示为1,将标准错误输出表示为2。下面我们举例来说明如何使用他们,特别是标准输出和标准错误输出。

输入、输出及标准错误输出主要用于I/O 的重定向,就是说需要改变他们的默认设置。先看这个例子:

$ ls > ls_result

$ ls -l >> ls_result

上面这两个命令分别将ls 命令的结果输出重定向到ls_result 文件中和追加到ls_result 文件中,而不是输出到屏幕上。">"就是输出(标准输出和标准错误输出)重定向的代表符号,连续两个">" 符号,即">>" 则表示不清除原来的而追加输出。下面再来看一个稍微复杂的例子:

$ find /home -name lost* 2> err_result

----"2>" 表示将标准错误输出重定向到err_result文件中

这个命令在">" 符号之前多了一个"2","2>" 表示将标准错误输出重定向。由于/home 目录下有些目录由于权限限制不能访问,因此会产生一些标准错误输出被存放在err_result 文件中。大家可以设想一下find /home -name lost* 2>>err_result 命令会产生什么结果?

如果直接执行find /home -name lost* > all_result ,其结果是只有标准输出被存入all_result 文件中,要想让标准错误输出和标准输入一样都被存入到文件中,那该怎么办呢?看下面这个例子:

$ find /home -name lost* > all_result 2>& 1

上面这个例子中将首先将标准错误输出也重定向到标准输出中,再将标准输出重定向到all_result 这个文件中。这样我们就可以将所有的输出都存储到文件中了。为实现上述功能,还有一种简便的写法如下:

$ find /home -name lost* >& all_result

如果那些出错信息并不重要,下面这个命令可以让你避开众多无用出错信息的干扰:

$ find /home -name lost* 2> /dev/null

同学们回去后还可以再试验一下如下几种重定向方式,看看会出什么结果,为什么?

$ find /home -name lost* > all_result 1>& 2

$ find /home -name lost* 2> all_result 1>& 2

$ find /home -name lost* 2>& 1 > all_result

另外一个非常有用的重定向操作符是"-",请看下面这个例子:

$ (cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)

该命令表示把/source/directory 目录下的所有文件通过压缩和解压,快速的全部移动到/dest/directory 目录下去,这个命令在/source/directory 和/dest/directory 不处在同一个文件系统下时将显示出特别的优势。

下面还几种不常见的用法:

n<&- 表示将n 号输入关闭

<&- 表示关闭标准输入(键盘)

n>&- 表示将n 号输出关闭

>&- 表示将标准输出关闭

2.3BASH 中对变量的规定(与C 语言的异同)

好了下面我们进入正题,先看看BASH 中的变量是如何定义和使用的。对于熟悉C 语言的程序员,我们将解释BASH 中的定义和用法与C 语言中有何不同。

2.3.1BASH 中的变量介绍

我们先来从整体上把握一下BASH 中变量的用法,然后再去分析BASH 中变量使用与C 语言中的不同。BASH 中的变量都是不能含有保留字,不能含有"-" 等保留字符,也不能含有空格。

2.3.1.1简单变量

在BASH 中变量定义是不需要的,没有"int i" 这样的定义过程。如果想用一个变量,只要他没有在前面被定义过,就直接可以用,当然你使用该变量的第一条语句应该是对他赋初值了,如果你不赋初值也没关系,只不过该变量是空(注意:是NULL,不是0 )。不给变量赋初值虽然语法上不反对,但不是一个好的编程习惯。好了我们看看下面的例子:

首先用vi 编辑下面这个文件hello2:

关于变量,我们需要注意下面几点:

一,变量赋值时,'='左右两边都不能有空格;

二,BASH 中的语句结尾不需要分号(";");

三,除了在变量赋值和在FOR循环语句头中,BASH 中的变量使用必须在变量前加"$"符号,同学们可以将上面程序中第三行改为"echo STR" 再试试,看看会出什么结果。==>output: STR

四,由于BASH 程序是在一个新的进程中运行的,所以该程序中的变量定义和赋值不会改变其他进程或原始Shell 中同名变量的值,也不会影响他们的运行。

更细致的文档甚至提到以单引号括起来的变量将不被BASH 解释为变量,如'$STR' ,而被看成为纯粹的字符串。而且更为标准的变量引用方式是${STR} 这样的,$STR 自不过是对${STR} 的一种简化。在复杂情况下(即有可能产生歧义的地方)最好用带{} 的表示方式。

BASH 中的变量既然不需要定义,也就没有类型一说,一个变量即可以被定义为一个字符串,也可以被再定义为整数。如果对该变量进行整数运算,他就被解释为整数;如果对他进行字符串操作,他就被看作为一个字符串。

关于整数变量计算,有如下几种:" + - * / % ",他们的意思和字面意思相同。

整数运算一般通过let 和expr 这两个指令来实现,如对变量x 加1 可以写作:let "x = $x + 1" 或者x=`expr $x + 1`

在比较操作上,整数变量和字符串变量各不相同,详见下表:

比如:

比较字符串a 和 b 是否相等就写作:if [ $a = $b ]

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

判断整数变量a 是否大于b 就写作:if [ $a -gt $b ]

更细致的文档推荐在字符串

比较时尽量不要使用-n ,而用! -z 来代替。(其中符号"!" 表示求反操作)

BASH 中的变量除了用于对整数和字符串进行操作以外,另一个作用是作为文件变量。BASH 是Linux 操作系统的Shell,因此系统的文件必然是BASH 需要操作的重要对象,如if [ -x /root ] 可以用于判断/root 目录是否可以被当前用户进入。

列出了BASH 中用于判断文件属性的操作符,见下表:

注意:上表中的file 及file1、file2 都是指某个文件或目录的路径。

2.3.1.2关于局部变量

在BASH 程序中如果一个变量被使用了,那么直到该程序的结尾,该变量都一直有效。为了使得某个变量存在于一个局部程序块中,就引入了局部变量的概念。BASH 中,在变量首次被赋初值时加上local 关键字就可以声明一个局部变量,如下面这个例子:

echo $HELLO ---测试得到全局变量并没有被改变

该程序的执行结果是:

Hello

World

Hello

这个执行结果表明全局变量$HELLO 的值在执行函数hello 时并没有被改变。也就是说局部变量$HELLO 的影响只存在于函数那个程序块中。

2.3.2 BASH中的变量与C 语言中变量的区别

这里我们为原来不熟悉BASH 编程,但是非常熟悉C 语言的程序员总结一下在BASH 环境中使用变量需要注意的问题。

1,BASH 中的变量在引用时都需要在变量前加上"$" 符号(第一次赋值及在For循环的头部不用加"$"符号);

2,BASH 中没有浮点运算,因此也就没有浮点类型的变量可用;

3,BASH 中的整形变量的比较符号与C 语言中完全不同,而且整形变量的算术运算也需要经过let 或expr 语句来处理;

2.4 BASH 中的基本流程控制语法

BASH 中几乎含有C语言中常用的所有控制结构,如条件分支、循环等,下面逐一介绍。

2.4.1 if...then...else

if 语句用于判断和分支,其语法规则和C 语言的if 非常相似。其几种基本结构为:

fi 表示if语句结束,如果命令执行失败,则会返回一个非0的出口状态,则执行紧随fi之后的命令。

if [ expression ]

then

statments

fi

或者

if [ expression ]

then

statments

else

statments

fi

或者

if [ expression ]

then

statments

else if [ expression ]

then

statments

else

statments

fi

或者

if [ expression ]

then

statments

elif [ expression ]

then

statments

else

statments

fi

值得说明的是如果你将if 和then 简洁的写在一行里面,就必须在then 前面加上分号,如:if [ expression ]; then ... 。下面这个例子说明了如何使用if 条件判断语句:

#!/bin/bash

if [ $1 -gt 90 ]

then

echo "Good, $1"

elif [ $1 -gt 70 ]

then

echo "OK, $1"

else

echo "Bad, $1"

fi

exit 0

上面例子中的$1 是指命令行的第一个参数,这个会在后面的“BASH 中的特殊保留字”中讲解。

2.4.2 for

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

for $var [in word-list]

do

statments

done

其中$var 是循环控制变量,[in word-list]是$var 需要遍历的一个集合,do/done 对包含了循环体,相当于C 语言中的一对大括号。另外如果do 和for 被写在同一行,必须在do 前面加上";"。如:for $var in ; do 。下面是一个运用for 进行循环的例子:

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

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

另外如果写成for day 而没有后面的in 部分,则day 将取遍命令行的所有参数。如这个程

序:

#!/bin/bash

for param

do

echo $param

done

exit 0

上面这个程序将列出所有命令行参数。for 循环结构的循环体被包含在do/done 对中,这也是后面的while、until 循环所具有的特点。

2.4.3 while

while 循环的基本结构是:

while [ condition ]

do

statments

done

这个结构请大家自己编写一个例子来验证。

2.4.4 until

until 循环的基本结构是:

until [ condition is TRUE ]

do

statments

done

这个结构也请大家自己编写一个例子来验证。

2.4.5 case

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

case "$var" in

condition1 )

statments1;;

condition2 )

statments2;;

...

* )

default statments;;

esac -----不匹配,或者执行完某一个情况,都要执行它之后的语句

下面这个程序是运用case 结构进行分支执行的例子:

[root@localhost ~]# cat case.sh

#!/bin/bash

echo "Hit a key, then hit return."

read Keypress

case "$Keypress" in

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

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

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

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

esac

exit 0

[root@localhost ~]# ./case.sh

Hit a key, then hit return.

r

Lowercase letter

[root@localhost ~]# ./case.sh

Hit a key, then hit return.

T

Lowercase letter

[root@localhost ~]# ./case.sh

Hit a key, then hit return.

2

Digit

上面例子中的第四行"read Keypress" 一句中的read 语句表示从键盘上读取输入。这个命令将在本讲义的BASH 的其他高级问题中讲解。

2.4.6 break/continue

熟悉 C 语言编程的都很熟悉break 语句和continue 语句。BASH 中同样有这两条语句,而且作用和用法也和C 语言中相同,break 语句可以让程序流程从当前循环体中完全跳出,而continue 语句可以跳过当次循环的剩余部分并直接进入下一次循环。

2.5函数的使用

(1)函数的定义

BASH 是一个相对简单的脚本语言,不过为了方便结构化的设计,BASH 中也提供了函数定义的功能。BASH 中的函数定义很简单,只要向下面这样写就可以了:

function my_funcname {

code block

}

或者

my_funcname() {

code block

}

上面的第二种写法更接近于 C 语言中的写法。BASH 中要求函数的定义必须在函数使用之前,这是和C 语言用头文件说明函数方法的不同。

(2)函数的参数与返回值

更进一步的问题是如何给函数传递参数和获得返回值。

参数:

BASH 中函数参数的定义并不需要在函数定义处就制定,而只需要在函数被调用时用BASH 的保留变量$1 $2 ... 来引用就可以了;

返回值:

BASH 的返回值可以用return 语句来指定返回一个特定的整数,如果没有return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为0,如果执行失败返回错误码)。函数的返回值在调用该函数的程序体中通过$? 保留字来获得。下面我们

就来看一个用函数来计算整数平方的例子:

#!/bin/bash

#定义函数

square() { #函数并不需要指定参数

#let或者expr来执行整数运算

let "res = $1 * $1"

return $res

}

square $1 #调用函数

result=$? # $?此保留字保存的是它之前最后一条语句的执行结果,这里是square $1 的执行是否成功的结果

echo $result # 显示出square $1的执行结果

exit 0 # 如果前面执行成功的话,以0值为返回值退出,即为该脚本的出口状态

3 BASH 中的特殊保留字

保留变量

随机数

运算符

变量的特殊操作

3.1保留变量

BASH 中有一些保留变量,下面列出了一些:

$IFS这个变量中保存了用于分割输入参数的分割字符,默认识空格。

$HOME 这个变量中存储了当前用户的根目录路径。

$PATH 这个变量中存储了当前Shell 的默认路径字符串。

$PS1表示第一个系统提示符。

$PS2表示的二个系统提示符。

$PWD表示当前工作路径。

$EDITOR 表示系统的默认编辑器名称。

$BASH 表示当前Shell 的路径字符串。

$0, $1, $2, ...

表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。$#表示脚本程序的命令参数个数或函数的参数个数。

$$表示该脚本程序的进程号,常用于生成文件名唯一的临时文件。

$?表示脚本程序或函数的返回状态值,正常为0,否则为非零的错误号。$*表示所有的脚本参数或函数参数。

$@和$* 涵义相似,但是比$* 更安全。

$!表示最近一个在后台运行的进程的进程号。

3.2随机数

随机数是经常要用到的,BASH 中也提供了这个功能,请看下面这个程序:

#!/bin/bash

# Prints different random integer from 1 to 65536

a=$RANDOM

echo $a

exit 0

这个程序可以在每次执行的时候随机的打印出一个大小在1 到65536 之间的整数。

3.3运算符

算术运算符

+ - * / % 表示加减乘除和取余运算

+= -= *= /= 同C 语言中的含义

位操作符

<< <<= >> >>= 表示位左右移一位操作

& &= | |= 表示按位与、位或操作

~ ! 表示非操作

^ ^= 表示异或操作

关系运算符

< > <= >= == != 表示大于、小于、大于等于、小于等于、等于、不等于操作

&& || 逻辑与、逻辑或操作

3.4变量的特殊操作--${var}的一些用法

BASH 中还有一些对变量的简洁、快速的操作,大家还记得"${var}" 和"$var" 同样是对变量的引用吧,对${var} 进行一些变化就可以产生一些新功能:

${var-default} 表示如果变量$var 还没有设置,则保持$var 没有设置的状态,并返回后面的默认值default。

${var=default} 表示如果变量$var 还没有设置,则取后面的默认值default。

${var+otherwise} 表示如果变量$var 已经设置,则返回otherwise 的值,否则返回空( null )。${var?err_msg} 表示如果变量$var 已经设置,则返回该变量的值,否则将后面的err_msg 输出到标准错误输出上。

请同学们自己尝试下面的例子:

#!/bin/bash

echo ${var?There is an error}

exit 0

还有下面一些用法,这些用法主要用于从文件路径字符串中提取有用信息:

${var#pattern}, ${var##pattern} 用于从变量$var 中剥去最短(最长)的和pattern 相匹配的最左侧的串。

${var%pattern}, ${var%%pattern} 用于从变量$var 中剥去最短(最长)的和pattern 相匹配的最右侧的串。

另外BASH 2 中还加入下面一些操作:

${var:pos} 表示去掉变量$var 中前pos 个字符。

${var:pos:len} 表示变量$var 中去掉前pos 个字符后的剩余字符串的前len 个字符。${var/pattern/replacement} 表示将变量$var 中第一个出现的pattern 模式替换为replacement 字符串。

${var//pattern/replacement} 表示将变量$var 中出现的所有pattern 模式全部都替换为replacment 字符串。

4.BASH中的其他高级问题

BASH 中对返回值的处理

用BASH 设计简单用户界面

在BASH 中读取用户输入

一些特殊的惯用法

BASH 程序的调试

关于BASH2

4.1 BASH 中对返回值的处理

无论是在Shell 中对BASH 脚本返回值的处理,还是在脚本中对函数返回值的处理,都是通过"$?" 系统变量来获得。BASH 要求返回值必须为一个整数,不能用return 语句返回字符串变量。

4.2用BASH 设计简单用户界面

BASH 中提供了一个小的语句格式,可以让程序快速的设计出一个字符界面的用户交互选择的菜单,该功能就是由select 语句来实现的,select 语句的语法为:

select var in

do

statments use $var

done

上面的语法结构在执行后,BASH 会将

中的所有项加上数字列在屏幕上等待用户选择,在用户作出选择后,变量$var 中就包含了那个被选中的字符串,然后就可以对该变量进行需要的操作了。我们可以从下面的例子中更直观的来理解这个功能:

大家可以试着执行上面的程序,看看是什么执行结果。

4.3在BASH 中读取用户输入

BASH 中通过read 函数来实现读取用户输入的功能,如下面这段程序:

#!/bin/bash

echo Please enter your name

read NAME

echo "Hi! $NAME !"

exit 0

上面这个脚本读取用户的输入,并回显在屏幕上。

另外BASH 中还提供另外一种称为here documents 的结构,可以将用户需要通过键盘输入的字符串改为从程序体中直接读入,如密码。下面的小程序演示了这个功能:

#!/bin/bash

passwd="aka@tsinghua"

ftp -n localhost <

user anonymous $passwd

binary

bye

FTPFTP

exit 0

这个程序在用户需要通过键盘敲入一些字符时,通过程序内部的动作来模拟键盘输入。请注意here documents 的基本结构为:

command <

statments

...

SOMESPECIALSTRING

这里要求在需要键盘输入的命令后,直接加上<<符号,然后跟上一个特别的字符串,在该串后按顺序输入本来应该由键盘输入的所有字符,在所有需要输入的字符都结束后,重复一遍前面<<符号后的“特别的字符串”即表示该输入到此结束。

4.4 一些特殊的惯用法

(1)()一对括号

在BASH 中()一对括号一般被用于求取括号中表达式的值或命令的执行结果,如:(a=hello; echo $a) ,其作用相当于`...` 。

(2):冒号--- 1空命令2求取后面变量的值

: 有两个含义,一是表示空语句,有点类似于C 语言中的单个";" 。表示该行是一个空命令,如果被用在while/until 的头结构中,则表示值0,会使循环一直进行下去,如下例:

while :

do

operation-1

operation-2

...

operation-n

done

linux+shell脚本语言基础知识

linux shell脚本语言基础知识 一.shell简介 Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的界面,更确切的说,shell是用户与Linux操作系统沟通的桥梁。用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。 shell是一个命令解释器,它从输入设备读取命令,再将其转为计算机可以了解的指令,然后执行它。在linux中,shell又不仅是简单的命令解释器,而且是一个全功能的编程环境。 Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell (/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell语言的语法有所不同,所以不能交换使用。每种Shell都有其特色之处,基本上,掌握其中任何一种就足够了。通常用Bash,也就是Bourne Again Shell进行编程。 二.shell使用 1.建立和运行shell程序 shell脚本程序:按照一定的语法结构把若干linux命令组织在一起,是这些命令按照我们的要求完成一定的功能。它可以进行类似程序的编写,并且不需要编译就能执行。(只需修改其权限) 像编写高级语言的程序一样,编写shell程序需要一个文本编辑器,如VI和VIM,通常使用VIM文本编辑器,支持更便利的插入模式。 首先使用VIM编辑器编辑一个hello.sh文件: #!/bin/bash #hello world example

shell 脚本入门笔记

#!/bin/bash 放在第一行用于告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。文件保存为**.sh。 执行方式: 1.chmod777 test.sh ./test.sh 2./bin/sh test.sh echo 用于向窗口输出文本 定义变量时,变量名不加$符号。 例如:your_name="https://www.docsj.com/doc/764434895.html," 还可以使用语句进行赋值: for file in `ls /etc` 或 for file in $(ls /etc) 以上语句将/etc 下目录的文件名循环出来。 使用变量 使用一个定义过的变量,只要在变量名前面加美元符号即可,如: your_name="qinjx"

echo $your_name echo ${your_name} 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,建议给所有变量加上花括号。 只读变量 readonly+变量名 删除变量 unset+变量名不能删除只读变量 Shell 字符串 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP 类似。 单引号 str='this is a string' 单引号字符串的限制: 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。 双引号 your_name='qinjx'

str="Hello, I know you are \"$your_name\"! \n" 双引号的优点: 双引号里可以有变量 双引号里可以出现转义字符 拼接字符串 your_name="qinjx" greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 获取字符串长度 string="abcd" echo ${#string} 输出4 提取子字符串 以下实例从字符串第2 个字符开始截取4 个字符:string="runoob is a great site" echo ${string:1:4} 输出unoo 查找子字符串

Shell脚本编写基础

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell 是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。可以说,shell使用的熟练程度反映了用户对Linux使用的熟练程度。 一、什么是shell 当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shel l(外壳)的程序。那么,shell是什么呢?确切一点说,shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell 来启动、挂起、停止甚至是编写一些程序。 当用户使用Linux时是通过命令来完成所需工作的。一个命令就是用户和shell之间对话的一个基本单位,它是由多个字符组成并以换行结束的字符串。shell解释用户输入的命令,就象DOS里的https://www.docsj.com/doc/764434895.html,所做的一样,所不同的是,在DOS中,https://www.docsj.com/doc/764434895.html,只有一个,而在Linux下比较流行的shell有好几个,每个shell都各有千秋。一般的Linux系统都将bash作为默认的shell。 二、几种流行的shell 目前流行的shell有ash、bash、ksh、csh、zsh等,你可以用下面的命令来查看你自己的shell类型: #echo $SHELL $SHELL是一个环境变量,它记录用户所使用的shell类型。你可以用命令: #shell-name 来转换到别的shell,这里shell-name是你想要尝试使用的shell的名称,如ash等。这个命令为用户又启动了一个shell,这个shell在最初登录的那个shell之后,称为下级的shell或子shell。使用命令: $exit 可以退出这个子shell。 使用不同的shell的原因在于它们各自都有自己的特点,下面作一个简单的介绍: 1.ash ash shell是由Kenneth Almquist编写的,Linux中占用系统资源最少的一个小shell,它只包含24个内部命令,因而使用起来很不方便。 2.bash bash是Linux系统默认使用的shell,它由Brian Fox和Chet Ramey共同完成,是Bourne Again Shell的缩写,内部命令一共有40个。Linux使用它作为默认的shell是因为它有诸如以下的特色: (1)可以使用类似DOS下面的doskey的功能,用方向键查阅和快速输入并修改命令。 (2)自动通过查找匹配的方式给出以某字符串开头的命令。 (3)包含了自身的帮助功能,你只要在提示符下面键入help就可以得到相关的帮助。 3.ksh ksh是Korn shell的缩写,由Eric Gisin编写,共有42条内部命令。该shell最大的优点是几乎和商业发行版的ksh完全兼容,这样就可以在不用花钱购买商业版本的情况下尝试商业版本的性能了。 4.csh

经典shell-脚本实例

Linux shell 脚本实例 1. 写一个脚本,利用循环计算10的阶乘#!/bin/sh factorial=1 for a in `seq 1 10` do factorial=`expr $factorial \* $a` done echo "10! = $factorial" 2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。 #!/bin/sh unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done ////////////////////////////////////////// #!/bin/sh unset var while [ "$var" != "end" ] do echo -n "please input a number: " read var if [ "$var" = "end" ] then break fi echo "var is $var" done 3. 写一个脚本,利用循环和continue关键字,计算100以内能被3整除的数之和 4.一个函数,利用shift计算所有参数乘积,假设参数均为整数 #! /bin/sh result=1 while [ $# -gt 0 ] do result=`expr $result * $1` shift done echo $result 5.写一个脚本,可以根据参数文件名,以正确的参数调用tar来解压缩tar.gz或tar.bz2文件。#!/bin/shcase ${1##*.tar.} in bz2) tar jxvf $1 ;; gz) tar zxvf $1 ;; *) echo "wrong file type"esac6.写一个脚本以方便用户查询rpm的相关信息。这个脚本首先提示用户选择查询依据,比如文件名,包名,全部等。然后提示用户选择查询信息,比如包名,包里所包含的所有文件,包的信息等。然后询问是否继续查询,是则循环刚才的过程,否则退出。

常用shell脚本

如何用脚本实现分割文件 #!/bin/bash if [ $# -ne 2 ]; then echo 'Usage: split file size(in bytes)' exit fi file=$1 size=$2 if [ ! -f $file ]; then echo "$file doesn't exist" exit fi #TODO: test if $size is a valid integer filesize=`/bin/ls -l $file | awk '{print $5}'` echo filesize: $filesize let pieces=$filesize/$size let remain=$filesize-$pieces*$size if [ $remain -gt 0 ]; then let pieces=$pieces+1 fi echo pieces: $pieces i=0 while [ $i -lt $pieces ]; do echo split: $file.$i: dd if=$file of=$file.$i bs=$size count=1 skip=$i let i=$i+1 done echo "#!/bin/bash" >; merge echo "i=0" >;>; merge echo "while [ $i -lt $pieces ];" >;>; merge echo "do" >;>; merge echo " echo merge: $file.$i" >;>; merge echo " if [ ! -f $file.$i ]; then" >;>; merge echo " echo merge: $file.$i missed" >;>; merge

Shell脚本编程详解-吐血共享

第12章 Shell 脚本编程 ● Shell 命令行的运行 ● 编写、修改权限和执行Shell 程序的步骤 ● 在Shell 程序中使用参数和变量 ● 表达式比较、循环结构语句和条件结构语句 ● 在Shell 程序中使用函数和调用其他Shell 程序 12-1 Shell 命令行书写规则 ◆ Shell 命令行的书写规则 对Shell 命令行基本功能的理解有助于编写更好的Shell 程序,在执行Shell 命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例如: [root@localhost root]# ls a* -l;free;df 长Shell 命令行可以使用反斜线字符(\)在命令行上扩充,例如: [root@localhost root]# echo “ this is \ >long command ” This is long command 注意: “>”符号是自动产生的,而不是输入的。 12-2 编写/修改权限及执行Shell 程序的步骤 ◆ 编写Shell 程序 ◆ 执行Shell 程序 Shell 程序有很多类似C 语言和其他程序设计语言的特征,但是又没有程序语言那样复杂。Shell 程序是指放在一个文件中的一系列Linux 命令和实用程序。在执行的时候,通过Linux 操作系统一个接一个地解释和执行每条命令。首先,来编写第一个Shell 程序,从中学习Shell 程序的编写、修改权限、执行过程。

12-2-1 编辑Shell程序 编辑一个内容如下的源程序,保存文件名为date,可将其存放在目录/bin下。 [root@localhost bin]#vi date #! /bin/sh echo “Mr.$USER,Today is:” echo &date “+%B%d%A” echo “Wish you a lucky day !” 注意: #! /bin/sh通知采用Bash解释。如果在echo语句中执行Shell命令date,则需要在date 命令前加符号“&”,其中%B%d%A为输入格式控制符。 12-2-2 建立可执行程序 编辑完该文件之后不能立即执行该文件,需给文件设置可执行程序权限。使用如下命令。[root@localhost bin]#chmod +x date 12-2-3 执行Shell程序 执行Shell程序有下面三种方法: 方法一: [root@localhost bin]#./ date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法二: 另一种执行date的方法就是把它作为一个参数传递给Shell命令: [root@localhost bin]# Bash date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day ! 方法三: 为了在任何目录都可以编译和执行Shell所编写的程序,即把/bin的这个目录添加到整个环境变量中。 具体操作如下: [root@localhost root]#export PATH=/bin:$PATH [root@localhost bin]# date Mr.root,Today is: 二月 06 星期二 Wish you a lucky day !

常用shell脚本指令

常用shell脚本命令 1、显示包含文字aaa的下一行的内容: sed -n '/aaa/{n;p;}' filename 2、删除当前行与下一行的内容: sed -i '/aaa/{N;d;}' filename 3、删除当前行与下两行的内容: sed -i '/aaa/{N;N;d;}' filename 依次类推,删除三行,则为{N;N;N;d;},分析知:N为next 4、得出以空格为分割的字符串中单词的个数,即统计个数: awk ' { print NF } ' 如显示字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f 则执行 echo $VALUE | awk ' { print NF } ' 后的结果为6 5、在linux中建立一个文件与另一文件的链接,即符号链接 ln -s /var/named/chroot/etc/named.conf named.conf 这要就建立了当前目录的文件named.conf对/var/named/chroot/etc/named.conf 的符号链接。即操作named.conf就意味着操作实际文件/var/named/chroot/etc/named.conf ,这时用ll命令查看的结果如: lrwxrwxrwx 1 root root 32 Mar 22 12:29 named.conf -> /var/named/chroot/etc/named.conf 注意:当用sed来通过named.conf来删除一部分信息时,会将符号链接的关系丢掉,即会将named.conf变成一个实际文件。所以需对实际文件进行删除操作。 6、显示指定字符范围内的内容: 如:显示文件test.txt中字符#test begin与#test end之间所有的字符 sed -n "/#test begin/,/#test end/p" test.txt 或 awk "/#test begin/,/#test end/" test.txt 在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则. 1. 单引号和双引号的区别 单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符,不会作变量的引用,直接输出字符窜。请看如下例子: [root@linux ~]# name=HaHa [root@linux ~]# echo $name HaHa [root@linux ~]# myname="$name is wow" [root@linux ~]# echo $myname HaHa is wow [root@linux ~]# myname='$name is wow'

Linux常用的系统监控shell脚本

https://www.docsj.com/doc/764434895.html,下面是我常用的几个Linux系统监控的脚本,大家可以根据自己的情况在进行修改,希望能给大家一点帮助。 1、查看主机网卡流量 1.#!/bin/bash 2. 3.#network 4. 5.#Mike.Xu 6. 7.while : ; do 8. 9.time=’date +%m”-”%d” “%k”:”%M’ 10. 11.day=’date +%m”-”%d’ 12. 13.rx_before=’ifconfig eth0|sed -n “8″p|awk ‘{print $2}’|cut -c7-’ 14. 15.tx_before=’ifconfig eth0|sed -n “8″p|awk ‘{print $6}’|cut -c7-’ 16. 17.sleep 2 18. 19.rx_after=’ifconfig eth0|sed -n “8″p|awk ‘{print $2}’|cut -c7-’ 20. 21.tx_after=’ifconfig eth0|sed -n “8″p|awk ‘{print $6}’|cut -c7-’ 22. 23.rx_result=$[(rx_after-rx_before)/256] 24. 25.tx_result=$[(tx_after-tx_before)/256] 26. 27.echo “$time Now_In_Speed: “$rx_result”kbps Now_OUt_Speed: “$tx_result”kbps” 28. 29.sleep 2 30. 31.done 2、系统状况监控 1.#!/bin/sh 2. 3.#systemstat.sh

个人整理shell脚本编程笔记

shell脚本编程学习笔记(一) 一、脚本格式 vim shell.sh #!/bin/bash//声明脚本解释器,这个‘#’号不是注释,其余是注释 #Program://程序内容说明 #History://时间和作者 二、shell变量的种类 用户自定义变量:由用户自己定义、修改和使用 与定义变量:Bash与定义的特殊变量,不能直接修改 位置变量:通过命令行给程序传递执行的参数 1、定义变量: 变量名要以英文字母或下划线开头,区分大小写。 格式:变量名=值 输出变量:echo $变量名 2、键盘输入为变量内容: 格式:read [-p "信息"] 变量名 如:read -p "pewase input your name:" name 3、不同引号对变量的作用 双引号"":可解析变量,$符号为变量前缀。 单引号'':不解析变量,$为普通字符。 反引号``:将命令执行的结果输出给变量。 三、shell条件测试 1、test命令: 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数字。 格式:test 条件表达式[ 条件表达式] (注意:[]与表达式之间存在空格) 2、常见的测试类型: 测试文件状态 格式:[ 操作符文件或目录] 如:if [ -d /etc ] then echo "exists" else echo "not exists" fi 常见的测试操作符: -d:测试是否为目录 -e:测试目录或文件是否存在 -f:测试是否为文件 -r:测试当前用户是否有读权限 -w:测试当前用户是否有写权限 -x:测试当前用户是否有执行权限

很实用的Shell脚本(实践版)

很实用的Shell脚本(实践版)

/erpHome/shell/old/$1/$2.zip.old find . -mtime +7 | xargs nice -n 20 zip -qm /erpHome/shell/old/$1/$2_$DayOfWeek.zip # find . -mtime +7 Fi archiveOld2.sh . /erpHome/shell/setP.sh export DayOfWeek=`date +"%u"`

if test "$#" -lt 1 || test -z "$1" then echo At least one argument needed. exit fi if test ! -e "$ShellHome/old/$1" then cd $ShellHome/old/ mkdir -p $1 fi if test ! -e "$ERPHome/$1" then echo "$ERPHome/$1" "does not exist" exit fi cd $ERPHome/$1 mv $ShellHome/old/$1_$DayOfWeek.zip $ShellHome/old/$1.zip.old find . -mtime +7 -type f | xargs nice -n 20 zip -qm $ShellHome/old/$1_$DayOfWeek.zip #find . -mtime +7 -type f

archiveOldAll.sh /erpHome/shell/archiveOld.sh work/dr/engine jrprint /erpHome/shell/archiveOld.sh work/de tmp /erpHome/shell/archiveOld2.sh public

Shell脚本的特殊符号

这篇文章主要介绍了shell脚本中常见的一些特殊符号和它的作用详解,总结的很简洁,容易看懂,需要的朋友可以参考下 在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1、{} 大括号: 用法一:通配符扩展 eg: ls my_{finger,toe}s 这条命令相当于如下命令的组合: ls my_fingers my_toes eg: mkdir {userA,userB,userC}-{home,bin,data} 我们将得到userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data,use rC-home, userC-bin, userC-data,这几个目录。 用法二:可用于语句块的构造,语句之间用回车隔开。如果你想在某些使用单个语句的地方(比如在AND或OR列表中)使用多条语句,你可以把它们括在花括号{}中来构造一个语句块。 eg: { grep -v “$cdcatnum” $strack_file > $temp_file cat $temp_file > $strack_file echo cat -n file1 } (注:以上大括号中的四句命令够成了一个语句块) 用法三:参数扩展 ${name:-default} 使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量na me; ${name:=default}使用指定值来代替空的或者没有赋值的变量name; ${name:?message}如果变量为空或者未赋值,那么就会显示出错误信息并中止脚本的执行同时返回退出码1。 ${#name} 给出name的长度 ${name%word} 从name的尾部开始删除与word匹配的最小部分,然后返回剩余部分${name%%word} 从name的尾部开始删除与word匹配的最长部分,然后返回剩余部分${name#word} 从name的头部开始删除与word匹配的最小部分,然后返回剩余部分${name##word} 从name的头部开始删除与word匹配的最长部分,然后返回剩余部分

shell脚本之前的基础知识

第十二章学习shell脚本之前的基础知识 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员。目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目。有的单位甚至用shell脚本的编写能力来衡量这个linux系统管理员的经验是否丰富。笔者讲这些的目的只有一个,那就是让你认真对待shell脚本,从一开始就要把基础知识掌握牢固,然后要不断的练习,只要你shell脚本写的好,相信你的linux求职路就会轻松的多。笔者在这一章中并不会多么详细的介绍shell脚本,而只是带你进入shell脚本的世界,如果你很感兴趣那么请到网上下载相关的资料或者到书店购买相关书籍吧。 在学习shell 脚本之前,需要你了解很多关于shell的知识,这些知识是编写shell脚本的基础,所以希望你能够熟练的掌握。 【什么是shell】 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些。回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。 笔者接触的linux发布版本(Redhat/CentOS)系统默认安装的shell叫做bash,即Bourne Again Shell,它是sh(Bourne Shell)的增强版本。Bourn Shell 是最早行起来的一个shell,创始人叫Steven Bourne,为了纪念他所以叫做Bourn Shell,检称sh。那么这个bash有什么特点呢? 1)记录命令历史 我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。有一点需要你知道的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。 与命令历史有关的有一个有意思的字符那就是”!”了。常用的有这么几个应用:(1)!! (连续两个”!”),表示执行上一条指令;(2)!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令;(3)!字符串(字符串大于等于1),例如!ta,表示执行命令历史中最近一次以ta为开头的指令。

Linux Shell脚本结构解析以及常用语句说明_总体了解

目录 2 BASH 的基本语法 (2) 2.1最简单的例子—— Hello World! (2) 2.2关于输入、输出和错误输出 (3) 2.3BASH 中对变量的规定(与C 语言的异同) (5) 2.3.1BASH 中的变量介绍 (5) 2.3.1.1简单变量 (5) 关于变量,我们需要注意下面几点: (6) 在比较操作上,整数变量和字符串变量各不相同,详见下表: (7) 列出了BASH 中用于判断文件属性的操作符,见下表: (7) 2.3.1.2关于局部变量 (8) 2.3.2 BASH中的变量与C 语言中变量的区别 (9) 2.4 BASH 中的基本流程控制语法 (9) 2.4.1 if...then...else (9) 2.4.2 for (10) 2.4.3 while (12) 2.4.4 until (12) 2.4.5 case (12) 2.4.6 break/continue (14) 2.5函数的使用 (14) (1)函数的定义 (14) (2)函数的参数与返回值 (14) 3 BASH 中的特殊保留字 (15) 3.1保留变量 (15) 3.2随机数 (16) 3.3运算符 (16) 3.4变量的特殊操作--${var}的一些用法 (17) 4.BASH中的其他高级问题 (17) 4.1 BASH 中对返回值的处理 (18) 4.2用BASH 设计简单用户界面 (18)

4.3在BASH 中读取用户输入 (19) 4.4 一些特殊的惯用法 (20) (1)() 一对括号 (20) (2):冒号--- 1空命令2求取后面变量的值 (20) 4.5 BASH 程序的调试 (21) 4.6 关于BASH2 (21) 2 BASH 的基本语法 最简单的例子——Hello World! 关于输入、输出和错误输出 BASH 中对变量的规定(与C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1最简单的例子——Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解BASH。 用vi 编辑器编辑一个hello 文件如下: #!/bin/bash -----#!表示此文件为可执行脚本文件,后边跟的是该文件所用的命令解释器# This is a very simple example-----#注释语句 echo Hello World 这样最简单的一个BASH 程序就编写完了。这里有几个问题需要说明一下: 一,第一行的#! 是什么意思 二,第一行的/bin/bash 又是什么意思 三,第二行是注释吗 四,echo 语句 五,如何执行该程序 #! 是说明hello 这个文件的类型的,有点类似于Windows 系统下用不同文件后缀来表示

shell脚本中一些常见的特殊符号

shell脚本中一些常见的特殊符号 https://www.docsj.com/doc/764434895.html,/blog-15563-5823.html 在编写Shell脚本时,我们需要会用到各种各样的特殊符号,通过这些特殊符号可以使我们编写的代码更加简洁和高效,这里给大家汇总下: 1、{} 大括号: 用法一:通配符扩展 eg: ls my_{finger,toe}s 这条命令相当于如下命令的组合: ls my_fingers my_toes eg: mkdir {userA,userB,userC}-{home,bin,data} 我们将得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data,userC-home, userC-bin, userC-data,这几个目录。 用法二:可用于语句块的构造,语句之间用回车隔开。如果你想在某些使用单个语句的地方(比如在AND或OR列表中)使用多条语句,你可以把它们括在花括号{}中来构造一个语句块。 eg: { grep -v “$cdcatnum” $strack_file > $temp_file cat $temp_file > $strack_file echo cat -n file1 } (注:以上大括号中的四句命令够成了一个语句块) 用法三:参数扩展 ${name:-default} 使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量name;${name:=default}使用指定值来代替空的或者没有赋值的变量name; ${name:?message}如果变量为空或者未赋值,那么就会显示出错误信息并中止脚本的执行同时返回退出码1。 ${#name} 给出name的长度 ${name%word} 从name的尾部开始删除与word匹配的最小部分,然后返回剩余部分${name%%word} 从name的尾部开始删除与word匹配的最长部分,然后返回剩余部分${name#word} 从name的头部开始删除与word匹配的最小部分,然后返回剩余部分${name##word} 从name的头部开始删除与word匹配的最长部分,然后返回剩余部分 (注,name为变量名,word为要匹配的字符串) 用法三在处理字符串和未知变量时,是很有用的。 2、[] 中括号: 用法一:通配符扩展: 允许匹配方括号中任何一个单个字符 eg: ls /[eh][to][cm]* 相当于执行 ls /etc /home(若有/eom目录,就相当于会执行ls /etc /home /eom) 注:在mkdir命令下不能扩展 用法二:用于条件判断符号: []符号可理解为指向test命令的一个软链接,所以其用法可完全参照test,将test位置替换为[便可。eg: if [ “$?” != 0 ] 等价于 if test “$?” != 0 then echo “Executes error”

shell脚本常用命令

1.目录相关操作: cd [相对路径或绝对路径]切换目录。例:cd /var/spool/mail 将切换到/var/spool/mail 目录下去,可以使用相对路径或绝对路径,cd ..是返回上一层目录,cd ~是返回自己的主目录,cd –代表前一个工作目录 pwd显示目前所在目录 mkdir [-mp] 目录名称新建新的目录.–m配置文件案的权限,-p直接建立多层目录 rmdir [-p] 目录名称删除空的目录. –p连同上一层”空的”目录也一并删除 ls [-aAdfFhilnrRSt] 目录名称 ls [--color={never,auto,always}] 目录名称 ls [--full-time] 目录名称查看文件与目录: -a全部的文件,连同隐藏文件一起列出; -A 列出全部文件(连同隐藏文件,但不列出..和.这两个目录); -d仅列出目录本身,而不是列出目录内的文件数据; -f直接列出结果,而不进行排序; -F 根据文件、目录等信息给予附加数据结构; -h 将文件容量以易读的方式列出; -i 列出inode号码; -l 列出长数据串,包含文件的属性与权限等数据; -n列出UID与GID,而非用户与用户组的名称; -r 将排序结果反向输出; -R 连同子目录内容一起列出; -S 以文件容量大小排序,而不是用文件名排序; -t 依据时间排序,而不是文件名排序; --color=never不要依据文件特性给予颜色显示; --color=always 显示颜色; --color=auto 让系统自行依据设置来判断是否给予颜色; --full-time 以完整时间模式输出; --time={atime,ctime} 输出访问时间或改变权限属性时间而非内容改变时间;

linux Shell(脚本)编程入门 实例讲解详解

linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash 的大姐,bourne shell中运行)。 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。程序必须以下面的行开始(必须方在文件的第一行): 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: 然后,您可以通过输入: ./filename 来执行您的脚本。 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:

shell脚本

Shell编程教程 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 总的来说shell有两种含义: 1 命令:是用户与系统之间的桥梁 2 语言:可以使用shell语法以及命令来进行各种小程序的编写,类似于windows下的.bat(批处理文件) 下面,让我们一起来看看shell是如何工作的: 编写一个shell需要三个步骤 A 建立shell程序 B 改变shell程序属性chmod +x shell pro C 运行shell程序在当前路径下 ./shell pro a建立shell脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且

很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash的大姐,bourne shell中运行)。 如同其他语言一样,通过我们使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写我们的shell程序。 程序必须以下面的行开始(必须放在文件的第一行):# !/bin/bash******** # This is a sample programe # Author:esnow # Date:2002-03-10 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/bash来执行程序。 b 改变shell脚本属性 当编辑好脚本时,如果要执行该脚本,还必须使其可执行。 要使脚本可执行: chmod +x filename c运行shell脚本 然后,您可以通过输入: ./filename 来执行您的脚本。

linux实验五、Shell脚本程序编制实验

实验五Shell脚本程序编制实验 ●编写一个Shell命令脚本程序的基本步骤如下: ●(1)编辑包含用户命令脚本程序的文本文件 ●(2)添加Shell定义语句,使Linux操作系统可以知道用户使用哪一种Shell ●(3)编写Shell命令脚本程序内容 ●(4)保存脚本程序并退出。用“chmod +x ”命令改变该脚本程序的存取权限和执行 权限,使其可以被适当的用户使用。 ●(5)运用该命令脚本程序以进行测试 ●(6)如有必要,可进行程序纠错。 ●(7)如有必要,可把完整的命令脚本程序移动到相应位置 ●(8)如有必要,可在path语句中加上此脚本的路径 练习:编写书本P107welcome Shell脚本程序 运行脚本程序的三种方法: a.bash 脚本文件名 b.bash < 脚本文件名 c.chmod u(或g,o,a)+x 脚本文件名#为脚本添加执行权限 Shell定义的环境变量shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,这些变量用户还可以重新定义,常用的shell环境变量有: ●HOME:用于保存注册目录的完全路径名。 ●PATH:用于保存用冒号分隔的目录路径名,shell将按PATH变量中给出的顺序搜 索这些目录,找到的第一个与命令名称一致的可执行文件将被执行。 ●TERM:终端的类型。 ●UID:当前用户的标识符,取值是由数字构成的字符串。 ●PWD:当前工作目录的绝对路径名,该变量的取值随cd命令的使用而变化。 ●PS1:主提示符,在特权用户下,缺省的主提示符是“#”,在普通用户下,缺省的 主提示符是“$”。 ●PS2:在shell接收用户输入命令的过程中,如果用户在输入行的末尾输入“\”然后 回车,或者当用户按回车键时shell判断出用户输入的命令没有结束时,显示这 个辅助提示符,提示用户继续输入命令的其余部分,缺省的辅助提示符是“>”。练习:使用echo显示上述环境变量内容 注意:PS1 提示符设定标记: ●\d 日期 ●\H 完整主机名\h 主机名第一段 ●\t 24小时时间\T 12小时时间 ●\u 用户名 ●\V Bash版本信息 ●\w 完整的工作路径\W 最后一层目录名 ●\# 下达的第几个命令 ●\\$ 提示符(root $,普通用户#) 练习:输入以下命令,思考设置PS1环境变量的作用 PS1=?\u-\w(\#)\\$? PS1=[\u@\h \W]\\$

Shell脚本学习指南笔记

入门 Shell脚本最常用于系统管理工作,或者用于结合现有的程序以完成小型、特定的工作。 脚本编程语言与编译型语言的差异 许多中、大型程序都是编译型语言,如Fortran、Ada、C、C++或者Java(有些特殊)。这类程序只要从源代码(Source Code)转换成目标代码(Object Code)便能直接通过计算机执行。这样的好处是高效,缺点是它们多半运行于底层,处理的是字节、数字或是机器层级的对象,很难进行“将一个目录里所有文件复制到另一个目录中”这类对文件的简单操作。 脚本语言通常是解释型(interpreted)的,由解释器(interpreter)读入程序代码,将其转换成内部形式。好处是它们多半运行在比编译型语言高的层次,能够轻易处理文件与目录之类的对象,缺点是效率不如编译型。但是编写更快,而且目前的速度也已经足够快,常用脚本语言有:awk、Perl、Python、Ruby与Shell。Shell的特点有: 1.简单性 2.可移植性 3.开发容易 一个简单的脚本 who命令可以知道系统有谁登陆,如果有很多用户在登陆,结果会很长,可以使用wc(字数统计)命令,算出行数(line)、字数(word)和字符数(character)。可以使用wc –l,只计算出行数$ who | wc –l | 管道符号可以在两个命令之间建立管道(pipeline):who的输出成为了wc的输入。下面就写一个shell脚本将管道转变成一个独立的命令。 其实在Shell中开发周期很类似,先直接在命令行上测试,之后写入到独立的脚本中。 第一行的#! 当Shell执行一个程序时,要求Unix内核启动一个新的进程(process),在该进程里执行指定的程序。内核知道怎样为编译型程序执行,但Shell是解释型程序,当Shell要求内核执行时,内核无法执行,会回应”not executable format file”不是可执行的格式文件的错误信息。Shell收到此错误信息时,就会确定不是编译型程序,是Shell脚本,接着会启动一个新的/bin/sh副本来执行该程序。 在当前有很多种Shell,需要通过第一行#!来指定用哪个Shell来执行。一般如下: #! 解释器地址选项 比如标准的Shell脚本: #! /bin/sh

相关文档