大纲:

1-for循环补充

1-1-for循环实战---类C格式应用

2-break、continue循环控制符

2-1实战:帮助理解break、continue作用

3-函数详解

3-1、脚本文件中定义函数并引用,如上图

3-2、返回值的应用

3-3、向函数传递参数(使用位置参数)

3-4、全局变量和局部变量

3-5、向函数传递数组

3-6、调用其他模块的函数

4-shift命令,参数左移

4-1-实战:shift应用

#######################################

1- for循环补充

for循环除了前面讲过的 for [变量名] in [变量值列表] 的使用方式外,

还有一种类似与C语言的循环使用方式,如下:

Usage:

for((i=1;i<=10;i++))

do

     #命令序列

done

===================================

1-1 for循环实战---类C格式应用

计算1~100的和

脚本源码:

#!/bin/bash
# the total of 1~100

total=0

for (( i=1 ; i<=100 ; i++ ))
do
    total=$(expr  $total + $i )
done

echo "1+2+3+...+100=$total"

执行结果:

#######################################

2- break、continue循环控制符

结束当前循环,继续下一个循环:continue

结束整个循环,执行这个循环后面的语句:break

===================================

2-1 实战:帮助理解break、continue作用

脚本源码:

#!/bin/bash
# break continue

while [ true ]
do
    read -p "Enter :" input
    case $input in
        1)
            echo "Hello world!"
            continue
            echo "Hello world!"
            ;;
        2)
            echo "Ni Hao!"
            ;;
        3)
            echo "I'm XiaoGan!"
            ;;
        4)
            echo "Exit!"
            break
            echo "Exit!"
            ;;
        *)
            echo "Input { 1 | 2 | 3 | 4 }"
            ;;
    esac
done

echo "The While Circle is Over!"

执行效果:

#######################################

3- 函数详解

函数的定义:

function [函数名] ()

{

  #命令序列

}

#在函数和shell脚本中定义的变量都是相对于这个脚本来说的全局变量

#所以在函数内部,可以直接使用函数外部定义的变量

#在函数外部,可以直接读取函数内部定义的变量

如下图:

函数的几种用法:

===================================

3-1、脚本文件中定义函数并引用,如上图

===================================

3-2、返回值的应用

函数可以返回数值,其默认为上一条指令的执行结果

当然,我们也可以使用return语句,设置函数的返回值

但是,由于shell状态码最大是255,

当需要返回大于255的值时,需要将返回值复制与变量

脚本源码:

#!/bin/bash

function fun1()
{
    a=144
    echo "in fun1() a=$a"
}
function fun2()
{
    b=144
    echo "in fun2() b=$b"
    return $b
}
function fun3()
{
    c=300
    echo "in fun3() c=$c"
    return $c
}

#test value of fun1
echo "test the return value of fun1 with return"
fun1  
echo "The return value is $?"

echo ""
#test the return value of fun2 <255
echo "test the return value of fun2 <255"
fun2
echo "The return value is $?"

echo ""
#test the return value of fun3 >255 value=fun3
echo "test the return value of fun3 >255 value=fun3"
# The return value output to value
value=`fun3`
echo "Value=\'fun3\' is value=$value"

echo ""
#test the return value of fun3 >255
echo "test the return value of fun3 >255"
fun3
echo "The return value is $?"

执行结果

===================================

3-4、向函数传递参数(使用位置参数)

函数除了可以直接使用脚本的外部变量,

还可以使用调用函数是,传递的位置参数

在函数中,$@ --->代表,调用函数时,传递过来的所有位置参数组成的数组

$#在函数中,代表调用函数式,传递的参数个数

脚本源码:

#!/bin/bash
# location arguments of function

function fun1(){
  echo "in fun1()"
  echo "all location arguments is \$@:$@" #in function $@ stand of all location arguments"
  if [ $# -ne 0 ]
  then
      echo " Location arguments number is $#."
      while [ $# -gt 0 ]
      do
          echo $1
          shift
      done

  else
      echo "No Location arguments."
      return 1
  fi
  echo "will out fun1()"
}
ml="fun1"
echo "in scripts out fun1() \$@:$@"
echo "Test Location arguments of Function"
while [ $# -gt 0 ]
do
    ml=$ml" $1"
    shift
done

#fun1 $1 $2 $3 11 12 13
echo "ml is \"$ml\""
$ml

===================================

3-5、全局变量和局部变量

#在函数和shell脚本中定义的变量都是相对于这个脚本来说的全局变量

#所以在函数内部,可以直接使用函数外部定义的变量

#在函数外部,可以直接读取函数内部定义的变量

#若想要定义局部变量可使用如下方式:

local [变量名]

脚本源码:

#!/bin/bash

function fun1()
{
    num1=123
    local num3=110
    echo "In fun1(),num2=$num2"
    echo "In fun1(),num3=$num3"
}
num2=321

echo "num1 and local num3 in fun1(),num2 out fun2()"
fun1
echo "Out fun1(),num1=$num1"
echo "Out fun1(),num3=$num3"

变量的作用域:

当函数内部和外部同时定义了相同的变量时,会相互影响

脚本源码:

#!/bin/bash
function fun1(){
  num=123
  echo "in fun1() num=$num"
}
num=110
echo "out fun1() num=$num"
fun1
echo "out fun1() num=$num"

所以,在函数中,尽量使用local局部变量

===================================

3-6、向函数传递数组

程序源码:

#!/bin/bash
function array(){
  echo parameters:"$@"
  local factorial=1
  for value in "$@"
  do
      factorial=$[ $factorial * $value ]
  done
  echo "factorial=$factorial"
}
a=(12 13 14 15 16)
echo "a is ${a[*]}"
echo "array \$(a{*}) start:"
echo ""
array ${a[*]}

注:定义数组:

array=(11 23 12 13 14)

输出数组:

echo ${array[*]}

===================================

3-8、调用其他模块的函数

将事先写好的函数模块调用在当前脚本中:

source [模块路径]

脚本源码:

#option.sh

#!/bin/bash
# function define

function copy(){
    echo "in copy()"
}

function add(){
    echo "in add()"
}

function delete(){
    echo "in del()"
}

function change(){
    echo "in change()"
}

function search(){
    echo "in search()"
}

function quit(){
    echo "in exit()"
}

#call.sh

#!/bin/bash
source option.sh

cat <<EOF
*******************************
*            Menu             *
*******************************
*           1.copy            *
*           2.add             *
*           3.del             *
*           4.change          *
*           5.search          *
*           6.exit            *
*******************************
EOF
while [ true ]
do
    read -p "Enter your choose:" ent
    case $ent in
        1)
            echo "copy"
            copy
            ;;
        2)
            echo "add"
            add
            ;;
        3)
            echo "delete"
            delete
            ;;
        4)
            echo "change"
            change
            ;;
        5)
            echo "search"
            search
            ;;
        6)
            echo "exit"
            quit
            ;;
        *)
            echo "Please ent:{ 1 | 2 | 3 | 4 | 5 | 6 }"
            ;;
    esac
done

#######################################

4-shift命令,参数左移

在函数或者脚本中,有时候,为了方便的遍历位置参数,shift命令进行操作:

shift命令每执行一次,位置参数向左移移位:

===================================

4-1-实战:shift应用

shift #参数左移

脚本源码如下:

#!/bin/bash
# shift
total=0
while [ $# -gt 0 ]
do
    total=$( expr $total + $1 )
    shift
done
echo "total=$total"

拓展:seq 和awk命令的使用,计算1-100的和

seq 100 | awk ' { total=total+$1 } END {print total }'

1-25-循环控制符break、continue和函数详解的更多相关文章

  1. java中的 break continue return作用详解

    break: 此语句导致程序终止包含它的循环,并进行程序的下一阶段(整个循环后面的语句),即,不是跳到下一个循环周期而是退出循环.如果break语句包含在嵌套循环里,它只跳出最里面的循环. 如下代码: ...

  2. JAVA之旅(二)——if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结

    JAVA之旅(二)--if,switch,for,while,do while,语句嵌套,流程控制break , continue ,函数,重载的示例总结 JAVA的思想真的很重要,所以要专心的学-- ...

  3. linux select函数详解

    linux select函数详解 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select函数的参数会告诉内核: •我们所关心的文件描述符 •对每个描述符,我们所关心的状 ...

  4. 【转载】C语言itoa()函数和atoi()函数详解(整数转字符C实现)

    本文转自: C语言itoa()函数和atoi()函数详解(整数转字符C实现) 介绍 C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. int/float to ...

  5. python3 内置函数详解

    内置函数详解 abs(x) 返回数字的绝对值,参数可以是整数或浮点数,如果参数是复数,则返回其大小. # 如果参数是复数,则返回其大小. >>> abs(-25) 25 >&g ...

  6. STL之map与pair与unordered_map常用函数详解

    STL之map与pair与unordered_map常用函数详解 一.map的概述 map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称 ...

  7. CreateFile函数详解

    CreateFile函数详解 CreateFile The CreateFile function creates or opens the following objects and returns ...

  8. fork()函数详解

    linux中fork()函数详解(原创!!实例讲解) (转载)    一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程 ...

  9. [转]javascript console 函数详解 js开发调试的利器

    javascript console 函数详解 js开发调试的利器   分步阅读 Console 是用于显示 JS和 DOM 对象信息的单独窗口.并且向 JS 中注入1个 console 对象,使用该 ...

随机推荐

  1. 001-navicat for oracle 12 破解安装

    1.首先软件包和破解文件都需要到我给的百度云盘地址下载,去官网下载的中文版破解不了,至于官网的英文版,我就不清楚了. (1)链接地址. https://pan.baidu.com/s/1jxj4uzg ...

  2. 001-netty的优势

    1.API简单. 2.性能高. 3.成熟稳定. 4.入门门槛低.

  3. java 并发——理解 wait / notify / notifyAll

    一.前言 前情简介: java 并发--内置锁 java 并发--线程 java 面试是否有被问到过,sleep 和 wait 方法的区别,关于这个问题其实不用多说,大多数人都能回答出最主要的两点区别 ...

  4. 如何获取iClap的内测资格

    iClap,一款拥有智能产品管理能力的系统,第一次遇见是在8月下旬的创新中国的展会上,茫茫人海中只因多看了你一眼,便深深的留在脑海里挥之不去,展会结束的当天就忍不住想要更多的了解你,登陆iClap官网 ...

  5. 简单说说spring的事务机制,以及是如何管理的?

    事务管理可以帮助我们保证数据的一致性,对应企业的实际应用很重要. Spring的事务机制包括声明式事务和编程式事务. 编程式事务管理:Spring推荐使用TransactionTemplate,实际开 ...

  6. Safari中的input、textarea无法输入的问题

    原因是这两种表单元素上应用了user-select:none的css属性.一般没人刻意这么做,可能是这样的情况: * { user-select: none; } 在css中排除掉这两种元素就好了: ...

  7. springCloud3---ribbon

    同一份代码,改变端口,就可以启动多个同名但是端口不一样的微服务. 客户端通过nginx来调用后面的多个用户微服务来实现负载均衡,这是服务端负载均衡. 客户端有一个组件,可以知道当前有几个用户微服务的i ...

  8. POSIX 进程间通信 (可移植操作系统接口)

    1.什么是POSIX标准 Portable Operating System Interface for Computing System. 他是一个针对操作系统(准确地说是针对类Unix操作系统)的 ...

  9. LINUX SHELL 笔记 02: 变量初识

    https://www.shellscript.sh/variables1.html 变量是一个可操作(读.写)的内存块的名字. 尝试-1 创建一个变量: root@iZwz:~/labs# sh m ...

  10. tiny4412的烧录工具minitool安装【学习笔记】

    烧录了半天,在win10下一直就是烧录不进去,但是在Ubuntuh环境却可以,找了很久终于找到了,原来在win10安装minitool驱动的时候没有注意到报了错误,错误内容是驱动的数字签名问题,后来禁 ...