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

Shell脚本编程详解-吐血共享
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 !

实例 12-1:编写一个Shell程序mkf,此程序的功能是:显示root下的文件信息,然后建立一个kk的文件夹,在此文件夹下建立一个文件aa,修改此文件的权限为可执行。

分析:此Shell程序中需要依次执行下列命令为:

进入root目录:cd /root

显示root目录下的文件信息:ls –l

新建文件夹kk: mkdir kk

进入root/kk目录:cd kk

新建一个文件aa: vi aa #编辑完成后需手工保存

修改aa文件的权限为可执行:chmod +x aa

回到root目录:cd /root

因此该Shell程序只是以上命令的顺序集合,假定程序名为mkf

[root@localhost root]#vi mkf

cd /root

ls –l

mkdir kk

cd kk

vi aa

chmod +x aa

cd /root

12-3 在Shell程序中使用的参数

◆位置参数

◆内部参数

如同ls命令可以接受目录等作为它的参数一样,在Shell编程时同样可以使用参数。Shell 程序中的参数分为位置参数和内部参数等。

12-3-1 位置参数

由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,如果为1,即$1。类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。第0号为程序名字,从1开始就表示传递给程序的参数。如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。

12-3-2 内部参数

上述过程中的$0是一个内部变量,它是必须的,而$1则可有可无,最常用的内部变量有$0、$#、$?、$*,它们的含义如下。

●$0:命令含命令所在的路径。

●$#:传递给程序的总的参数数目。

●$?:Shell程序在Shell中退出的情况,正常退出返回0,反之为非0值。

●$*:传递给程序的所有参数组成的字符串。

实例 12-2:编写一个Shell程序,用于描述Shell程序中的位置参数为:$0、$#、$?、$*,程序名为test1,代码如下:

[root@localhost bin]#vi test1

#! /bin/sh

echo “Program name is $0”;

echo “There are totally $# parameters passed to this program”;

echo “The last is $?”;

echo “The parameter are $*”;

执行后的结果如下:

[root@localhost bin]# test1 this is a test program //传递5个参数

Program name is /bin/test1 //给出程序的完整路径和名字

There are totally 5 parameters passed to this program //参数的总数

The last is 0 //程序执行效果

The parameters are this is a test program //返回由参数组成的字符串

注意:命令不计算在参数内。

实例 12-3:利用内部变量和位置参数编写一个名为test2的简单删除程序,如删除的文件名为a,则在终端中输入的命令为:test a

分析:除命令外至少还有一个位置参数,即$#不能为0,删除不能为$1,程序设计过程如下。

(1)用vi编辑程序

[root@localhost bin]#vi test2

#! /bin/sh

if test $# -eq 0

then

echo “Please specify a file!”

else

gzip $1 //现对文件进行压缩

mv $1.gz $HOME/dustbin //移动到回收站

echo “File $1 is deleted !”

fi

(2)设置权限

[root@localhost bin]#chmod +x test2

(3) 运行

[root@localhost bin]# test2 a (如果a文件在bin目录下存在)

File a is deleted!

12-4 在Shell程序中的使用变量

◆变量的赋值

◆变量的访问

◆变量的输入

12-4-1变量的赋值

在Shell编程中,所有的变量名都由字符串组成,并且不需要对变量进行声明。要赋值给一个变量,其格式如下:

变量名=值

注意:

等号(=)前后没有空格

例如:

x=6

a=”How are you ”

表示把6赋值给变量x,字符串“How are you ”赋值给变量a。

12-4-2 访问变量值

如果要访问变量值,可以在变量前面加一个美元符号“$”,例如:

[root@localhost bin]#a=”How are you ”

[root@localhost bin]#echo “He juest said:$a”

A is:hello world

一个变量给另一个变量赋值可以写成:

变量2=$变量1

例如:

x=$i

i++可以写成:

i=$i+1

12-4-3 键盘读入变量值

在Shell程序设计中,变量的值可以作为字符串从键盘读入,其格式为:

read 变量

例如:

[root@localhost bin]#read str

read为读入命令,它表示从键盘读入字符串到str。

实例 12-4:编写一个Shell程序test3,程序执行时从键盘读入一个目录名,然后显示这个目录下所有文件的信息。

分析:

存放目录的变量为DIRECTORY,其读入语句为:

read DIRECTORY

显示文件的信息命令为:ls –a

[root@localhost bin]#vi test3

#! /bin/sh

echo “please input name of directory”

read DIRECTORY

cd $DIRECTORY

ls –l

(2)设置权限

[root@localhost bin]#chmod +x test3

(3)执行

[root@localhost bin]#./test3

注意:

输入路径时需“/”

实例 12-5:运行程序test4,从键盘读入x、y的值,然后做加法运算,最后输出结果。

(1)用vi编辑程序

[root@localhost bin]#vi test4

#! /bin/sh

echo “please input x y”

read x,y

z=`expr $x+$y`

echo “The sum is $z”

(2)设置权限

[root@localhost bin]#chmod +x test4

(3)执行

[root@localhost bin]#./ test4

45 78

The sum is 123

注意:

表达式total=`expr $total +$num`及num=`expr $num +1`中的符号“`”为键盘左上角的“`”键。

12-5 表达式的比较

◆字符串操作符

◆逻辑运算符

◆用test比较的运算符

◆数字比较符

◆文件操作符

在Shell程序中,通常使用表达式比较来完成逻辑任务。表达式所代表的操作符有字符操作符、数字操作符、逻辑操作符、以及文件操作符。其中文件操作符是一种Shell所独特的操作符。因为Shell里的变量都是字符串,为了达到对文件进行操作的目的,于是才提供了文件操作符。

12-5-1 字符串比较

作用:测试字符串是否相等、长度是否为零,字符串是否为NULL。

常用的字符串操作符如表12-1所示.。

表12-1 常用的字符串操作符

实例 12-6:从键盘输入两个字符串,判断这两个字符串是否相等,如相等输出。

(1)用vi编辑程序

[root@localhost bin]#vi test5

#! /bin/Bash

read ar1

read ar2

[ “$ar1” = “$ar2” ]

echo $? #?保存前一个命令的返回码

(2)设置权限

[root@localhost bin]#chmod +x test5

(3)执行

[root@localhost root]#./ test5

aaa

bbb

1

注意:

”[”后面和”]”前面及等号“=“的前后都应有一个空格;注意这里是程序的退出情况,如果ar1和ar2的字符串是不想等的非正常退出,输出结果为1。

实例 12-7:比较字符串长度是否大于零

(1)用vi编辑程序

[root@localhost bin]#vi test6

#! /bin/Bash

read ar

[ -n “$ar” ]

echo $? //保存前一个命令的返回码

(2)设置权限

[root@localhost bin]#chmod +x test6

(3)执行

[root@localhost bin]#./ test6

注意:

运行结果1表示ar的小于等于零,0表示ar的长度大于零。

12-5-2 数字比较

在Bash Shell编程中的关系运算有别于其他编程语言,用表12-2中的运算符用test语句表示大小的比较。

表12-2 用test比较的运算符

实例 12-8:比较两个数字是否相等

(1)用vi编辑程序

[root@localhost bin]#vi test7

#! /bin/Bash

read x,y

if test $x –eq $y

then

echo “$x=$y”

else

echo “$x!=$y”

fi

(2)设置权限

[root@localhost bin]#chmod +x test7

(3)执行

[root@localhost bin]#./ test7

50 100

50!=100

[root@localhost bin]#./ test7

150 150

150= =150

12-5-3 逻辑操作

在Shell程序设计中的逻辑运算符如表12-3所示。

12-3 Shell中的逻辑运算符

实例 12-9:分别给两个字符变量赋值,一个变量赋予一定的值,另一个变量为空,

求两者的与、或操作。

(1)用vi编辑程序

[root@localhost bin]#vi test8

#! /bin/Bash

part1 =”1111”

part2 =”” #part2为空

[ “$ part1”–a “$ part2”]

echo $? #保存前一个命令的返回码

[ “$ part1”–o “$ part2”]

echo $?

(2)设置权限

[root@localhost bin]#chmod +x test8

(3)执行

[root@localhost bin]#./ test8

1

12-5-4 文件操作

文件测试操作表达式通常是为了测试文件的信息,一般由脚本来决定文件是否应该备份、复制或删除。由于test关于文件的操作符有很多,在表12-4中只列举一些常用的操作符。

表12-4 文件测试操作符

实例 12-10:判断zb目录是否存在于/root下。

(1)用vi编辑程序

[root@localhost bin]#vi test9

#! /bin/Bash

[ -d /root/zb ]

echo $? #保存前一个命令的返回码

(2)设置权限

[root@localhost bin]#chmod +x test9

(3)执行

[root@localhost bint]#./ test9

(4)在/root添加zb目录

[root@localhost bin]#mkdir zb

(5)执行

[root@localhost bin]#./test9

注意:

运行结果是返回参数“$?”,结果1表示判断的目录不存在,0表示判断的目录不存在。

实例 12-11:编写一个Shell程序test10,输入一个字符串,如果是目录,则显示目录下的信息,如为文件显示文件的内容。

(1)用vi编辑程序

[root@localhost bin]#vi test10

#! /bin/Bash

echo “Please enter the directory name or file name”

read DORF

if [ -d $DORF ]

then

ls $DORF

elif [ -f $DORF ]

then

cat $DORF

else

echo “input error! ”

fi

(2)设置权限

[root@localhost bin]#chmod +x test10

(3)执行

[root@localhost bin]#./ test10

12-6 循环结构语句

Shell的循环语句

Shell常见的循环语句有for循环、while循环语句和until循环。

12-6-1 for循环

语法:

for 变量 in 列表

do

操作

done

注意:

变量要在循环内部用来指列表当中的对象。

列表是在for循环的内部要操作的对象,可以是字符串也可以是文件,如果是文件则为文件名。

实例 12-12:在列表中的值:a,b,c,e,I,2,4,6,8用循环的方式把字符与数字分成两行输出。

(1)用gedit编辑脚本程序test11

[root@localhost bin]#gedit test11

#! /bin/Bash

for i in a,b,c,e,I 2,4,6,8

do

echo $i

done

(2)设置权限

[root@localhost bin]#chmod +x test11

(3)执行

[root@localhost bin]#./ test11

a,b,c,e,i

2,4,6,8

注意:

在循环列表中的空格可表示换行。

实例 12-13:删除垃圾箱中的所有文件。

分析:在本机中,垃圾箱的位置是在$HOME/.Trash中,因而是在删除$HOME/.Trash列表当中的所有文件,程序脚本如下。

(1)用gedit编辑脚本程序test12

[root@localhost bin]#gedit test12

#! /bin/Bash

for i in $HOME/.Trash/*

do

rm $ i

echo “$ i has been deleted!”

done

(2)设置权限

[root@localhost bin]#chmod +x test12

(3)执行

[root@localhost bin]#./ test12

/root/.Trash/abc~ has been deleted!

/root/.Trash/abc1 has been deleted!

实例 12-14:求从1~100的和。

(1)用gedit编辑脚本程序test13

[root@localhost bin]#gedit test13

#! /bin/Bash

total =0

for((j=1;j<=100;j++));

do

total=`expr $total + $j`

done

echo “The result is $total”

(2)设置权限

[root@localhost bin]#chmod +x test13

(3)执行

[root@localhost bin]#./ test13

The result is 5050

注意:

for语句中的双括号不能省,最后的分号可有可无,表达式total=`expr $total + $j`的加号两边的空格不能省,否则会成为字符串的连接。

12-6-2 while循环

语法:

while 表达式

do

操作

done

只要表达式为真,do和done之间的操作就一直会进行。

实例 12-15:用while循环求1~100的和。

(1)用gedit编辑脚本程序test14

[root@localhost bin]#gedit test13

total =0

num=0

while((num<=100));

do

total=’expor $total +$ num’

done

echo “The result is $total”

(2)设置权限

[root@localhost bin]#chmod +x test14

(3)执行

[root@localhost bin]#./ test14

The result is 5050

12-6-3 until循环

语法:

until 表达式

do

操作

done

重复do和done之间的操作直到表达式成立为止。

实例 12-16:用until循环求1~100的和。

(1)用gedit编辑脚本程序test15

[root@localhost bin]#gedit test15

total =0

num=0

until [$sum –gt 100]

do

total=’expor $total +$ num’

num=’expr $num + 1’

done

echo “The result is $total”

(2)设置权限

[root@localhost bin]#chmod +x test15

(3)执行

[root@localhost bin]#./ test15

The result is 5050

12-7 条件结构语句

Shell的条件结构语句

Shell程序中的条件语句主要有if语句与case语句。

12-7-1 if语句

语法:

if 表达式1 then

操作

elif表达式2 then

操作

elif表达式3 then

操作

……

else

操作

fi

Linux里的if的结束标志是将if反过来写成fi;而elif其实是else if的缩写。其中,elif理论上可以有无限多个。

实例 12-17:用for循环求1~100的和。

(1)用gedit编辑脚本程序test16

[root@localhost bin]#gedit test16

for((j=0;j<=10;j++))

do

if(($j%2==1))

then

echo “$j”

fi

done

(2)设置权限

[root@localhost bin]#chmod +x test16

(3)执行

[root@localhost bin]#./ test16

13579

12-7-2 case语句

语法:

case 表达式 in

值1|值2)

操作;;

值3|值4)

操作;;

值5|值6)

操作;;

*)

操作;;

esac

case的作用就是当字符串与某个值相同是就执行那个值后面的操作。如果同一个操作对于多个值,则使用“|”将各个值分开。在case的每一个操作的最后面都有两个“;;”分号是必需的。

实例 12-18:Linux是一个多用户操作系统,编写一程序根据不同的用户登录输出不同的反馈结果。

(1)用vi编辑脚本程序test17

[root@localhost bin]#gedit test17

#!/bin/sh

case $USER in

beechen)

echo “You are beichen!”;;

liangnian)

echo “You are liangnian”; //注意这里只有一个分号

echo “Welcome !”;; //这里才是两个分号

root)

echo “You are root!”;echo “Welcome !”;;

//将两命令写在一行,用一个分号作为分隔符

*)

echo “Who are you?$USER?”;;

easc

(2)设置权限

[root@localhost bin]#chmod +x test17

(3)执行

[root@localhost bin]#./ test17

You are root

Welcome!

12-8 在Shell脚本中使用函数

Shell的函数

Shell程序也支持函数。函数能完成一特定的功能,可以重复调用这个函数。

函数格式如下:

函数名()

{

函数体

}

函数调用方式为

函数名参数列表

实例 12-19:编写一函数add求两个数的和,这两个数用位置参数传入,最后输出结果。

(1)编辑代码

[root@localhost bin]#gedit test18

#!/bin/sh

add()

{

a=$1

b=$2

z=’expr $a + $b’

echo “The sum is $z”

}

add $1 $2

(2)设置权限

[root@localhost bin]#chmod +x test18

(3)执行

[root@localhost bin]#./ test18 10 20

The sum is 30

注意:

函数定义完成后必须同时写出函数的调用,然后对此文件进行权限设定,在执行此文件。

12-9 在Shell脚本中调用其他脚本

Shell脚本的调用

在Shell脚本的执行过程中,Shell脚本支持调用另一个Shell脚本,调用的格式为:

程序名

实例 12-20:在Shell脚本test19中调用test20。

(1)调用test20

#test19脚本

#!/bin/sh

echo “The main name is $0”

./test20

echo “The first string is $1”

#test20脚本

#!/bin/sh

echo “How are you $USER?”

(2)设置权限

[root@localhost bin]#chmod +x test19

[root@localhost bin]#chmod +x test20

(3)执行

[root@localhost bin]#./ test19 abc123

The main name is ./test19

How are you root?

the first string is abc123

注意:

1)在Linux编辑中命令区分大小写字符。

2)在Shell语句中加入必要的注释,以便以后查询和维护,注释以#开头。

3)对Shell变量进行数字运算时,使用乘法符号“*”时,要用转义字符“\”进行转义。

4)由于Shell对命令中多余的空格不进行任何处理,因此程序员可以利用这一特性调整程序缩进,达到增强程序可读性效果。

5)在对函数命名时最好能使用有含义且能容易理解的名字,即使函数名能够比较准确地表达函数所完成的任务。同时建议对于较大的程序要建立函数名和变量命名对照表。

12-10本章小结

本章讲解了Linux下Shell脚本的定义和相关Shell脚本编写的基础,这些基础知识是学习Shell脚本编程的关键。接着讲解了Shell 脚本的执行方式和Shell脚本的常见流程控制,

为Shell脚本的编程做了准备。

课后习题

1.选择题

(1)下列说法中正确的是()。

A.安装软件包fctix-3.4.tar.bz2,要按顺序使用./configure;make;make

install;tar命令

B.挂载U盘,mount /dev/sda /mnt/u -o iocharset=gb2312

C.显示变量PS1的值用命令 echo PS1

D.用命令./abc与sh abc执行Shell脚本abc,所得的结果并不相同

(2)一个Bash Shell脚本的第一行是什么()。

A. #!/bin/Bash

B. #/bin/Bash

C. #/bin/csh

D. /bin/Bash

(3)在Shell脚本中,用来读取文件内各个域的内容并将其赋值给Shell变量的命令是()。

A. fold

B. join

C. tr

D. read

(4)下列变量名中有效的Shell变量名是()。

A. -2-time

B. _2$3

C. trust_no_1

D. 2004file

(5)下列对Shell变量FRUIT操作,正确的是()。

A. 为变量赋值:$FRUIT=apple

B. 显示变量的值:fruit=apple

C. 显示变量的值:echo $FRUIT

D. 判断变量是否有值:[ -f “$FRUIT” ]

(6)在Fedora 12系统中,下列关于Shell脚本程序说法不正确的是()。

A. Shell脚本程序以文本的形式存储

B. Shell脚本程序在运行前需要进行编译

C. Shell脚本程序由解释程序解释执行

D. Shell 脚本程序主要用于系统管理和文件操作,它能够方便自如地处理大量重复

性的系统工作

(7)在Shell编程中关于$2的描述正确的是()。

A. 程序后携带了两个位置参数

B. 宏替换

C. 程序后面携带的第二个位置参数

D 携带位置参数的个数

E 用$2引用第二个位置参数

(8)在Fedora 12系统中,“run.sh”是Shell执行脚本,在执行./run.sh file1 file2

file3的命令的过程中,变量$1的值为()。

A. run.sh

B. file1

C. file2

D. file3

2.填空题

(1)在Shell编程时,使用方括号表示测试条件的规则是。

(2)编写的Shell程序运行前必须赋予该脚本文件权限。

3.简答题

(1)用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下。

(2)在根目录下有四个文件m1.txt,m2.txt,m3.txt,m4.txt,用Shell编程,实现自动

创建m1,m2,m3,m4四个目录,并将m1.txt,m2.txt,m3.txt,m4.txt四个文件分别拷贝

到各自相应的目录下。

(3)某系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决方案:

●在下午4 :50删除/abc目录下的全部子目录和全部文件;

●从早8:00~下午6:00每小时读取/xyz目录下x1文件中每行第一个域的全部数据加入

到/backup目录下的bak01.txt文件内;

●每逢星期一下午5:50将/data目录下的所有目录和文件归档并压缩为文件:

backup.tar.gz;

●在下午5:55将IDE接口的CD-ROM卸载(假设:CD-ROM的设备名为hdc);

●在早晨8:00前开机后启动。

(4)请用Shell编程来实现:当输入不同的选择时,执行不同的操作,如:输入start 开

始启动应用程序myfiles,输入stop时,关闭myfiles,输入status时,查看myfiles

进程,否则执行*)显示“EXIT!”并退出程序。

(5)编写一个Shell程序,此程序的功能是:显示root下的文件信息,然后建立一个abc的文件夹,

在此文件夹下建立一个文件k.c,修改此文件的权限为可执行。

(6)编写一个Shell程序,挂载U盘,在U盘中根目录下所有.c文件拷贝到当前目录,然后卸载U

盘。

(7)编写一个Shell程序,程序执行时从键盘读入一个文件名,然后创建这个文件。

(8)编写一个Shell程序,键盘输入两个字符串,比较两个字符串是否相等。

(9)编写三个Shell程序,分别用for、while、与until求从2+4+…+100的和。

(10)编写一个Shell程序,键盘输入两个数及+、-、*、与/中的任一运算符,计算这两个数的运算

结果。

(11)编写两个Shell程序kk及aa,在kk中输入两个数,调用aa计算计算这两个数之间奇数的和。

(12)编写Shell程序,可以挂载U盘,也可挂载Windows硬盘的分区,并可对文件进行操作。

(13)编写4个函数分别进行算术运算+、-、*、/,并编写一个菜单,实现运算命令。

课程实训

实训内容:编写一个Shell程序,呈现一个菜单,有0-5共6个命令选项,1为挂载U盘,2为卸载U盘,3为显示U盘的信息,4把硬盘中的文件拷贝到U盘,5把U盘中的文件拷贝到硬盘中,选0为退出。

程序分析:把此程序分成题目中要求的6大功能模块,另外加一个菜单显示及选择的主模板。(1)编辑代码

[root@localhost bin]#vi test19

#!/bin/sh

#mountusb.sh

#退出程序函数

quit()

{

clear

echo “*******************************************************************”

echo “*** thank you to use,Good bye! ****”

exit 0

}

Shell命令

Shell Shell 就是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。 4.1.1 Shell 的基本概念 1. 什么是S hell Shell 就是用户与操作系统内核之间的接口,起着协调用户与系统的一致性和在用户与系统之间进行交互的作用。Shell 在L inux 系统中具有极其重要的地位,如图4-1 所示

第 4 章 Shell 与 V i 编辑器 - 71 - diff grep vi multitasking sh gcc device hardware interface kernn e l TCP/IP stack bash utilii t es 图 4-1 Linux 系统结构组成 2. Shell 的功能 Shell 最重要的功能是命令解释,从这种意义上来说,Shell 是一个命令解释器。Linux 系统中的所有可执行文件都可以作为 Shell 命令来执行。将可执行文件作一个分类,如表 4-1 所示。 表 4-1 可执行文件的分类 部的解释器将其解释为系统功能调用并转交给内核执行;若是外部命令或实用程序就试图 在硬盘中查找该命令并将其调入内存,再将其解释为系统功能调用并转交给内核执行。在 查找该命令时分为两种情况: 用户给出了命令路径,Shell 就沿着用户给出的路径查找,若找到则调入内存,若没有 则输出提示信息; 用户没有给出命令的路径,Shell 就在环境变量 PATH 所制定的路径中依次进行查找, 若找到则调入内存,若没找到则输出提示信息。 图 4-2 描述了 S hell 是如何完成命令解释的。

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

Linux主要shell命令详解

shell是用户和Linux操作系统之间的接口。Linux中有多种shell,其中缺省使用的是Bash。本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性。 什么是shell Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。它是命令语言、命令解释程序及程序设计语言的统称。 shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell 就是围绕内核的外层。当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。 shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。用户在提示符下输入的命令都由shell先解释然后传给Linux核心。 有一些命令,比如改变工作目录命令cd,是包含在shell内部的。还有一些命令,例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。 shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。 shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。 当普通用户成功登录,系统将执行一个称为shell的程序。正是shell进程提供了命令行提示符。作为默认值(TurboLinux系统默认的shell是BASH),对普通用户用―$‖作提示符,对超级用户(root)用―#‖作提示符。 一旦出现了shell提示符,就可以键入命令名称及命令所需要的参数。shell将执行这些命令。如果一条命令花费了很长的时间来运行,或者在屏幕上产生了大量的输出,可以从键盘上按ctrl+c发出中断信号来中断它(在正常结束之前,中止它的执行)。

ubuntu shell 使用命令大全

ubuntu shell 使用命令大全 前言 下面的命令大都需要在控制台/ 终端/ shell 下输入。 控制台, 终端, 和shell 意味着同样一件事- 一个命令行界面,他可以用来控制系统。 打开一个控制台: 应用程序--> 附件--> 终端 任何一个使用'sudo' 作为前缀的命令都需要拥有管理员(或root) 访问权限。所以你会被提示输入你自己的密码。 安装升级 查看软件xxx安装内容 dpkg -L xxx 查找软件库中的软件 apt-cache search 正则表达式 或 aptitude search 软件包 显示系统安装包的统计信息 apt-cache stats 显示系统全部可用包的名称 apt-cache pkgnames 显示包的信息 apt-cache show k3b 查找文件属于哪个包 apt-file search filename 查看已经安装了哪些包 dpkg -l 查询软件xxx依赖哪些包 apt-cache depends xxx 查询软件xxx被哪些包依赖 apt-cache rdepends xxx 增加一个光盘源 sudo apt-cdrom add 系统升级 sudo apt-get update (这一步更新包列表) sudo apt-get dist-upgrade (这一步安装所有可用更新) 或者 sudo apt-get upgrade (这一步安装应用程序更新,不安装新内核等) 清除所有已删除包的残馀配置文件 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P 如果报如下错误,证明你的系统中没有残留配置文件了,无须担心。 dpkg: --purge needs at least one package name argument Type dpkg --help for help about installing and deinstalling packages [*]; Use `dselect' or `aptitude' for user-friendly package management; Type dpkg -Dhelp for a list of dpkg debug flag values; Type dpkg --force-help for a list of forcing options; Type dpkg-deb --help for help about manipulating *.deb files; Type dpkg --license for copyright license and lack of warranty (GNU GPL) [*]. Options marked [*] produce a lot of output - pipe it through `less' or `more' ! 编译时缺少h文件的自动处理 sudo auto-apt run ./configure 查看安装软件时下载包的临时存放目录

最常用的Shell命令

Shell命令行操作 Linux shell 简介 Linux shell指的是一种程序,有了它,用户就能通过键盘输入指令来操作计算机了。Shell会执行用户输入的命令,并且在显示器上显示执行结果。这种交互的全过程都是基于文本的,与其他各章介绍的图形化操作不同。这种面向命令行的用户界面被称为CLI(Command Line interface)。在图形化用户界面(GUI)出现之前,人们一直是通过命令行界面来操作计算机的。 现在,基于图形界面的工具越来越多,许多工作都不必使用Shell就可以完成了。然而,专业的Linux用户认为Shell是一个非常有用的工具,学习Linux时一定要学习Shell,至少要掌握一些基础知识和基本的命令 启动shell 在启动Linux桌面系统后,Shell已经在后台运行起来了,但并没有显示出来。如果想让它显示出来, 按如下的组合键就可以: + + 组合键中的F2可以替换为 F3、F 4、F 5、F6。 如果要回到图形界面,则按如下组合键: + + 另外,在图形桌面环境下运行“系统终端”也可以执行Shell命令,与用组合键切换出来的命令行界面

是等效的。“系统终端”启动后是一个命令行操作窗口,可以随时放大缩小,随时关闭,比较方便,推荐使用。启动“系统终端”的方法是: 【开始】→【应用程序】→【附件】→【系统终端】 该软件允许建立多个Shell客户端,它们相互独立,可以通过标签 在彼此之间进行切换。 Shell命令基本规则 一般格式 Shell命令的一般格式如下: 命令名【选项】【参数1】【参数2】... 【选项】是对命令的特别定义,以减号(-)开始,多个选项可以用一个减号(-)连起来,如ls -l -a与 ls -la 相同。 【参数】提供命令运行的信息,或者是命令执行过程中所使用的文件名。 使用分号(可以将两个命令隔开,这样可以实现一行中输入多个命令。命令的执行顺序和输入的顺序 相同。 命令补全 在送入命令的任何时刻,可以按键,当这样做时,系统将试图补全此时已输入的命令。如果已 经输入的字符串不足以唯一地确定它应该使用的命令,系统将发出警告声。再次按键,系统则会给出可用来补全的字符串清单。使用命令补全功能,可以提高使用长命令或操作较长名字的文件或文件夹的都是非常有意义的。

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.360docs.net/doc/1214130586.html,所做的一样,所不同的是,在DOS中,https://www.360docs.net/doc/1214130586.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脚本编程详解-吐血共享

第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 !

xshell-linux命令

suse linux 常用命令 (1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当前目录下以字母a开头的所有文件 ls -l *.doc 给出当前目录下以.doc结尾的所有文件 (2)命令cp——复制文件 cp afile afile.bak 把文件复制为新文件afile.bak cp afile /home/bible/ 把文件afile从当前目录复制到/home/bible/目录下 cp * /tmp 把当前目录下的所有未隐藏文件复制到/tmp/目录下 cp -a docs docs.bak 递归性地把当前目录下的docs目录复制为新目录docs.bak,保持文件属性,并复制所有的文件,包括以句点开头的隐藏文件。为了方便起见,-a选项包含-R 选项 cp -i 在覆盖前询问用户 cp -v 告诉用户正在做什么 (3)命令mv——移动和重命名文件 mv aflie bfile 将afile重命名为bfile mv afile /tmp 把当前目录下的afile移动到/tmp/目录下 (4)命令rm——删除文件和目录 rm afile 删除文件afile rm * 删除当前目录下的所有文件(未隐藏文件)。rm命令不删除目录,除非也指定了-r(递归)参数。 rm -rf domed 删除domed目录以及它所包含的所有内容 rm -i a* 删除当前目录下所有以字母a开头的文件,并且在每次删除时,提示用户进行确认 (5)命令cd——更改目录 cd ~ 切换到主目录 cd /tmp 切换到目录/tmp cd dir切换到当前目录下的dir目录 cd /切换到根目录 cd ..切换到到上一级目录 cd ../..切换到上二级目录 cd ~切换到用户目录,比如是root用户,则切换到/root下 (6)命令mkdir——建立目录 mkdir phots 在当前目录中建立名为photos的目录 mkdir -p this/that/theother 在当前目录下建立指定的嵌套子目录 (7)命令mkdir——删除目录 mkdir 将删除空目录 (8)命令more、less——查看文件内容 more /etc/passwd 查看/etc/passwd的内容 功能:分页显示命令

Linux Shell常用命令总结

1. find find pathname -options [-print -exec -ok] 让我们来看看该命令的参数: pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 -print find命令将匹配的文件输出到标准输出。 -exec find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格,同时两个{}之间没有空格, 注意一定有分号结尾。 0) -ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行 find . -name "datafile" -ctime -1 -exec ls -l {} \; 找到文件名为datafile*, 同时创建实际为1天之内的文件, 然后显示他们的明细. find . -name "datafile" -ctime -1 -exec rm -f {} \; 找到文件名为datafile*, 同时创建实际 为1天之内的文件, 然后删除他们. find . -name "datafile" -ctime -1 -ok ls -l {} \; 这两个例子和上面的唯一区别就是-ok会在每个文件被执行命令时提示用户, 更加安全. find . -name "datafile" -ctime -1 -ok rm -f {} \; 1) find . -name 基于文件名查找,但是文件名的大小写敏感. find . -name "datafile*" 2) find . -iname 基于文件名查找,但是文件名的大小写不敏感. find . -iname "datafile*" 3) find . -maxdepth 2 -name fred 找出文件名为fred,其中find搜索的目录深度为2(距当前目录), 其中当前目录被视为第一层. 4) find . -perm 644 -maxdepth 3 -name "datafile*" (表示权限为644的, 搜索的目录深度为3, 名字为datafile*的文件) 5) find . -path "./rw" -prune -o -name "datafile*" 列出所有不在./rw及其子目录下文件名为datafile*的文件。 find . -path "./dir*" 列出所有符合dir*的目录及其目录的文件. find . \( -path "./d1" -o -path "./d2" \) -prune -o -name "datafile*" 列出所有不在./d1和d2及其子目录下文件名为datafile*的文件。 6) find . -user ydev 找出所有属主用户为ydev的文件。 find . ! -user ydev 找出所有属主用户不为ydev的文件,注意!和-user之间的空格。 7) find . -nouser 找出所有没有属主用户的文件,换句话就是,主用户可能已经被删除。 8) find . -group ydev 找出所有属主用户组为ydev的文件。

shell脚本练习题

shell脚本例子集锦(习题总结) 练习一:写一个脚本 1.设定变量FILE的值为/etc/passwd 2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么 形如:(提示:LINE=`wc -l /etc/passwd | cut -d" " -f1`) Hello,root,your UID is 0. 3.统计一个有多少个用户 答案一:#!/bin/bash file="/etc/passwd" LINES=`wc -l $file | cut -d" " -f1` for I in `seq 1 $LINES`;do userid=`head -$I $file | tail -1 |cut -d: -f3` username=`head -$I $file | tail -1 |cut -d: -f1` echo "hello $username,your UID is $userid" done echo "there are $LINES users" 答案二:#!/bin/bash file=/etc/passwd let num=0 for I in `cat $file`;do username=`echo "$I" | cut -d: -f1` userid=`echo "$I" | cut -d: -f3` echo "Hello,$username,your UID is $userid" num=$[$num+1] done echo "there are $num users" 练习二:写一个脚本 1.切换工作目录至/var 2.依次向/var目录中的每个文件或子目录问好,形如: (提示:for FILE in /var/*;或for FILE in `ls /var`;) Hello,log 3.统计/var目录下共有多个文件,并显示出来 答案:#!/bin/bash cd /var let num=0 for I in `ls /var/*`;do echo "hello $I" num=$[$num+1] done echo "the number of files is $num" 练习三:写一个脚本 1.设定变量file的值为/etc/passwd

实验十三 shell脚本练习

上机实验内容: 1、请编写一个脚本,其功能是将当前用户的根目录下的work目录打包为名为“user’s-workdir-in-YYMMDD”的tar包(提示:参考用date建立文件) 要求:i)若该目录不存在,显示“dir not exist” ii)若该文件不是目录类型,显示“work is a type”,此处的type为文件类型 #!/bin/bash [ -e /work ] && tar -cvf "User's-workdir-in-`date +%Y%m%d`.tar" /work || echo "dir not exist" declare filetype="" [ -f /work ] && filetype="常规文件" [ -d /work ] && filetype="目录文件" [ -b /work ] && filetype="块设备文件" [ -c /work ] && filetype="字符设备" [ -S /work ] && filetype="套接字文件" [ -p /work ] && filetype="FIFO(管道)文件" [ -L /work ] && filetype="连接文件" [ "$filetype" != "" ] && echo "work is a $filetype" 2、编写一个脚本,其中包含一个打印函数,用于将多次输入的字符组合为一个字符串 要求:i)使用函数实现新值的输出 ii)使用循环语句完成多个字符的输入,直到输入字符串EOF才完成字符串的累加#!/bin/bash function add(){ str="$str"$input echo $str } read -p "请输入一个字符串或者输入EOF结束本次操作:" input declare str while [ "$input" != "EOF" ] do add read -p "请输入一个字符串或者输入EOF结束本次操作" input done 3、自我练习:设计一个运算器,实现“加、减、乘、除”功能。 (四则运算:符号使用+、-、*、/) #!/bin/bash

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脚本之前的基础知识 日常的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(脚本)编程入门 实例讲解详解

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常用命令

目录 一、目录操作 a) ls--查看文件/目录: 常用:ls –l 查看详细文件列表 b) pwd--查看当前目录: c) cd--改变工作目录: 常用①:cd ../ 跳转到上一级目录 常用②:cd /boot/ 跳转到指定目录 d) mkdir--创建目录: 常用:mkdir 123 创建一个空文件夹 e) rm--删除文件/目录: 常用: rm -rf 123 删除目录文件夹,并且目录下的文件一并删除。 f) mv--移动文件/目录改名、移动: 移动文件: mv 1.sh ./123 → mv 目标文件移动至某目录 重名命文件:mv 1.sh 123.sh → mv 原文件欲改后文件 g) ln--建立软连接和硬连接: 软连接:ln -s 123.sh ../ → ln -s 源文件欲放置路径 硬连接:ln 123.sh ../ → ln 源文件欲放置路径 h) rmdir--删除空目录: 二、文件操作 a)cat--查看文件内容,若文件不存在,创建对应文件: 常用:cat 1.txt b)cp--拷贝文件、目录: 备份:cp 123.sh 1.sh → cp 源文件目标文件 复制至某路径:cp 123.sh ../ → cp 源文件目标路径 c)chmod--修改文件权限: 常用:chmod 777 1.sh 给1.sh最高权限 一般模式:chmod +rw 1.sh 仅当前用户下1.sh具有可读写权限 d)touch--创建文件: 常用:touch ./1.sh → touch 路径+名称 f)vim--创建并打开文件: 常用:vim ./1.sh → vim 路径+名称 g)find--在指定目录查找符合条件的文件: 以[文件名+类型]寻找:find ./ -name “*.*”→ find 路径 -nama

shell常用命令大全

一、文件目录类命令 1、查看联机帮助信息 man命令如:#man ls info命令如:#info cd 2、列出当前目录或指定目录的文件名和目录名 ls[选项]文件或目录 常用[选项]如下: -a:显示所有的文件,包括以“.”开头的隐含文件。 -l:长格式输出 -m:宽行输出 -F:以各种符号表示不同的文件类型 --color:彩色输出 -R:递归输出 3、touch 功能:修改文件的创建日期或以当前系统日期创建一个空文件。 -d:修改文件的日期。 #touch–d2*******test.txt 4、cp 功能:复制文件 用法:cp[选项]源文件或目录目标文件或目录 选项: a:该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地

拷贝目录,其作用等于dpR选项的组合。 -d拷贝时保留链接。 -f删除已经存在的目标文件而不提示。 -i和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。 -p此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。 -r若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。 5、mv 功能:给文件或目录改名或将一个文件或目录移到另一个目录 用法:mv[选项]源文件或目录目标文件或目录 -i交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答y或n,这样可以避免误覆盖文件。-f禁止交互操作。在mv操作要覆盖某已有的目标文件时不给任何指示,指定此选项后,i选项将不再起作用。 6、rm 功能:删除文件或目录 用法:rm[选项]文件… -f强制删除 -r指示rm将参数中列出的全部目录和子目录均递归地删除。 -i进行交互式删除

Shell编程基础教程

1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须放在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。 当编辑好脚本时,如果要执行该脚本,还必须使其可执行。要使脚本可执行: chmod +x filename 这样才能用./filename 来运行 1.1.2 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。 1.1.3 变量 在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写: #!/bin/sh #对变量赋值: a="hello world" # 现在打印变量a的内容: echo "A is:" echo $a 有时候变量名很容易与其他文字混淆,比如: num=2 echo "this is the $numnd" 这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量: num=2 echo "this is the ${num}nd"

这将打印: this is the 2nd 1.1.4 环境变量 由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。 1.1.5 Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: s虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。 常用命令语法及功能: echo "some text": 将文字内容打印在屏幕上 ls: 文件列表 wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数 cp sourcefile destfile: 文件拷贝 mv oldname newname : 重命名文件或移动文件 rm file: 删除文件 grep 'pattern' file: 在文件内搜索字符串比如:grep 'searchstring' file.txt cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令 cat file.txt: 输出文件内容到标准输出设备(屏幕)上 file somefile: 得到文件类型 read var: 提示用户输入,并将输入赋值给变量 sort file.txt: 对file.txt文件中的行进行排序 uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3 find: 搜索文件比如:根据文件名搜索find . -name filename -print tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux

linux 实验报告 简单shell命令操作

学生课程实验报告书课程:《linux网络操作系统》 级系 专业班 学号: 姓名: 指导教师:

一、实验项目:简单shell命令操作 二、实验日期: 三、实验原理: 字符界面下熟悉图形界面的转换、简单shell命令、输入输出重定向、文本编辑器vi的使用; 四、实验仪器: PC机 Redhat网络操作系统 五、实验步骤 1.将图形化用户界面转换成虚拟终端,并将虚拟终端转换成图形化用户界面 按ctrl+alt+f1~f6进入虚拟终端,按ctrl+alt+f7切换成图形化用户界面 2.请尝试字符界面下注销、重启、关机命令。 注销:exit或ctrl+D 重启:reboot或shutdow-r now 关机:halt或shutdow-h now 3.用date命令将系统时间设置为2012年3月17日8时44分。 date 0317******** 4.用cal命令查询你出生日期是星期几。 Cal 03 1989

5.c d命令将工作目录转换为/boot/grub,并用返回用户主目录。 cd /boot/grub转换为目录/boot/grub cd 返回用户主目录 6.显示/root文件夹下所有文件和目录(包括隐含文件和子文件夹下内容) Ls –al 7.用cat命令显示/root/install.log文件,要求显示文件的每行必须 有行号。 Cat –n install.log

8.用more和less命令显示/root/install.log文件,感受各种翻页 命令。 More /root/install.log less /root/install.log 9.显示/etc/inittab文件的前5行和后10行,要求带有行号。 Head –n 5 /etc/inittab tail –n 5 /etc/inittab

相关文档
最新文档