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 循环:

  1. break 语句

  2. 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
 

 

 
posted @ 2017-10-24 16:29  信方  阅读(204)  评论(0编辑  收藏  举报