linux shell脚本本的内容由什么组成?其中脚本语句起什么作用?有谁解释执行?

& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & & & & & & & & & & & & & & & & & &&& & & & & & & & & & & & & & & & & & & & &
root@sn001:~# uname -a
Linux sn001 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed Aug 14 15:31:16 UTC
i686 i386 GNU/Linux
root@sn001:~# bash -version
GNU bash, 版本 4.2.25(1)-release (i686-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
许可证 GPLv3+: GNU GPL 许可证版本3或者更高 &http://gnu.org/licenses/gpl.html&
这是自由软件,您可以自由地更改和重新发布。在法律允许的范围内没有担保.
1.source,sh,bash以及./有什么区别?
&1&共同点:
&&&&使用格式:CMD& FileName,其中CMD用source,sh,bash以及./替代即可,如source FileName。
  source作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无&执行权限&,& source命令(从 C Shell
而来)是bash shell的内置命令,该命令通常可用命令“.”来替代。
&&&&sh和bash 作用:在当前bash环境下读取并执行FileName中的命令。该filename文件可以无&执行权限&,两者在执行文件时的不同,是分别用自己的shell来执行文件。
&&&&./ 作用:打开一个子shell来读取并执行FileName中命令。该filename文件需要有&执行权限&,具体使用那一个shell来执行文件,由shebang(#!)后的路径决定。
&2.Linux 脚本编写基础
1.1&开头#!
1.1 &#! 简介
shell脚本通常是一个以#!为起始的文本文件,这个字符(#!)被称为shebang,一般使用#!& /bin/bash或#! /bin/sh,前者使用得更多。#!& /bin/bash或#! /bin/sh是有差异的,具体差异需要动手编程才能体会。
程序必须以下面的行开始(必须方在文件的第一行):
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
当编辑好脚本时,如果要执行该脚本,还必须使其可执行。
要使脚本可执行:
编译 chmod +x filename 这样才能用./filename 来运行
1.1.2 注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。
如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。
1.1.3 变量
在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
#对变量赋值:
a=&hello world&
# 现在打印变量a的内容:
echo &A is:&
有时候变量名很容易与其他文字混淆,比如:
echo &this is the $numnd&
这并不会打印出&this is the 2nd&,而仅仅打印&this is the &,因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
echo &this is the ${num}nd&
这将打印: this is the 2nd
1.1.4 环境变量
由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。 &
& & & & & & & & & &&& & &&1.1.shell和shell脚本的区别& &&&
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &shell是什么呢?确切一点说,Shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。&Shell本身是一个用编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种语言(就是你所说的shell脚本)。作为命令语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。它虽然不是
Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:249次
排名:千里之外Shell脚本的第一个shell脚本_百度知道
Shell脚本的第一个shell脚本
我有更好的答案
com/zhidao/wh%3D450%2C600/sign=cd3d539cc566/8ad4b31caac27ae992ff,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell!/bin/bashecho&nbsp://f.baidu,第一行一般是这样.hiphotos.hiphotos,见名知意就好,扩展名并不影响脚本执行!#.baidu.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http.jpg" esrc="/zhidao/wh%3D600%2C800/sign=db033b2cddf4dc25fe1aeb/8ad4b31caac27ae992ff:
#,扩展名就用php好了打开文本编辑器(可以使用vi/vim命令来创建文件),如果你用php写shell 脚本。输入一些代码://f://f;Hello&nbsp。echo命令用于向窗口输出文本;World&nbsp.,扩展名为sh(sh代表shell)。<a href="/zhidao/pic/item/8ad4b31caac27ae992ff.baidu,新建一个文件test.sh! 是一个约定的标记
如何编写一个shell脚本
本文结合大量实例阐述如何编写一个shell脚本。
  为什么要进行shell编程
  在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。   下面,让我们一起来看看shell是如何工作的:
  建立一个脚本
  Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash的大姐,bourne shell中运行)。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁qiuye0 的BLOG
用户名:qiuye0
文章数:27
评论数:24
访问量:1466
注册日期:
阅读量:5863
阅读量:12276
阅读量:311507
阅读量:1026671
51CTO推荐博文
sed及awk命令的总结地址:http://6869Shell脚本的说明:shell脚本编程,实际上就是用vim编辑器编辑一个以.sh为结尾的脚本文件,在此脚本文件中使用Linux内部的一个或多个命令,通过编程语言以脚本运行的方式,一次性运行一次一个、一次多个或多次多个命令进行运算,并输出结果,及添加直观的注释。Shell脚本的编辑标准格式:使用vim编辑器编辑一个自定义创建的文件名并以.sh格式结尾―&&& #!/bin/bash &\\#!是一个约定的标记,他告诉系统这个脚本需要用什么解释权来执行。&& #&& 脚本主体& \\脚本主体可直接编辑输入参数、命令、函数、shell编程语言等。且脚本主体所编辑的命令是依照顺序执行,即逐个执行。\\ bash过程式编程:顺序执行:逐个执行选择执行:只执行其中一个分支循环执行:一段代码要执行0,1或多遍编程元素:变量、流程、函数&& 脚本编辑结束在末行输入:wq保存退出。编辑结束首先要测试我们所编辑的脚本中是否有语法错误:bash& -n 脚本名;测试语法无误,运行脚本:bash& -x 脚本名;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------shell环境中的变量及参数:变量:可变化的量,命名内存空间,bash的变量使用特点:弱类型、无须事先声明;bash环境:本地变量:当前shell进程;环境变量:当前shell进程及其子进程;局部变量:某个函数执行过程;位置参数变量:在脚本中引用传递给脚本的参数;在函数中引用传递给函数的参数;特殊变量:$$Shell本身的PID(ProcessID)$!Shell最后运行的后台Process的PID$?最后运行的命令的结束代码(返回值)$-使用Set命令设定的Flag一览$*所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。$@所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。$#添加到Shell的参数个数$0Shell本身的文件名$1~$n添加到Shell的各参数值。$1是第1参数、$2是第2参数…。变量类型:变量类型的作用:存储空间、运算、存储格式数值,字符;数值:整数、浮点数;&& 字符:ASCII&变量的具体说明:本地变量:name=value;name: 我们自定义的变量名―&只能包含数字、字母和下划线;且不能以数字开头;=:赋值符号;value:我们需要给变量名赋予的值;引用我们定义的变量:${name}在定义的变量名中含有下划线等特殊字符时必须使用{}来引用变量, $name引用:弱引用: ""双引号, 其内部的变量引用会被替换为变量值;强引用:''单引号,其变量的变量引用会保持原有字符;命令引用:`COMMAND`反引号, 也可使用$(COMMAND),引用命令的执行结果;声明为整型:declare -i name[=value]let name=value查看所有本地变量:set变量的生命周期:创建销毁:自动销毁:shell进程终止;手动销毁:unset name环境变量:被“导出”的本地变量export name[=value]declare -x name[=value]查看所有环境变量:env, printenv, export销毁:unset name脚本:文本文件标准命名―&name.sh运行脚本:事实上是运行一个bash进程,此进程负责从脚本文件中读取一个执行逻辑,而后由bash进程负责解析并运行此逻辑;启动脚本:(1) # bash& /PATH/TO/SCRIPT_FILE(2) 给脚本一个执行权限即可直接通过脚本路径运行脚本:# ./PATH/TO/SCRIPT_FILE脚本格式我们在开始已经提过了,可回到首部查看;我们在开始说过如何执行脚本,那执行脚本就必然会有成功或失败,当我们执行脚本以后可以使用 $? 命令查看上一条命令执行状态结果:命令状态结果:bash进程用于追踪执行的命令成功与否的状态:0: 成功1-255:失败$?:上一条命令的执行状态结果;我们可在脚本中自定义脚本的状态结果:在脚本中敲入命令exit [n]―&n为我们想要输出的数字注意:脚本中任何位置执行了exit命令即会终止当前shell进程;条件测试:界定程序执行环境;(1) 根据运行的命令的状态结果;(2) 测试表达式: EXPR 表达式test EXPR[ EXPR ][[ EXPR]]&整数测试:隐含着做数值大小比较,所以不要给变量引用加引用;$A -gt $B:是否大于;是则为“真”,否则为“假”;$A -ge $B: 是否大于等于;$A -lt $B:是否小于;$A -le $B: 是否小于等于;$A -eq $B: 是否等于;$A -ne $B:是否不等于;字符串测试:ASCII数值越大,字符比较时其值越大;"$A" & "$B":是否大于;"$A" & "$B":是否小于;"$A" == "$B":是否等于;"$A" != "$B":是否不等于;-z "$A":是否为空;空则为“真”,否则为“假”-n "$A":是否不空;不空则“真”,空则为“假”注意:应该使用[[ EXPRESSION ]]&文件测试:测试文件的存在性以及属性;-e $file: 是否存在;存在则为“真”,否则为“假”;-f $file:文件是否存在且为普通文件;-d $file:文件是否存在且为目录;-h $file:是否存在且为符号链接文件;-b $file:是否存在且为块设备文件;-c $file:是否存在且为字符设备文件;-S $file:是否存在且为套接字文件;-p $file: 是否存在且为管道文件;-r $file: 当前用户对文件是否拥有读权限;-w $file:当前用户对文件是否拥有写权限;-x $file:当前用户对文件是否拥有执行权限;-u $file:文件是否拥有SUID权限;-g $file:文件是否拥有SGID权限;-k $file:文件是否拥有sticky权限;注:SUID,SGID,sticky为文件特殊权限,如果有同学不熟悉,可以自行复习。为了方便理解,我们这里还是列出来:sticky bit (粘贴位)就是:除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除和修改这个目录。suid就是:让普通用户拥有可以执行“只有root权限才能执行”的特殊权限,sgid同理指”组“-O $file: 当前用户是否为指定文件的属主;-G $file: 当前用户是否为指定文件的属组;&双目操作符:$file1 -nt $file2: file1是否新于file2, file1的最近一次的修改时间戳是否晚于file2的;$file1 -ot $file2: file1是否旧于file2, file1的最近一次的修改时间戳是否早于file2的;$file1 -ef $file2:file1与file2是否指向了同一个inode,测试二者是否为同一个文件的硬链接;&特殊设备:/dev/null: 空,bit buckets,吞下所有数据,并直接丢弃;/dev/zero:吐出一堆0;bash之条件判断(选择执行):if/then ;caseif CONDITION; thenif-true-分支fiif CONDITION; thenif-true-分支elseif-false-分支fi! CONDITION: 取反-----------------------------------------------------------------------------------------------------------------脚本参数(位置参数变量):# ./script.sh& /etc/fstab& /etc/grub2.cfg&&&&& $0&&&&&& $1&&&&&&& $2注:为了更易于理解,我们进行下面说明:参数$0―&shell自身文件,$1―&shell中定义的第一个参数,$2―&shell中定义的第二个参数,以此类推。特殊变量:$?: 命令的状态结果;$#: 传递给脚本或函数的参数的个数;$*和$@: 引用传递给脚本或函数的参数列表;为了更直观的理解这些特殊变量,我们来做一个脚本小测试:与用户交互:read命令:read [options] VAR...-p "PROMPT"-t timeout示例:-t5 5秒后超时退出交互。引用命令的执行结果;(1) ls `which cat`(2) lines=$(wc -l /etc/fstab | cut -d' ' -f1)--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------循环语句:循环就是通过循环编程对循环体进行多次运行,直到结果匹配给定的退出循环条件。循环语句有:for, while, untilVARIABLE 定义的变量for VARIABLE in LIST; do循环体doneLIST:是由一个或多个空格或换行符分隔开的字符串组成;即 可使用LIST 给一个变量进行多次逐个赋值;LIST 不为空时进入循环,LIST逐个赋值直到最后一个结束后循环结束,即退出循环;for username in user1 user2 user3; do循环体done示例:添加10个用户,user1-user10;LIST的生成方法:(1) 整数列表(a) {start..end}(b) $(seq [start [[step]] end)(2) 直接给出列表(3) glob(4) 命令生成示例:数值列表示例:glob,即定义参数变量为绝对路径下的文件:#!/bin/bash#for filename in /var/log/*; do&&& file $filenamedone示例:命令生成列表#!/bin/bash#for username in $(cut -d: -f1 /etc/passwd); do&&& echo "$username primary group: $(id -n -g $username)."DoneShell脚本中的算术运算:+, -, *, /, %, **(1) $[$A+$B](2) $(($A+$B))(3) let VARIABLE=$A+$B(4) VARIABLE=$(expr $A + $B)示例:求100以内所以正整数之和;增强型赋值:+=sum=$[$sum+$i]可写为:let sum+=$i-=, *=, /=, %=let count=$[$count+1]&& --& let count+=1 --& let count++let count=$[$count-1]& --& let count-=1 --& let count--示例:显示/etc目录下所有普通文件列表,而后统计一共有多少个文件;测试表达式:整数测试:-gt, -lt, -ge, -le, -eq, -ne字符串测试:==, &, &, !=, -z, -n, =~注意:(1) 字符串等会比较测试:[ "$hostname" == 'localhost'& ]―&比较命令hostname的结果是否为localhost;(2) 模式匹配测试:[[ "STRING" =~ PATTERN ]]组合测试条件:条件间逻辑运算:与:多个条件要同时满足;或:多个条件满足其一即可;非:对指定的条件取反;表达式组合:与:[[ CONDITION1 -a CONDITION2 ]]或:[[ CONDITION1 -o CONDITION2 ]]非:[ ! CONDITION ]命令组合:与:COMMAND1 && COMMAND2& &-- [ EXPR1 ] && [ EXPR2 ]或:COMMAND1 || COMMAND2非:! COMMAND短路操作符:&&false && true = falsefalse && false = false第一个为假则不会运行第二个。true && false = falsetrue && true = true第一个为真则继续运行第二个,第二个为假则不会运行,为真则运行。if COMMAND1; thenCOMMAND2fi短路操作符:||true || true = truetrue || false = true两个有一个为真则真;false || true = truefalse || false = false两个全为假则假;if ! COMMAND1; then 为 假则运行命令2.COMMAND2fiCOMMAND1 && COMMAND2 || COMMAND3& 与和或同时存在:if COMMAND1; then 位真则运行命令2,否则运行命令3.COMMAND2elseCOMMAND3fi示例:写一个脚本实现如下功能;获取当前主机的主机名;如果当前主机的主机名为空,或者为localhost,则将其修改为练习:写一个脚本,打印九九乘法表;循环嵌套1X1=11X2=2 2X2=41X3=3 2X3=6 3X3=9此练习的思路是:既然要打印99乘法表,是乘法就有被乘和乘两个变量,所以我们首先要定义两个变量的循环,其次进行两个变量的交叉循环运算,既然要打印为表,那么就要计算格式:多分支的if语句:单分支:if CONDITION; thenif-true-分支fi双分支:if CONDITION; thenif-true-分支elseif-false-分支fi多分支:if CONDITION1; thenif-CONDITION1-true-分支elif CONDTION2; thenif-CONDITIO2-true-分支...elseif-ALL-false-分支fi示例:通过脚本参数传递一个文件路径给脚本,判断其类型;由上面众多示例我们应该熟悉了怎么创建脚本及运行脚本、判断语法等,所以下面示例我们只给出脚本编程,不再进行运行测试;示例:脚本可接受四个参数start: 创建文件/var/lock/subsys/SCRIPT_NAMEstop: 删除此文件restart: 删除此文件并重新创建status: 如果文件存在,显示为"running",否则,显示为"stopped"basename命令:取得路径的基名;elif:if的特殊使用,多分支判断;#!/bin/bash#prog=$(basename $0)lockfile="/var/lock/subsys/$prog"#echo $lockfileif [ $# -lt 1 ]; then&&& echo "Usage: $prog start|stop|restart|status"&&& exit 1fiif [ "$1" == "start" ]; then&&& if [ -f $lockfile ]; thenecho "$prog is started yet."&&& elsetouch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed..."&&& fielif [ "$1" == 'stop' ]; then&&& if [ -f $lockfile ]; thenrm -f $lockfile && echo "Stop $prog ok...." || echo "Stop $prog failed..."&&& elseecho "$prog is stopped yet."&&& fielif [ "$1" == 'restart' ]; then&&& if [ -f $lockfile ]; thenrm -f $lockfile && touch $lockfile && echo "Restarting $porg ok..."&&& elsetouch $lockfile && echo "$prog is stopped, Starting $prog ok...."&&& fielif [ "$1" == 'status' ]; then&&& if [ -f $lockfile ]; thenecho "Running..."&&& elseecho "Stopped..."&&& fielse&&& echo "Usage: $prog start|stop|restart|sttus"&&& exit 1ficase语句简洁版多分支if语句;使用场景:判断某变量的值是否为多种情形中的一种时使用;语法:case $VARIABLE inPATTERN1)分支1;;PATTERN2)分支2;;PATTERN3)分支3;;...*)分支n;;esac\\PATTERN可使用glob模式的通配符:*: 任意长度的任意字符;?: 任意单个字符;[]: 指定范围内的任意单个字符;a|b: 多选1;示例:提示键入任意一个字符;判断其类型;#!/bin/bash#read -p "Plz enter a character: " charcase $char in[a-z])&&&& echo "A character."&&&& ;;[0-9])&&&& echo "A digit."&&&& ;;*)&&&& echo "A special character."&&&& ;;esac示例:脚本可接受四个参数start: 创建文件/var/lock/subsys/SCRIPT_NAMEstop: 删除此文件restart: 删除此文件并重新创建status: 如果文件存在,显示为"running",否则,显示为"stopped"#!/bin/bash#prog=$(basename $0)lockfile="/var/lock/subsys/$prog"#echo $lockfileif [ $# -lt 1 ]; then&&& echo "Usage: $prog start|stop|restart|status"&&& exit 1ficase $1 instart)&&& if [ -f $lockfile ]; thenecho "$prog is started yet."&&& elsetouch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed..."&&& fi&&& ;;stop)&&& if [ -f $lockfile ]; thenrm -f $lockfile && echo "Stop $prog ok...." || echo "Stop $prog failed..."&&& elseecho "$prog is stopped yet."&&& fi&&& ;;restart)&&& if [ -f $lockfile ]; thenrm -f $lockfile && touch $lockfile && echo "Restarting $porg ok..."&&& elsetouch $lockfile && echo "$prog is stopped, Starting $prog ok...."&&& fi&&& ;;status)&&& if [ -f $lockfile ]; thenecho "Running..."&&& elseecho "Stopped..."&&& fi&&& ;;*)&&& echo "Usage: $prog start|stop|restart|sttus"&&& exit 1esac & &#注:case语句以esac结束--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------shell中的流程控制语句:循环语句:for, while, untilwhile循环:while CONDTION; do循环体done进入条件:当CONDITION为“真”;退出条件:当CONDITION为“假”;while CONDITION; do循环体控制变量的修正表达式done示例:求100以内所有正整数之和;#!/bin/bash#declare -i sum=0declare -i i=1while [ $i -le 100 ]; do&&& let sum+=$i&&& let i++doneecho "Sum: $sum."示例:打印九九乘法表#!/bin/bash#declare -i i=1declare -i j=1while [ $j -le 9 ]; do&&& while [ $i -le $j ]; doecho -e -n "${i}X${j}=$[$i*$j]\t"let i++&&& done&&& echo&&& let i=1&&& let j++doneunitl循环:until CONDITION; do循环体循环控制变量的修正表达式done进入条件:当CONDITION为“假”时退出条件:当CONDITION为“真”时示例:求100以内所有正整数之和#!/bin/bash#declare -i sum=0declare -i i=1until [ $i -gt 100 ]; do&&& let sum+=$i&&& let i++doneecho "Sum: $sum."循环控制:continue [n]:提前结束本轮循环,而直接进入下一轮;break [n]:提前结束循环;while循环:while CONDITION; do.......if CONDITION2; thenbreak [n]fidonewhile CONDITION; do......if CONDITION2; thencontinue [n]fi......done示例:求100以内所有偶数之和;#!/bin/bash#declare -i sum=0declare -i i=0while [ $i -le 100 ]; do&&& let i++&&& if [ $[$i%2] -eq 1 ]; thenecho "$i is a odd."&&&&&&& continue&&& fi&&& let sum+=$idoneecho "Sum: $sum."死循环: do循环体if CONDTION; thenbreakfidone do循环体if CONDITION; thenbreakfidone示例:每隔3秒钟查看当前系统上是否有名为“gentoo”的用户登录;如果某次查看gentoo登录了,则显示gentoo已经登录;如果未登录,就显示仍然未来,并显示这是已经是第多少次查看了;#!/bin/bash#username=$1declare -i count=0 do&&& if who | grep "^$username" && /dev/ thenecho "$username is logged."break&&& elselet count++echo "$count $username is not login."&&& fi&&& sleep 3done#!/bin/bash#declare -i count=0username=$1if [ $# -lt 1 ]; then&&& echo "At lease one argument."&&& exit 1fiif ! id $username && /dev/ then&&& echo "No such user."&&& exit 2fiuntil who | grep "^$username" && /dev/ do&&& let count++&&& echo "$count $username is not login."&&& sleep 3doneecho "$username is logged on."while循环的特殊用法:遍历文件的每一行:while read VARIABLE; do循环体done & /PATH/FROM/SOME_FILE示例:找出UID为偶数的所有用户,显示其用户名和ID号;#!/bin/bash# do&&& userid=$(echo $line | cut -d: -f3)&&& if [ $[$userid%2] -eq 0 ]; thenecho $line | cut -d: -f1,3&&& fidone & /etc/passwdfor循环的特殊用法:for ((expr1;expr2;expr3)); do循环体doneexpr1: 定义控制变量,并初始赋值;expr2: 循环控制条件;进入条件:控制条件为“真”退出条件:控制条件为“假”expr3: 修正控制变量示例:求100以内所有正整数之和;#!/bin/bash#declare -i sum=0for ((i=1;i&=100;i++)); do&&& let sum+=$idoneecho "Sum: $sum."函数:function: 功能把一段具有独立功能代码封装在一起,并给予命名;后续用到时,可直接通过给定函数名来调用整体代码;函数作用:代码重用;模块化编程;函数的使用方法:先定义:编写函数代码后调用:给出函数名,还可按需传递参数定义方法:(1) function f_name {函数体}(2) f_name() {函数体}调用函数:f_name [argu1, argu2, ...]自定义函数状态返回值:return [#]0: 成功1-255:失败注意:函数代码执行时,一旦遇到return,函数代码终止运行,函数返回;示例:此前的服务脚本#!/bin/bash#prog=$(basename $0) &#获取目录根路径lockfile="/var/lock/subsys/$prog"#echo $lockfileif [ $# -lt 1 ]; then&&& echo "Usage: $prog start|stop|restart|status"&&& exit 1fistart() {&&& if [ -f $lockfile ]; thenecho "$prog is started yet."&&& elsetouch $lockfile && echo "Starting $prog ok..." || echo "Starting $prog failed..."&&& fi}stop() {&&& if [ -f $lockfile ]; thenrm -f $lockfile && echo "Stop $prog ok...." || echo "Stop $prog failed..."&&& elseecho "$prog is stopped yet."&&& fi}restart() {&&& if [ -f $lockfile ]; thenrm -f $lockfile && touch $lockfile && echo "Restarting $porg ok..."&&& elsetouch $lockfile && echo "$prog is stopped, Starting $prog ok...."&&& fi}status() {&&& if [ -f $lockfile ]; thenecho "Running..."&&& elseecho "Stopped..."&&& fi}case $1 instart)&&& start&&& ;;stop)&&& stop&&& ;;restart)&&& restart&&& ;;status)&&& status&&& ;;*)&&& echo "Usage: $prog start|stop|restart|sttus"&&& exit 1esac示例:判断用户的ID号的奇偶性;#!/bin/bash#evenid() {&&& if [ $# -lt 1 ]; thenreturn 1&&& fi&&& if ! id $1 && /dev/ thenreturn 2&&& fi&&& userid=$(id -u $1)&&& if [ $[$userid%2] -eq 0 ]; thenecho "$1, Even user ID."&&& elseecho "$1, Odd user ID."&&& fi}evenid rootevenidecho $?evenid roooooooooooootecho $?-------------------------------------------------------------------------------------------模块化编程功能:把脚本文件中的代码分隔为多段,放在不同的文件中假设/root/bin/srv目录有两个文件:(1) 函数文件(2) 脚本文件为脚本使用配置文件一个文件中只定义变量脚本文件source此变量定义的文件&&可将脚本分为两个文件,在运行的文件中使用source PATH引用另一个配置文件;变量的作用域:&&局部变量:在当脚本中存在其他变量与函数中定义的变量重复时时,需要使用local命令来使函数中的变量变为局部变量:local VARIABLE=value局部变量存活时间:函数执行开始,至函数返回结束;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------作业:1写一个脚本如果某路径不存在,则将其创建为目录;否则显示其存在,并显示内容类型;2 写一个脚本,完成如下功能;判断给定的两个数值,孰大孰小;给定数值的方法:脚本参数,命令交互;3.求100以内所有偶数之和;使用至少三种方法实现;1).seq语法表示0 2 100:0-100 每次隔2.2).与上个方法不同的就是变量i的赋值方式不同:3).此方法使用函数调用法:4.写一个脚本(1) 传递两个文本文件路径给脚本;(2) 显示两个文件中空白行数较多的文件及其空白行的个数;(3) 显示两个文件中总行数较多的文件及其总行数;5.写一个脚本(1) 提示用户输入一个字符串;(2) 判断:如果输入的是quit,则退出脚本;否则,则显示其输入的字符串内容;6.写一个脚本,打印2^n表;n等于一个用户输入的值;Resolution:这题主要思路就是首先定义一个循环变量i,然后使用read读取交互输入的$num,接着进行循环运算,定义退出循环条件:使循环变量$i小于$num,i从0开始赋值,然后进行数值运算:2**$i。7.写一个脚本,写这么几个函数:函数1、实现给定的两个数值的之和;函数2、取给定两个数值的最大公约数;函数3、取给定两个数值的最小公倍数;关于函数的选定、两个数值的大小都将通过交互式输入来提供。由于此处脚本过长,所以此处给出编程代码,并附上脚本运行结果:此处本人写出两套方案,一个简单易懂,一个细化分类:#!/bin/bash#if [[ $# -le 2 ]];then& echo "plz input two number and use space to isolation them!"fifunction add() {echo "The two num sum:$1+$2=`expr $1 + $2`"}add $1 $2declare -i bigdeclare -i smaif [ $1 -gt $2 ];then& & big=$1& & sma=$2else& & big=$2& & sma=$1figcdlcm(){i=1 & & &#定义一个循环变量GCD=1 & &#定义最大公约数LCM=1 & &#定义最小公倍数btmp=1 & #定义用户输入的较大的一个变量除以循环变量的值stmp=1 & #定义用户输入的较小的一个变量除以循环变量的值& while [ $i -le $sma ];do & & #定义循环条件,循环变量小于或等于用户输入的较小的变量& & btmp=`expr $big % $i` & & &#求值& & stmp=`expr $sma % $i` & & &#求值& & & if [ $btmp -eq 0 ];then &#判断值得余数是否为0& & & & &if [ $stmp -eq 0 ];then &#同上& & & & & & gcd=$i & &#如果值得余数为0,则获取最大公约数的值& & & & &fi & #判断结束& & & fi& &i=`expr $i + 1` & #i变量循环,直到i等于用户输入的较小的数为止退出循环。done & #当i=$sma,退出循环lcm=`expr $sma / $gcd` & #根据最小公倍数公式求值lcm=`expr $lcm \* $big` &#同上,求最小公倍数公式为:lcm=$sma*$big%gcdecho "lcm:$lcm" & &#输出lcm值echo "gcd:$gcd" & &#输出gcd值}第二种方法:#!/bin/bash#if [[ $1 -eq "" ]];thenecho 'plz input the first number'exit 1fiif [[ $2 -eq "" ]];then&&&&&&& echo 'plz input the second number'&&&&&&& exit 2fifunction add() {sum=$[$1+$2]echo "the sum is $sum"}add $1 $2declare -i maxdeclare -i minif [[ $1 -gt $2 ]];thenmax=$1min=$2elif [[ $1 -lt $2 ]];thenmax=$2min=$1elsemax=$1min=$2fifunction gong() {r=$[$max%$min]temp=$mindeclare -i adeclare -i bif [[ $r -eq 0 ]];thenecho "gongyue is $min"echo "gongbei is $max"else&& while [[ $r -ne 0 ]];doa=$2b=$rr=$[$a%$b]&& done&& gongyue=$b&& gongbei=$[$1*$2/$b]&& echo "gongyue is $gongyue"&& echo "gongbei is $gongbei"fi}gong $1 $2
了这篇文章
类别:┆阅读(0)┆评论(0)
20:26:34 13:16:05 15:12:06 15:14:45

我要回帖

更多关于 shell脚本 的文章

 

随机推荐