文档库 最新最全的文档下载
当前位置:文档库 › linux的shell脚本实验报告

linux的shell脚本实验报告

linux的shell脚本实验报告
linux的shell脚本实验报告

第二次实验内容

一、实验名称:Linux下shell编程

二、实验类型:设计

三、实验目的:

1.熟悉Linux的shell几种变量使用

2.熟练掌握Linux的shell编程几种结构

3.熟练掌握Linux下shell脚本的编写

四、实验准备

参考教材,课件第7章内容及笔记。要求实验内容全部写到实验报告上(B5纸)。

五、实验内容

1. 练习使用shell四种变量,参考课件例题。

用户自定义变量,环境变量,位置变量,特殊变量这四种变量类型的使用,书中有例题。

2. 调试课件所有shell脚本的例题。

3. 编写如下脚本:

●编写脚本if1,测试其功能。

echo -n "word 1: "

read word1

echo -n "word 2: "

read word2

if test "$word1" = "$word2"

then

echo "Match"

fi

echo "End of program."

●编写脚本chkargs,测试其功能

if test $# -eq 0

then

echo "You must supply at least one argument."

exit 1

fi

echo "Program running."

●编写脚本if2,测试其功能

if test $# -eq 0

then

echo "You must supply at least one argument."

exit 1

fi

if test -f "$1"

then

echo "$1 is a regular file in the working directory"

else

echo "$1 is NOT a regular file in the working directory"

fi

●编写脚本if3,测试其功能

echo -n "word 1: "

read word1

echo -n "word 2: "

read word2

echo -n "word 3: "

read word3

if [ "$word1" = "$word2" -a "$word2" = "$word3" ]

then

echo "Match: words 1, 2, & 3"

elif [ "$word1" = "$word2" ]

then

echo "Match: words 1 & 2"

elif [ "$word1" = "$word3" ]

then

echo "Match: words 1 & 3"

elif [ "$word2" = "$word3" ]

then

echo "Match: words 2 & 3"

else

echo "No match"

fi

●编写smartzip 脚本,测试其功能

#!/bin/bash

ftype=`file "$1"`

case "$ftype" in

"$1: Zip archive"*)

unzip "$1" ;;

"$1: gzip compressed"*)

gunzip "$1" ;;

"$1: bzip2 compressed"*)

bunzip2 "$1" ;;

*) echo "File $1 can not be uncompressed with smartzip";;

esac

●编写脚本dirfiles,测试其功能。

for i in *

do

if [ -d "$i" ]

then

echo "$i"

fi

done

●编写脚本until1,测试其功能。用while改写之。

secretname=jenny

name=noname

echo "Try to guess the secret name!"

echo

until [ "$name" = "$secretname" ]//while改写位 while [ “$name” !=“$secretname” ],其他地方不变

do

echo -n "Your guess: "

read name

done

echo "Very good."

●编写脚本brk,测试其功能。

for index in 1 2 3 4 5 6 7 8 9 10

do

if [ $index -le 3 ] ; then

echo "continue"

continue

fi

#

echo $index

#

if [ $index -ge 8 ] ; then

echo "break"

break

fi

done

●编写脚本command_menu,测试其功能。

echo -e "\n COMMAND MENU\n"

echo " a. Current date and time"

echo " b. Users currently logged in"

echo " c. Name of the working directory"

echo -e " d. Contents of the working directory\n"

echo -n "Enter a, b, c, or d: "

read answer

echo

case "$answer" in

a)

date;;

b)

who;;

c)

pwd;;

d)

ls;;

*)

echo "There is no selection: $answer";;

esac

●编写脚本demo_shift,测试其功能。

echo "arg1= $1 arg2= $2 arg3= $3"

shift

echo "arg1= $1 arg2= $2 arg3= $3"

shift

echo "arg1= $1 arg2= $2 arg3= $3"

shift

echo "arg1= $1 arg2= $2 arg3= $3"

shift

●编写shell脚本sum1,求命令行上整数和。即:$./sum1 5 12 4 6,给出和的结果。

sum=0

for i in $*

do

let sum=sum+i

done

echo “和是:$sum”

●编写脚本filetest,判断当前目录下所有文件类型,如果是普通文件,显示文件内

容;如果是目录文件,显示目录列表;如果是大小为0的文件,删除它;否则,显示“sorry, The file is not recognized!”

for i in *

do if [ -d $i ]

then

ls $i

elif [ -f $i ]

then if [ -s $i ]

then cat $i

else rm $i

fi

else

echo –n “sorry,the file can’t be recognized”

fi

done

●编写shell脚本user,判断当前登录用户是否为“学号命名”的用户,是,提示:

hello “学号用户”,welcome!,否,提示“you should login using your username! ”

Read name

If [ $USER = $name ]

Then echo “hello $USER”

else echo “you should login using your username!”

fi

●编写shell脚本menu,使用shell编写一个菜单,分别实现列出以下内容:(1)显

示目录内容、(2)切换目录、(3)创建文件、(4)编辑文件、(5)删除文件的●功能。在此例中将用到循环语句、分支语句和输入输出语句。

Echo “a.display the directory”

Echo “b.change the directory”

Echo “c.create a file”

Echo “d.delete the file”

Echo “if you input nothing,you will exit”

Read item

Until [ -z $item ]

Do

Case $item in

a)Echo “input the directory”

Read dire

Ls $dire;;

b)Echo “input the directory you want go into”

Read dire

Cd $dire;;

c)Echo “input the file you want to create”

Read f

Touch $f;;

d)Echo “input the file you want to delete”

Read f

Rm $f;;

Esac

Echo “a.display the directory”

Echo “b.change the directory”

Echo “c.create a file”

Echo “d.delete the file”

Echo “if you input nothing,you will exit”

Read item

done

编写脚本,实现一个简单计算器。

+ addition

- subtraction

x multiplication

/ division

脚本执行形式:

$ ./cal.sh 21 / 3

Let l=$1 //最简单的一种形式,而且还特别高效Echo $1;

第二种方式:

Re=”+ - \* /”

For var in $re

Do

If [ $var = “\*” ]

Then

Num2=${1#*\*}

Num1=${1%\**}

Else

Num2=${1#*$var}

Num1=${1#%$var*}

Fi

If [ $num1 =$1 ]

Then continue

Fi

Case $var in

“+”) let num=num1+num2

Break;;

“-“) let num=num1-num2;

Break;;

“\*”)let num=num1*num2

Break;;

“/”)let num=num1/num2

Break;;

Esac

Done

Echo $num

六、实验总结

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

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.wendangku.net/doc/0d11061772.html,所做的一样,所不同的是,在DOS中,https://www.wendangku.net/doc/0d11061772.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脚本(实践版)

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

linux-shell 脚本编写实验报告

实验报告 课程Linux基础及应用实验名称Linux Shell脚本编写第页 专业_计算机科学与技术__ 班级__6班_ 学号_105082009014_ 姓名林清萍 实验日期:2011年11 月3 日报告退发(订正、重做) 一、实验目的 1、掌握shell脚本编写的基本知识; 2、掌握shell脚本中变量的使用; 3、掌握shell脚本中引用命令行参数的方法; 4、掌握for循环、while循环、read命令的使用; 5、掌握命令扩展功能的使用。 二、实验内容 1、使用bash的for循环语句编写一脚本batchmkdir.sh,能实现以下功能:在当前目录中建立10个目录,目录的命名形式为dir-1、dir- 2、dir- 3、…..dir-10; 2、编写一个脚本batchuser.sh,能批量建立10个用户帐号,并给用户帐号设定8位的随机密码,同时把该用户名与密码保存到指定的文件中/root/user-pass.txt,以便管理员分发密码;其中帐号的形式为user-1、user-2、…user-10;保存用户名与密码的文件的每行的格式形式为:user-1:ChczVZww 提示:密码可以是命令"openssl rand -base64 7",把用户名与密码对保存到文件中可以使用输出重定向的方法:参考命令 echo “user-1: ChczVZww”>/root/user-pass.txt 3、在/root目录下编写脚本batchadduser.sh,实现以下功能:当用户以 ./ batchadduser stu 10 的方式运行脚本时,能自动添加stu1、stu2、stu3 …. stu10的10个帐号,设定8位的随机密码,并设置帐号的密码有效期为60天,下次登陆必须改密码。同时把该用户名与密码保存到指定的文件中/root/batch-user-pass.txt,密码文件的格式同第二题的要求。 4、编写一个shell脚本,实现以下功能:该脚本能读取usernamelist.txt中的用户列表(一行一个用户名)建立帐号,并给每个帐号设置8位随机密码,同时把该用户名与密码保存到指定userpass.txt 文件中,密码文件的格式同第二题的要求。 补充: usernamelist.txt用户列表该文件格式如下:(说明,每行一个用户名,) jack jason fried zike jicne ien

个人整理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脚本例子集锦(习题总结) 练习一:写一个脚本 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

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脚本if for while

Linux编写shell脚本if for while 使用if条件语句 If语句好处:可以根据特定条件来决定是否执行某项操作,当满足不同条件时执行不同操作, 相关条测试操作 Test 条件表达式 [ 条件表达式] [ ] 方括号与条件表达式需要用空格进行分隔 1.测试文件状态 -d 是否为目录 -e 文件是否存在 -f 是否为文件 -r 是否有读取的权限 -w 是否有写入权限 -x 是否有执行权限 -L 是否为链接文件 2. 整数值比较 -eq 等于 -ne 不等于 -gt 大于 -lt 小于 -le 小于等于 -ge 大于等于 3. 字符串比较 = 匹配 != 不匹配 -z是否为空 !用于取反 4逻辑测试 &&逻辑与(前后两个条件都为真时,结果才为真)

||逻辑或(有一个条件成立,结果即为真)!逻辑非(指定条件不成立,结果为真)if语句的结构 1.单分支的if语句 if条件测试命令 then 命令序列 fi 条件成立 执行then后一条或多条命令(命令序列)直到fi 表示结束 条件不成立 直接执行fi 条件成立 执行then后的一条或多条命令(命令序列)条件不成立 执行else后的一条或多条命令 直到fi 2.双分支的if语句 if 条件测试命令 then 命令序列1 else 命令序列2 fi 条件成立 执行then后的一条或多条命令(命令序列)

条件不成立 执行else后的一条或多条命令 直到fi 3.多分支的if语句(更多使用case语句来实现) 根据if语句条件测试命令的两种状态分别进行操作,嵌套使用, 条件1为真:执行then后的命令直到fi 条件1为假:执行elif后的条件2 条件2为真,执行命令2,直到fi 为假,执行else后的命令3直到fi if 条件测试命令1 then 命令序列1 elif 命令测试条件2 then 命令序列2 else 命令序列3 fi 根据if语句条件测试命令的两种状态分别进行操作,嵌套使用, 条件1为真:执行then后的命令直到fi 条件1为假:执行elif后的条件2 条件2为真,执行命令2,直到fi 为假,执行else后的命令3直到fi 将case后边的变量只与模式1、模式2 ………..等进行逐一比较,直到找到与之匹配的值,然后执行该模式下的命令序列,当遇到;;后跳转至esac后结束分支

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编程基础教程

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

Shell编程基础.pdf

为什么要进行shell编程 Linux系统中虽然有各种各样的图形界面工具,但shell仍然是一个非常灵活的工具。Shell不仅集合了大量命令,还是一门非常棒的编程语言。借助shell,大量任务能实现自动化;shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。 下面,让我们一起来看看shell是如何工作的: 建立一个脚本 Linux中有许多种不同的shell,通常我们使用bash (bourne again shell) 进行shell编程因为bash不仅免费(自由)且易于使用。本文提供的脚本都用bash(当然大多数情况下,这些脚本同样可以在bash的前辈, bourne shell中运行)执行。 如同其他语言一样,我们可以使用任意一种文字编辑器,比如nedit、kedit、emacs、vi 等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行): 代码: #!/bin/bash 符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编辑完了,如果要执行该脚本,还必须使其可执行: 代码: chmod +x filename 这样输入 ./filename 便可执行该脚本。 注释 shell脚本中以# 开始的行表示注释,直到一行的结束。我们真诚的建议你在脚本中使用注释,这样即便在相当长时间内没有使用该脚本,你也能在短时间内明白该脚本的作用和工作原理;此外还有很重要的原因——有了注释,更利于和别人分享你的脚本。 变量 在其它编程语言中,你必须使用变量。shell编程中,所有变量都由字符串组成,并且不需要声明。要给一个变量赋值,你可以这么写: 代码: 变量名=值

Linux 脚本编写基础

Linux 脚本编写基础 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命令:

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

Linux编写shell脚本if for while

上部: 面向过程: 顺序执行 选择执行: if, case 循环执行: for, while, until 一、for语句 格式: for 变量 in 列表;do 语句1; 语句2; ... done 例1、写一个脚本,添加10个用户,并让每个用户的密码同用户名】 复制代码代码如下: #!/bin/bash for I in {1..10}; do useradd user$I; echo user$I | passwd --stdin user$I done 例2、写一个脚本,分别显示 /tmp/1.dir /tmp/2.dir /tmp/3.dir三个文件的时间戳,并将这三个文件被修改的时间改为201003030303.03 复制代码代码如下: #!/bin/bash for Dir in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do stat $Dir touch -m -t 201003030303.03 $Dir stat $Dir done bash的变量类型: 本地变量 局部变量 环境变量

位置变量:$1、$2、$3、$4.... 特殊变量: $?: 用于保存刚刚执行的命令的状态返回值; 0:成功执行;1-255:失败,1,2,127 可以使用exit命令在脚本中自定义脚本执行状态返回值;如果不定义,脚本执行状态返 回值取决于脚本执行结束前最后执行的那个语句的状态; $@, $*: 所有位置参数; $#: 位置参数的个数; $0: 脚本名称 二、if语句 1、单分支if语句: 格式: if 条件; then 语句1 语句2 ... fi 例3、写一个脚本,实现如下功能:如果用户存在,就说明其存在; 复制代码代码如下: #!/bin/bash UserName=user1 if grep "^$UserName\>" /etc/passwd &> /dev/null; then echo "$UserName exists." fi 例4、写一个脚本,实现如下功能:如果设备/dev/sda3已经挂载,就显示其挂载点; 复制代码代码如下: #!/bin/bash Device='/dev/sda3' if mount | grep "^$Device" &> /dev/null; then mount | grep "/dev/sda3" | cut -d' ' -f3 fi 例5、写一个脚本,实现如下功能:如果/etc/rc.d/rc.sysinit中有空白行,就显示其空白行数;

实验4 shell脚本的编写(一)

广东技术师范学院实验报告 学院:计算机科学学院专业:软件工程班级:09软件成绩: 姓名:学号:组别:组员: 实验地点:工业中心204 实验日期:2011.9.22 指导教师签名: 实验 4 项目名称:SHELL脚本的编写(一) 1、实验目的 通过对典型的SHELL脚本进行验证,以及编写具有一定实用程度的SHELL脚本,理解并掌握SHELL 脚本的基本编写方法。 2、实验内容 2.1什么是shell脚本 要明白什么是shell脚本,首先要理解什么是脚本(script)。脚本是指一种未经编译而直接解释执行的程序,最典型例子就是javascript程序。我们知道,程序代码写好后,有两种方式让它执行。一是通过编译器编译成二进制执行代码后提交给系统执行,而另一种则不经过编译,直接送给解释器解释执行。 shell脚本指的就是一种通过shell来解释并执行的程序。UNIX中的shell,它既是一个界面程序,又是一个脚本的解释器,同时又能提供一种功能丰富的脚本语言供用户编写脚本程序。用户只需要通过vi等编辑器将脚本编写好(脚本本身上还是一个文本),通过命令行的形式提交给shell,shell便会对其解释并执行了。 2.2 shell脚本与系统管理 Shell脚本在系统管理上占有重要的位置。原因在于系统管理的日常工作许多都是常规化的,例如日志管理、重要数据备份、账户管理、文件系统清理等工作,一次性地编写一个管理脚本程序,就能避免重复的管理工作。当然,现在有许多管理工具供管理员使用,不是任何工作都需要编写一个shell脚本。不过任何一个管理工具都不可能为特定某个应用业务度身定制,针对当前应用业务的需要编写shell脚本属于高级系统管理员应具备的能力。 此外,有一个问题值得讨论,利用其它高级语言也一样可以写管理程序,为什么要用shell脚本语言?这在于shell脚本最终提交给shell解释执行,因此可直接在程序中使用各种shell命令(c程序是不可能这样做的)。这些shell命令从操作系统管理的角度来看,都涉及到系统资源申请、使用和释放,shell脚本只通过简单的命令即可实现,而高级语言却需要复杂的、大量的系统API函数调用。同学们回顾之前实验中的作业题,每一题只需一到两条shell命令即可完成,但如果用c语言编写相应的程序,也许不可能几条语句就可以实现的了。 关于shell脚本的编写是一个很大的话题,本实验介绍基本的shell程序编写,通过对shell脚本编写的初步学习,理解系统管理中脚本的作用,掌握一些基本的脚本编写方法。以下所给例子均在bash下运行和测试过。 2.3 创建和执行shell脚本 我们通过建立一个“hello world”程序来认识shell脚本是如何创建和执行的。以下是“hello world”的shell脚本程序的内容,请用vi编辑器录入并将其保存为hello文件。 #!/bin/sh

实验五、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]\\$

linux编写systemd下服务脚本

linux编写systemd下服务脚本 Red Hat Enterprise Linux 7(RHEL 7)已经将服务管理工具从SysVinit和Upstart迁移到了systemd上,相应的服务脚本也需要改变。前面的版本里,所有的启动脚本都是放在/etc/rc.d/init.d/ 目录下。这些脚本都是bash脚本,可以让系统管理员控制这些服务的状态,通常,这些脚本中包含了start,stop,restart这些方法,以提供系统自动调用这些方法。但是在RHEL 7中当中已经完全摒弃了这种方法,而采用了一种叫unit的配置文件来管理服务。 1.Systemd下的unit文件 Unit文件专门用于systemd下控制资源,这些资源包括服务(service)、套接字(socket)、设备(device)、挂载点(mount point)、自动挂载点(automount point)、交换文件或分区(a swap file or partition)… 所有的unit文件都应该配置[Unit]或者[Install]段.由于通用的信息在[Unit]和[Install]中描述,每一个unit应该有一个指定类型段,例如[Service]来对应后台服务类型unit. 1.1.unit 类型如下: service :守护进程的启动、停止、重启和重载是此类unit 中最为明显的几个类型。 socket :此类unit 封装系统和互联网中的一个socket。当下,systemd支持流式, 数据报和连续包的AF\_INET,AF\_INET6,AF\_UNIXsocket 。也支持传统的FIFOs 传输模式。每一个socket unit 都有一个相应的服务unit 。相应的服务在第一个“连接”进入socket 或FIFO 时就会启动(例如:nscd.socket 在有新连接后便启动nscd.service)。 device :此类unit 封装一个存在于Linux设备树中的设备。每一个使用udev 规则标记的设备都将会在systemd 中作为一个设备unit 出现。udev 的属性设置可以作为配置设备unit 依赖关系的配置源。 mount :此类unit 封装系统结构层次中的一个挂载点。 automount :此类unit 封装系统结构层次中的一个自挂载点。每一个自挂载unit 对应一个已挂载的挂载unit (需要在自挂载目录可以存取的情况下尽早挂载)。 target :此类unit 为其他unit 进行逻辑分组。它们本身实际上并不做什么,只是引用其他unit 而已。这样便可以对unit 做一个统一的控制。(例如:multi-user.target 相当于

相关文档