Shell记录-Shell脚本基础(四)
while循环,使您能够重复执行一组命令,直到某些条件发生。它通常用于当你需要反复操纵的变量值。
语法
while command
do
Statement(s) to be executed if command is true
done
这里Shell命令进行计算。如果结果值是 true,给定语句被执行。如果命令为 false,那么没有语句将不执行,程序将跳转到done语句后的下一行。
例子:
下面是一个简单的例子,使用while循环显示数字0到9:
#!/bin/sh a=0 while [ $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
这将产生以下结果:
0
1
2
3
4
5
6
7
8
9
循环操作项目清单。重复一组命令列表中的每个项目。
语法
for var in word1 word2 ... wordN
do
Statement(s) to be executed for every word.
done
var是一个变量,word1 到 wordN 是由空格分隔的字符(字)序列的名称。每次for 循环的执行,变量var的值被设置为下一个单词的列表中的字,word1 到 wordN 。
例子:
下面是一个简单的例子,它使用for循环跨越通过给定的数字列表:
#!/bin/sh for var in 0 1 2 3 4 5 6 7 8 9
do
echo $var
done
这将产生以下结果:
0
1
2
3
4
5
6
7
8
9
下面的例子显示所有文件开始 .bash在home目录。执行这个脚本:
#!/bin/sh for FILE in $HOME/.bash*
do
echo $FILE
done
这将产生以下结果:
/root/.bash_history
/root/.bash_logout
/root/.bash_profile
/root/.bashrc
完美的情况下,你需要执行的一组命令某个条件为真时,while循环执行。有时候,你需要执行一组命令,直到某个条件为真。
语法
until command
do
Statement(s) to be executed until command is true
done
这里Shell命令进行评估计算。如果结果值是false,给定语句(s)被执行。如果命令没有语句为true,那么将不执行,程序会跳转到下一行done语句后。
例子:
下面是一个简单的例子,它使用直到循环显示数字0到9:
#!/bin/sh a=0 until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
这将产生以下结果:
0
1
2
3
4
5
6
7
8
9
select 循环提供了一个简单的方法来创建一个编号的菜单,用户可从中选择。它是有用的,当你需要从列表中选择,要求用户选择一个或多个项目。
语法
select var in word1 word2 ... wordN
do
Statement(s) to be executed for every word.
done
var是一个变量,word1 到 wordN是由空格分隔的字符(字)序列的名称。每次for循环的执行,变量var的值被设置为下一个单词的列表中的字,由 word1 到wordN。
对于每一个选择的一组命令将被执行,在循环中。这个循环在ksh,并已被改编成的bash。这不是在sh。
例子:
下面是一个简单的例子,让用户选择的首选饮品:
#!/bin/ksh select DRINK in tea cofee water juice appe all none
do
case $DRINK in
tea|cofee|water|all)
echo "Go to canteen"
;;
juice|appe)
echo "Available at home"
;;
none)
break
;;
*) echo "ERROR: Invalid selection"
;;
esac
done
select 循环的菜单看起来像下面这样:
$./test.sh
1) tea
2) cofee
3) water
4) juice
5) appe
6) all
7) none
#? juice
Available at home
#? none
$
您可以更改显示的提示选择循环通过改变变量PS3如下:
$PS3="Please make a selection => " ; export PS3
$./test.sh
1) tea
2) cofee
3) water
4) juice
5) appe
6) all
7) none
Please make a selection => juice
Available at home
Please make a selection => none
$
到目前为止,我们已经看到了,创建循环和使用循环来完成不同的任务。有时候,你需要停止循环或跳过循环迭代。
在本教程中,您将了解以下两个语句用于控制 Shell 循环:
break 语句
continue 语句
无限循环:
循环有限的生命,他们跳出来,一旦条件是 false 还是 false 取决于循环。
由于所需的条件是不符合一个循环可能永远持续下去。永远不会终止执行一个循环执行无限次数。出于这个原因,这样的循环被称为无限循环。
例子:
下面是一个简单的例子,使用while循环显示数字0到9:
#!/bin/sh a=10 while [ $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
这个循环将永远持续下去,因为常是大于10,它永远不会成为小于10。所以这是无限循环真实的例子。
break语句:
break语句用于终止整个循环的执行,完成后所有行代码break语句的执行。然后,它逐级的代码跟在循环结束。
语法
将用于以下break语句退出循环:
break
将用于以下break语句退出循环:
break n
这里n指定的第n个封闭的循环退出。
例子:
下面是一个简单的例子展示了循环将终止只要一变为5:
#!/bin/sh a=0 while [ $a -lt 10 ]
do
echo $a
if [ $a -eq 5 ]
then
break
fi
a=`expr $a + 1`
done
这将产生以下结果:
0
1
2
3
4
5
下面是一个简单的嵌套循环的例子。这个脚本打破两个循环,如果的 var1 等于2 和 var2 等于0:
#!/bin/sh for var1 in 1 2 3
do
for var2 in 0 5
do
if [ $var1 -eq 2 -a $var2 -eq 0 ]
then
break 2
else
echo "$var1 $var2"
fi
done
done
这将产生以下结果。内循环有一个 break 命令与参数2。这表明,如果条件得到满足应该跳出外循环,并最终从内循环跳出。
1 0
1 5
continue 语句:
continue语句break命令类似,但它会导致当前迭代的循环退出,而不是整个循环。
这种参数是有用的,当一个错误已经发生,但你想尝试执行下一个循环迭代。
语法
continue
和break语句一样,一个整数参数可以给continue命令跳过嵌套循环的命令。
continue n
这里n指定第n个封闭循环 continue 。
例子:
下面的循环利用continue语句返回,并开始处理下一个语句:
#!/bin/sh NUMS="1 2 3 4 5 6 7" for NUM in $NUMS
do
Q=`expr $NUM % 2`
if [ $Q -eq 0 ]
then
echo "Number is an even number!!"
continue
fi
echo "Found odd number"
done
这将产生以下结果:
Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number
Number is an even number!!
Found odd number
重定向命令:
以下是命令,可以使用重定向的完整列表:
命令 | 描述 |
---|---|
pgm > file | Output of pgm is redirected to file |
pgm < file | Program pgm reads its input from file. |
pgm >> file | Output of pgm is appended to file. |
n > file | Output from stream with descriptor n redirected to file. |
n >> file | Output from stream with descriptor n appended to file. |
n >& m | Merge output from stream n with stream m. |
n <& m | Merge input from stream n with stream m. |
<< tag | Standard input comes from here through next tag at start of line. |
| | Takes output from one program, or process, and sends it to another. |
需要注意的是文件描述符0是正常标准输入(STDIN),1是标准输出(STDOUT),标准错误输出(STDERR)。
函数允许您对分解成更小的,逻辑子部分,然后可以被要求执行各项任务时,它需要一个脚本的整体功能。
使用函数来执行重复性的任务,是一个很好的方式来创建代码的重用。代码重用是现代面向对象编程的原则的重要组成部分。
Shell函数是类似于其他编程语言中的子程序,过程和函数。
创建函数:
声明一个函数,只需使用以下语法:
function_name () {
list of commands
}
函数名 function_name,这就是你将使用它从其他地方在你的脚本调用。函数名必须遵循括号内,后括号内的命令的列表。
例如:
以下是使用函数简单的例子:
#!/bin/sh # Define your function here
Hello () {
echo "Hello World"
} # Invoke your function
Hello
当你想执行上面的脚本,它会产生以下结果:
$./test.sh
Hello World
$
参数传递给函数:
你可以定义一个函数,它接受参数,而调用这些函数。将这些参数代表$1,$2,依此类推。
以下是一个例子,我们传递两个参数Zara和Ali ,然后我们捕获和打印这些参数函数。
#!/bin/sh # Define your function here
Hello () {
echo "Hello World $1 $2"
} # Invoke your function
Hello Zara Ali
这将产生以下结果:
$./test.sh
Hello World Zara Ali
$
从函数的返回值:
如果你执行一个exit命令从一个函数内部,其效果不仅是终止执行的功能,而且Shell 程序中调用该函数。
如果你不是想,只是终止执行该函数,再有就是退出来的一个定义的函数。
根据实际情况,你可以从你的函数返回任何值,使用返回的命令,其语法如下:
return code
这里的代码可以是任何你选择这里,但很明显,你应该选择你的脚本作为一个整体的背景下是有意义的或有用的东西。
例子:
下面的函数返回一个值1:
#!/bin/sh # Define your function here
Hello () {
echo "Hello World $1 $2"
return 10
} # Invoke your function
Hello Zara Ali # Capture value returnd by last command
ret=$? echo "Return value is $ret"
这将产生以下结果:
$./test.sh
Hello World Zara Ali
Return value is 10
$
嵌套函数:
函数更有趣的功能之一是,他们可以调用本身以及调用其他函数。被称为递归函数调用自身的函数。
经过简单的例子演示了一个嵌套的两个函数:
#!/bin/sh # Calling one function from another
number_one () {
echo "This is the first function speaking..."
number_two
} number_two () {
echo "This is now the second function speaking..."
} # Calling function one.
number_one
这将产生以下结果:
This is the first function speaking...
This is now the second function speaking...
从提示的函数调用:
你可以把常用功能 .profile 的定义,这样他们就会每当登录,在命令提示符下,您可以使用它们。
或者,你可以在一个文件中的定义分组为 test.sh,然后通过键入当前shell中执行该文件:
$. test.sh
这样做的效果造成任何test.sh内定义的函数,可以阅读在如下定义为当前shell:
$ number_one
This is the first function speaking...
This is now the second function speaking...
$
要删除从 shell 函数的定义,可以使用unset命令 .f 选项。这是相同的命令来删除一个变量的定义Shell。
$unset .f function_name
Shell记录-Shell脚本基础(四)的更多相关文章
- Shell记录-Shell脚本基础(一)
Shell 注释: 你可以把注释,在你的脚本如下: #!/bin/bash # Author : Zara Ali # Copyright (c) Tutorialsyiibai.com # Scri ...
- -Shell 教程 Bash 脚本 基础语法 MD
目录 目录 Shell 简介 Shell 脚本 Shell 环境 第一个shell脚本 Shell 变量 定义变量 使用变量 只读变量 删除变量 Shell 字符串 单引号 双引号 字符串基本操作 S ...
- Shell记录-Shell脚本基础(三)
if...fi 语句的基本控制语句,它允许Shell有条件作出决定并执行语句. 语法 if [ expression ] then Statement(s) to be executed if exp ...
- Shell记录-Shell脚本基础(六)
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行. 1.命令格式 watch[参数][命令] ...
- Shell记录-Shell脚本基础(五)
Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...
- Shell记录-Shell脚本基础(二)
Shell 基本运算符 算术运算符: 运算符 描述 例子 + Addition - Adds values on either side of the operator `expr $a + $b` ...
- shell脚本基础-四种启动方式
1.当前路径启动 ./test.sh 2.绝对路径启动 pwd /data/beijing 'pwd'/test.sh 3.指定解释器执行 sh test.sh bash test.sh 4.shel ...
- mongodb shell 运行js脚本的四种方式
1. 交互式 mongo shell 大部分的 mongodb 教程,在第一章都会讲解这种方式. mongo 127.0.0.1:27017 use test db.users.findOne() ...
- Shell记录-Shell命令(其他)
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器. .命令格式 top [参数] Shell 2.命令功能 显示当前系统正在执行的 ...
随机推荐
- 初学Cocos2dx
初学cocos2dx Cocos2dx 中的主要概念包括:应用.导演.场景.层.精灵.动画.动作. Cocos2dx里面的主要类 1.CCObject Object Object Object 是co ...
- spring冲刺第十天
调试运行,对整体的游戏方面进行改进.冲刺完了,但依然有很多问题,比如无法暂停,游戏结束后只能退出重来等
- 1~n中1的和
题目:给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数: 要求:写一个函数f(n),返回1到n之间出现“1“的个数, 思路: 1.先判断这个数共多少位,假设为n位: ...
- 我现在对Git的认识
由于时间关系,我还没能真正的了解什么是Git,只是大致的了解了一下,并且在网上查阅了资料,做了一些总结,以便进一步研读. Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项 ...
- C++获取private的变量-偷走private
private提供了对数据的封装,使得private成员只能被类自身的成员函数以及类的友元访问,其他的函数或者类想要访问private成员只能通过该类所提供的set和get的方法进行访问, 或者返回其 ...
- HDU 2078 复习时间
http://acm.hdu.edu.cn/showproblem.php?pid=2078 Problem Description 为了能过个好年,xhd开始复习了,于是每天晚上背着书往教室跑.xh ...
- (转)关于ES6的 模块功能 Module 中export import的用法和注意之处
关于ES6的 模块功能 Module 中export import的用法和注意之处 export default 的用法 export default命令用于指定模块的默认输出.显然,一个模块只能有一 ...
- vue 组件 模板input双向数据数据
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>T ...
- 半夜思考, 为什么建议重写 equals() 方法时, 也要重写 hashCode() 方法
我说的半夜, 并不是真正的半夜, 指的是在我一个人的时候, 我会去思考一些奇怪的问题. 要理解 hashCode() 需要理解下面三个点: hash契约 哈希冲突 哈希可变 第一点: hash 契约指 ...
- 【刷题】洛谷 P1519 穿越栅栏 Overfencing
题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...