当前位置:文档之家› Shell语法

Shell语法

Shell语法
Shell语法

Shell编程

在DOS中,你可能会从事一些例行的重复性工作,此时你会将这些重复性的命令写成批处理文件,只要执行这个批处理文件就等于执行这些命令。大家会问在UNIX中是否有批处理这个东东,答案是有的。在UNIX中不只有如DOS的批处理,它的功能比起DOS的批处理更强大,相对地也较复杂,已经和一般的高级语言不相上下。在UNIX中大家都不叫做批处理文件,而叫做Shell Script。

一般而言,Shell Script的地位和其它的可执行文件(或命令)是完全相同的,只不过Shell Script是以文本文件的方式储存,而非二进制文件。而执行Shell Script时,必须有一个程序将其内容转成一道道的命令执行,而这个程序其实就是Shell ,这也就是为什么我们叫它做Shell Script的原因(往后我们称为Script)。不同Shell 的Script基本上会有一些差异,所以我们不能将写给Bourne shell 的Script用C shell 执行。而在UNIX中大家最常使用Bourne Shell以及C Shell ,所以这堂课就介绍这两种Script的写法。

One、将文本文件设为可执行的Shell Script

如果我们已经写好Script,如何将其设成可执行文件呢?因为Script其实是一个可执行文件,所以必须将其存取权限设定成可执行。我们可以使用下列命令更改存取权限:chmod u+x filename 只有自己可以执行,其它人不能执行

chmod ug+x filename 只有自己以及同一群可以执行,其它人不能执行

chmod +x filename 所有人都可以执行

chmod 744 filename

Two、使用那一个Shell

而我们如何指定使用那一个Shell 来解释所写的Script呢?几种基本的指定方式如下所述:

(1)如果Script的第一个非空白字元不是"#",则它会使用Bourne Shell。

(2)如果Script的第一个非空白字元是"#"时,但不以"#!"开头时,则它会使用C Shell。

(3)如果Script以"#!"开头,则"#!"後面所写的就是所使用的Shell,而且要将整个路径名称指出来。

这里建议使用第三种方式指定Shell ,以确保所执行的就是所要的。Bourne Shell的路径名称为/bin/sh ,而C Shell 则为/bin/csh。

除了在Script内指定所使用的Shell 外,你也可以在命令列中强制指定。比如你要用C Shell 执行某个Script,你可以下这个命令:

csh filename

此时的Script的存取权就不一定要为可执行文件,其内部所指定的Shell 也会无效,详细的情形後面会讨论。

Three、Script的基本结构及观念

Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每一行可以是命令、注解、或是流程控制指令等。如果某一行尚未完成,可以在行末加上"\" ,这个时候下一行的内容就会接到这一行的後面,成为同一行,如下:

当Script中出现"#" 时,在它後面的同一行文字即为注解,Shell 不会对其翻译。

在Script中要执行一个命令的方法和在命令行中一样,你可以前台或后台执行,执行命令时也会需要设定一些环境变量。

Script的流程控制和一般高级语言的流程控制没有什么两样,也和高级语言一样有子程序。这些使得Script的功能更加强大。

为了达到与高级语言相同的效果,我们也可以在Script中设定变量,如此使Script 成为名付其实的高级语言。

Four、Bourne Shell

一、变量

Bourne Shell的变量类型只有字串变量,所以要使用数值运算则必须靠外部命令达成目的。而其变量种类有下列几种:

1. 使用者变量

这是最常使用的变量,我们可以任何不包含空白字符的字串来当做变量名称。设定变量值时则用下列方式:

var=string

取用变量时则在变量名称前加上一“$”号。

结果如下:

name

Tom

示范:例1

2. 系统变量(环境变量)

和使用者变量相似,只不过此种变量会将其值传给其所执行的命令。要将一使用者变量设定为系统变量,只要加上:

export var

以下是使用者一进入系统之後就已设定好的系统变量:

$HOME 使用者自己的目录

$PA TH 执行命令时所搜寻的目录

$TZ 时区

$MAILCHECK 每隔多少秒检查是否有新的信件

$PS1 在命令列时的提示号

$PS2 当命令尚未打完时,Shell 要求再输入时的提示号

$MANPATH man 指令的搜寻路径

tip Windows 2000的环境变量设置:打开控制面板,双击“系统”,选择“高级”中的“环境变量”。

3. 只读的使用者变量

和使用者变量相似,只不过这些变量不能被改变。要将使用者变量设成只读的,只要加上:

readonly var

而若只打readonly则会列出所有只读的变量。还有一点,系统变量不可以设定成只读的。

结果如下:

Tom

name: is read only

readonly name

readonly ......

4. 特殊变量

有些变量是一开始执行Script时就会设定,并且不以加以修改,但我们不叫它只读的系统变量,而叫它特殊变量(有些书会叫它只读的系统变量),因为这些变量是一执行程序时就有了,况且使用者无法将一般的系统变量设定成只读的。以下是一些等殊变量:

$0 这个程序的执行名字

$n 这个程序的第n个参数值,n=1..9

$* 这个程序的所有参数

$# 这个程序的参数个数

$$ 这个程序的PID

$! 执行上一个背景指令的PID

$? 执行上一个指令的返回值

当你执行这个程序时的参数数目超过9 个时,我们可以使用shift 命令将参数往前移一格,如此即可使用第10个以後的参数。除此之外,可以用set 命令改变$n及$*,方法如下:set string

如此$*的值即为string,而分解後则会放入$n。如果set 命令後面没有参数,则会列出所有已经设定的变量以及其值。

结果如下:

Filename: ex1

Arguments: this is a test

No. of args.: 4

2nd arg.: is

No. of args.: 3

2nd arg.: a

Arguments: hello, everyone

2nd arg.: everyone

值得一提的是,当你想从键盘输入一变量值时,你可以使用下面的命令:

read var1 var2.....

这时read会将一个字分给一个变量。如果输入的字比变量还多,最後一个变量会将剩下的字当成其值。如果输入的字比变量还少,则後面的变量会设成空字串。如果需要处理数值运算,我们可以使用expr命令。其参数及输出列於附录A。

二、执行命令

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

1. 直接下命令

这个方式和在命令列中直接下命令的效果一样。

2. 使用sh命令

sh command

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

3. 使用"."命令

. command

这时和使用sh命令相似,只不过它不像sh一般会产生新的process ,相反地,它会在原有的process 下完成工作。

4. 使用exec命令

exec command

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

5. 使用命令替换

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

结果如下:

Current directory is /users/cc/mgtsai

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

number=`expr $number + 1`

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

增量计数

expr在循环中用于增量计算。首先,循环初始化为0,然后循环值加1,反引号的用法意即替代命令。最基本的一种是从(expr)命令接受输出并将之放入循环变量。

三、流程控制

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

test $# = 0

如果执行这个程序没有参数时,会传回非零值代表"$# = 0"这个条件成立。反之则会传回零。

以下介绍各种流程控制:

1. if then语法以及流程图如下

if (condition) then

commands

fi

condition 是一个test命令。往後所介绍的各种流程中的condition 都是test 命令。

$ chkarg Hello

Arg1: Hello

2. if then else语法以及流程图如下

if (condition) then

commands

else

commands

fi

3. if then elif语法以及流程图如下

if (condition1) then

commands1

elif (condition2) then

commands2

else

commands3

fi

4. for in语法以及流程图如下

for var in arg-list

do

commands

done

结果如下:

xx

yy

zz

5. for语法以及流程图如下

for var

do

commands

done

$lstarg xx yy zz

xx

yy

zz

结果如下:

xx

yy

zz

6. while 语法以及流程图如下

while (condition)

do

commands

done

结果如下:

1

2

3

4

5

6

7

8

结果如下:

0123456789

7. until语法以及流程图如下

until (condition)

do

commands

done

它和while 的不同只在於while 是在条件为真时执行循环,而until 是在条件为假时执行循环。

8. break及continue

这两者是用於for, while, until 等循环控制下。break 会跳至done後方执行,而continue会跳至done执行,继续执行循环。

9. case语法以及流程图如下

case str in <str=pat1>————commands1—┐

pat1) commands1;; │FALSE TRUE │

pat2) commands2;; <str=pat2>————commands2—┤

pat3) commands3;; │FALSE TRUE │

esac <str=pat3>————commands3—┤

而pat 除了可以指定一些确定的字串,也可以指定字串的集合,如下

* 任意字串

? 任意字元

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

[a-n] 从a到n的任一字元

| 多重选择

结果如下:

Five、Shell 程序的跟踪

调试shell程序的主要方法是利用shell命令解释程序的“-v”或“-x”选项来跟踪程序的执行。“-v”选择项使shell在执行程序的过程中,把它读入的每一个命令行都显示出来,而“-x”选择项使shell在执行程序的过程中把它执行的每一个命令在行首用一个“+”加上命令名显示出来。并把每一个变量和该变量所取的值也显示出来,因此,它们的主要区别在于:在执行命令行之前无“-v”则打印出命令行的原始内容,而有“-v”则打印出经过替换后的命令行的内容。

除了使用shell的“-v”和“-x”选择项以外,还可以在shell程序内部采取一些辅助调试的措施。例如,可以在shell程序的一些关键地方使用echo命令把必要的信息显示出来,它的作用相当于C语言中的printf语句,这样就可以知道程序运行到什么地方及程序目前的状态。

例:

$ sh -v ex0 aa ss

$ sh -x ex0 aa ss

附录Aexpr命令

命令格式:

expr expression

叙述

expression是由字串以及运算子所组成,每个字串或是运算子之间必须用空白隔开。下表是运算子的种类及功能,而优先顺序则以先後次序排列,我们可以利用小括号来改变运算的优先次序。其运算结果则输出至标准输出上。

: 字串比较。比较的方式是以两字串的第一个字母开始,而以第二个字串的

字母结束。如果相同时,则输出第二个字串的字母个数,如果不同时则传

回0 。

* 乘法

/ 除法

% 取馀数

+ 加法

- 减法

< 小於

<= 小於等於

= 等於

!= 不等於

>= 大於等於

> 大於

& AND运算

| OR运算

当expression中含有"*", "(", ")" 等符号时,必须在其前面加上"\" ,以免被Shell 解释成其它意义。

expr 2 \* \( 3 + 4 \) 其输出为14

附录Btest命令

命令格式:

test expression

叙述

expression中包含一个以上的判断准则以作为test评诂的标准。两准则间用"-a"代表逻辑AND 运算,"-o"代表逻辑OR运算,而在准则前放置一"!" 代表NOT 运算。如果没有括号,则优先权则为"!" > "-a" > "-o" 。和expr命令相同,相使用左右括号时,必须在其前面加上"\" 。以下是有关准则的叙述(合叙述时传回真,否则传回伪):

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 文件为非空的一般文件

test -r "$filename" -a -s "$filename"

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.doczj.com/doc/749025209.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-脚本实例

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脚本编写基础

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.doczj.com/doc/749025209.html,所做的一样,所不同的是,在DOS中,https://www.doczj.com/doc/749025209.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脚本

如何用脚本实现分割文件 #!/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编程实验指导

Shell编程实验 一、实验目的 了解 Shell 的作用和主要分类。 了解 Bash的一般语法规则。 练习编写简单的shell程序。 二、实验内容 1.Shell变量的定义及其使用。 2.位置参数和环境变量。 3.Shell中的特殊字符。 4.条件判断结构与循环结构 5.函数的定义和使用 三、预备知识 1、LINUX环境下常用命令和VI编辑器的操作。 2、了解Shell作用和主要分类等基础知识。 四、实验设备及工具 软件:PC机操作系统REDHAT ELAS4环境 五、实验原理及说明 Shell是Linux系统中一个重要的层次,它是用户与系统交互作用的界面。在介绍Linux 命令时,Shell都作为命令解释程序出现:它接收用户打入的命令,进行分析,创建子进程实现命令所规定的功能,等子进程终止工作后,发出提示符。这是Shell最常见的使用方式。 Shell 除了作为命令解释程序以外,还是一种高级程序设计语言,它有变量,关键字,有各种控制语句,如if, case, while, for 等语句,有自己的语法结构。利用Shell程序设计语言可以编写出功能很强、但代码简单的程序,特别是它把相关的Linux命令有机地组合在一起,可大大提高编程的效率,充分利用Linux系统的开放性能,设计出适合自己要求的命令。

六、实验步骤 1.语法练习 (1) Shell变量 Shell有两种变量:环境变量和临时变量。在Shell脚本中临时变量又分为两类:用户定义的变量和位置参数。 ?用户定义的变量 用户定义的变量是最普遍的Shell变量,变量名是以字母或下化线打头的字母、数字和下线符序列,并且大小写字母意义不同。变量名的长度不受限制。定义变量并赋值的一般形式是:变量名=字符串例如, MYFILE=/usr/meng/ff/m1.c a.定义并显示变量的值 在程序中使用变量的值时,要在变量名前面加上一个符号“$”。这个符号告诉Shell,要读取该变量的值。 练习1.1: b.read命令 作为交互式输入手段,可以利用read命令由标准输入(即键盘)上读取数据,然后赋给指定的变量。其一般格式是:read 变量1 [变量2...] 练习1.2: 利用read命令可交互式的为变量两赋值。输入数据时,数据间以空格或制表符作为分隔符。注意以下情况: *若变量个数与给定数据个数相同,则依次对应赋值,如上面例子所示。 *若变量数少于数据个数,则从左至右依次给变量赋值,而最后一个变量取得所有余下数据的值。

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的基本语法结构。 ☆学会编写并执行Shell脚本程序。 ☆学会在Linux下进行进程调度和作业调度 任务一学习变量与表达式 Shell是操作系统最外面的一层,负责管理用户与操作系统之间的交互,例如等待用户输入,向操作系统解释用户的输入,以及处理操作系统的各种输出结果。 除了作为命令解释器之外,Shell本身还是一个解释型的程序设计语言。Shell程序设计语言支持变量、表达式、函数和流程控制结构等,任何在终端能够执行的命令也放到Shell程序。 ● 4.1.1 变量 ●在Shell中有三种变量:系统变量、环境变量和用户变量。其中系统变量在对参数判 断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置,用户变量在编程过程中使用最多。 ●这几种变量的赋值方法各不相同,主要有:直接设置变量值、变量之间的置换、从 命令行参数获取、从环境变量获取和用户输入等几种方式。 ●引用变量一般采用“$variable”的形式引用变量variable的值。 1.系统变量 ●Shell常用的系统变量用于提供系统信息。系统变量一般采用命令行参数获取。 2.环境变量 ●Shell在开始执行前就已经定义了一些与系统工作环境有关的变量。 ●显示环境变量用echo命令。 ●在bash中,设置环境变量用set命令。用unset命令可将环境变量重新设置为系统 默认值,。 ●用户并不需要每次登录后都对各种环境变量进行手工设置,通过环境设置文件,用 户的工作环境的设置可以在登录的时候由系统自动来完成。环境设置文件有两种:系统环境设置文件和用户环境设置文件。 ●

3.用户变量 ●不管系统变量和环境变量有多少,对于需求来说,总是不够的。用户常常需要自定 义一些变量,这些变量就称为用户变量。 ●定义用户变量的语法为: ●name=string ●局部变量与全局变量 Shell变量也有其规定的作用范围。局部变量的作用范围仅仅在其命令行所在的Shell 或Shell脚本文件中。全局变量的作用范围则包括本Shell进程及其所有子进程,即相当于环境变量,贯穿于整个当前用户环境。可以使用export命令将局部变量设置为全局变量。 export name=string ●【操作实例4.1】 用文本编辑器gedit编写一个Shell脚本test1.sh,显示执行脚本时输入的参数及参数总数目,并定义一个局部变量和一个全局变量。 4.1.2 表达式 Shell中的表达式分为算术运算表达式、关系与逻辑表达式和正则表达式等几种。 1.expr命令 ●expr命令的功能是求表达式的值。 2. 算术表达式 ●算术表达式可以是由运算符+、-、*、/、=组成的表达式。 3. 关系与逻辑表达式 ●命令test与方括号[ ]都用于进行条件测试,测试的结果返回逻辑值,即真true(0)和 假false(1)。test和[ ]可以相互替换。 ● ●

shell

5. Shell脚本语法请点评 5.1. 条件测试:test [ 请点评 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注意与C语言的逻辑表示正好相反)。例如测试两个数的大小关系: $ VAR=2 $ test $VAR -gt 1 $ echo $? $ test $VAR -gt 3 $ echo $? 1 $ [ $VAR -gt 3 ] $ echo $? 1 虽然看起来很奇怪,但左方括号[确实是一个命令的名字,传给命令的各参数之间应该用空格隔开,比如,$VAR、-gt、3、]是[命令的四个参数,它们之间必须用空格隔开。命令test 或[的参数形式是相同的,只不过test命令不需要]参数。以[命令为例,常见的测试命令如下表所示: 表 31.2. 测试命令 [ -d DIR ] 如果DIR存在并且是一个目录则为真

[ -f FILE ] 如果FILE存在且是一个普通文件则为真 [ -z STRING ] 如果STRING的长度为零则为真 [ -n STRING ] 如果STRING的长度非零则为真 [ STRING1 = STRING2 ] 如果两个字符串相同则为真 [ STRING1 != STRING2 ] 如果字符串不相同则为真 [ ARG1 OP ARG2 ] ARG1和ARG2应该是整数或者取值为整数的变量,OP是-eq(等于)-ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等于)之中的一个 和C语言类似,测试条件之间还可以做与、或、非逻辑运算: 表 31.3. 带与、或、非的测试命令

Linux常用的系统监控shell脚本

https://www.doczj.com/doc/749025209.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脚本语法

脚本的后缀还是写 .sh 虽然不是必须,但一眼看见易于知晓是脚本 shell简单的说就是一个命令解释器,用于用户和linux内核的沟通。 shell中所执行的命令相当于fork出的子进程一样。 建立脚本。 #!/bin/bash 符号#!用来告诉系统它后面的参数是用来执行该文件的程序,bash脚本第一句都是这个,他会让系统指定以bash来解释这个脚本 Xxxx //脚本内容 chmod 777 file之后就可以执行了 1.基础 # //shell脚本注释符号 二:变量 1.变量种类: linux下变量类型只有两种 数字型和字符串型 2.声明变量 declare varname 声明一个局部变量varname,也可以一次声明多个同类型的变量 declare var1 var2 var3 仅创建变量的程序能使用的变量是时局部变量

export varname2 保留字export使得变量可由环境存取。即这个变量可以和系统中的其他程序共享。 ????这里不会 3.变量赋值,引用变量时前面要加" $ " 将数值赋给变量,可以不声明变量直接赋值如 let var=1000 *注意:等号两端不能有空格 let后面不加&号???待 比如 i++ : delcare i=1 let i=”$i+1" 将字符串赋给变量 必须先声明变量,且赋值在同一条语句,赋的值必须用双引号引起 declarevar="100-100-100" echo $var HOME="/home" //注意赋值不要有空格 HOME_LIST=$(ls /home) //把命令的执行结果赋值给变量 ehco $HOME //$ 符号是获得变量HOME的值 系统变量: $0 这个程序的执行名字

SHELL编程实用教程

SHELL编程[Bash编程手册] =============== SHELL编程 =============== 一、Shell语法 1.1、变量声明 1.2、数组声明和使用 1.3、特殊的变量 1.4、运算和运算符 1.4.1、整数运算符 1.5、流程语句 1.5.1、if 语句 1.5.2、case语句 1.5.3、select 语句 1.6、循环语句 1.6.1、for语句 1.6.2、while 语句 1.6.3、breake 和continue 1.6.4、shift 二、函数 三、shell程序调试 四、信号 五、bash中常用的命令 =============== 一、Shell语法 =============== 1.1、变量声明 变量=值 (注意:等号两侧不能有空格) a=”hello” b=9 unset a 撤销变量 a

readonly a=2 声明静态的变量 a=2 ,不能 unset export 变量名 可把变量提升为全局环境变量,可供其他shell程序使用 变量应用中要注意: echo “$1 = $1 ; $2 = $2 “; 屏蔽$1 ,屏蔽 $2 ,直接显示 $1 ,$2,同理*也屏蔽了 * 的通配符作用 ${SAT}day ,变量要与字符串连在一起时,应该用 ${} a= `ls -al` 反引号,运行里面的命令,并把结果返回给变量a a=$(ls -al) 等价于反引号 单引号‘’和双引号“”的区别,单引号完全屏蔽 $a 变量,双引号不屏蔽$a,单引号和双引号都屏蔽 * 的通配符作用。 1.2、数组声明和使用 1 name[0]="Tom" 2 name[1]="Tomy" 3 name[2]="John" 4或 5 name=("Tom""Tomy""John") 例子: 1 #!/bin/bash 2 name=("Tom""Tomy""John") 3for i in012 4do 5echo $i:${name[$i]} 6done 1.3、特殊的变量

常用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'

很实用的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

PowerShell基本语法及常用命令

PowerShell基本语法及常用命令 Powershell常用命令 1.Get-Command 得到Powshell所有命令 2.Get-Process 获取所有进程 3.Set-Alias 给指定命令重命名如:Set-Alias aaa Get-Command 4.Set-ExecutionPolicy remotesigned 设置powershell可直接执行脚本文件一般脚本文件以.ps1结尾执行脚本文件直接输入文件地址即可执行脚本文件中只写命令即可 5.Get-Help get-* 查询以get开头的命令Get-Help *service* Get-Help Get-Command 获取Get-Command命令的基本用法 6.Get-Member 获取对象属性如: $var | Get-Memeber 访问$var属性直接$var.T oString() PS中的变量定义 不需要定义或声明数据类型 在变量前加"$" 定义变量的规则 -变量可以是数字$123 -变量可以是字符串$abc -变量可以是特殊字符${@1b} 内置的变量 -$pshome -$home

-$profile 变量赋值: $var=123 $var="aaaaaa" 取变量值: $var 变量赋值方法:Set-Variable var 100 取值方法: Get-Variable var 清空值: Clear-Variable var 删除变量Remove-Variable var 取多个变量如var1 var2 var3地值: Get-Variable var* 另一种赋值方法$var1="bbb" $var2="$var $var1" 结果$var2="aaaaaa bbb" $var2='$var $var1' 结果$var2="$var $var1" $date=Get-Date 获取当前时间 $date.AddDays(3) 当前时间加3天 排序用法 Get-Process | Sort-Object ws 根据WS值由小到大排序 Get-Process | Sort-Object | fl Get-Process | Sort-Object | Format-List 以列表形式显示数据 导入导出文件 Get-Process > c:\aa.txt

个人整理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程序设计 其实作为命令语言交互式地解释和执行用户输入的命令只是shell功能的一个方面,shell 还可以用来进行程序设计,它提供了定义变量和参数的手段以及丰富的程序控制结构。使用shell编程类似于DOS中的批处理文件,称为shell script,又叫shell程序或shell命令文件。 一、shell基本语法 shell的基本语法主要就是如何输入命令运行程序以及如何在程序之间通过shell的一些参数提供便利手段来进行通讯。 (1)输入输出重定向 在Linux中,每一个进程都有三个特殊的文件描述指针:标准输入(standard input,文件描述指针为0)、标准输出(standard output,文件描述指针为1)、标准错误输出(standard error,文件描述指针为2)。这三个特殊的文件描述指针使进程在一般情况下接收标准输入终端的输入,同时由标准终端来显示输出,Linux同时也向使用者提供可以使用普通的文件或管道来取代这些标准输入输出设备。在shell中,使用者可以利用“>”和“<”来进行输入输出重定向。如: command>file:将命令的输出结果重定向到一个文件。 command>&file:将命令的标准错误输出一起重定向到一个文件。 command>>file:将标准输出的结果追加到文件中。 command>>&file:将标准输出和标准错误输出的结构都追加到文件中。 command (2)管道pipe pipe同样可以在标准输入输出和标准错误输出间做代替工作,这样一来,可以将某一个程序的输出送到另一个程序的输入,其语法如下: command1| command2 [| command3...] 也可以连同标准错误输出一起送入管道: command1| &command2 [|& command3...] (3)前台和后台 在shell下面,一个新产生的进程可以通过用命令后面的符号“;”和“&”来分别以前台和后台的方式来执行,语法如下: command 产生一个前台的进程,下一个命令须等该命令运行结束后才能输入。 command & 产生一个后台的进程,此进程在后台运行的同时,可以输入其他的命令。 二、shell程序的变量和参数 像高级程序设计语言一样,shell也提供说明和使用变量的功能。对shell来讲,所有变量的取值都是一个字符串,shell程序采用$var的形式来引用名为var的变量的值。 Shell有以下几种基本类型的变量: (1)shell定义的环境变量 shell在开始执行时就已经定义了一些和系统的工作环境有关的变量,这些变量用户还

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 函数 重要:本文是由机器翻译的,请参阅免责声明。请在此处中查找本文的英文版本以便参考。 注意:如果Microsoft Jet 表达式服务运行在沙盒模式下,可防止潜在不安全的表达式的求值,则禁用函数、方法、对象或本主题中介绍的属性。沙盒模式的详细信息,"沙盒模式"中搜索帮助。 运行可执行的程序,并返回一个Variant (双) 表示该程序的任务ID 如果成功,否则将返回零。 语法 Shell (路径名[,windowstyle ] ) Shell函数语法具有以下参数︰ 参数说明 路径名必填。变体(字符串)。要执行的程序和任何名称所需的参数或命令行开关;可能包括目录或文件夹和驱动器。在Macintosh 上,您可以使用MacID函数指定应用程序的签名,而不是其名称。下面的示例使用Microsoft word 的签名︰Shell MacID("MSWD") windowstyle可选。变体(整数) 对应于是用要运行程序窗口的样式。如果省略windowstyle,具有焦点的最小化启动程序。 在Macintosh 上(系统7.0 或更高版本),windowstyle仅确定运行时,该应用程序获得焦点。 命名参数windowstyle具有以下值︰ 常数值说明 vbHide 0 窗口处于隐藏状态,且焦点传递到隐藏窗口。不适用于Macintosh 平台vbHide常量。vbNormalFocus 1 窗口具有焦点和还原到其原始大小和位置。 vbMinimizedFocus 2 窗口显示为具有焦点的图标。 vbMaximizedFocus 3 窗口最大化具有焦点。 vbNormalNoFocus 4 窗口将还原为最新的大小和位置。当前活动窗口保持活动状态。vbMinimizedNoFocus 6 窗口中显示为图标。当前活动窗口保持活动状态。 注解 如果Shell函数成功执行命名的文件,则返回启动程序的任务标识号。任务ID 是唯一的编号标识运行的程序。如果Shell 函数无法启动命名的程序,将发生错误。 在Macintosh、vbNormalFocus、vbMinimizedFocus和vbMaximizedFocus上所有将应用程序放在前台;在后台,vbHide,vbNoFocus,vbMinimizeFocus所有将应用程序。 注意:默认情况下,Shell函数异步运行其他程序。这意味着Shell启动的程序可能无法完成执行之前执行后面Shell函数。 示例 注意:下面的示例说明使用此函数在Visual Basic for Applications (VBA) 模块。有关处理VBA 的详细信息,搜索旁边的下拉列表中选择开发人员参考,然后在搜索框中输入一个或多个条款。 此示例使用Shell函数运行由用户指定的应用程序。在MacIntosh上,默认的驱动器名称"HD",而不是反斜杠分号分隔路径名的部分。同样,您可以指定,而不是\Windows Macintosh 文件夹。 ' Specifying 1 as the second argument ' opens the application in normal size and ' gives it the focus. Dim RetVal ' Run Calculator. RetVal = Shell("C:\WINDOWS\CALC.EXE", 1) 注意:机器翻译免责声明:本文是由无人工介入的计算机系统翻译的。Microsoft 提供机器翻译是为了帮助非英语国家/地区用户方便阅读有关Microsoft 产品、服务和技术的内容。由于机器翻译的原因,本文可能包含词汇、语法或文法方面的错误。

相关主题
文本预览
相关文档 最新文档