Linux学习笔记:循环,定义函数

case分支选择结构:
    case 词 in [模式 [| 模式]...) 命令 ;;]... esac
    case 变量引用 in
        模式1)
            分支1
            ;;
        模式2)
            分支2
            ;;
        ...
        *)
            默认分支
            ;;
    esac

模式(PATTERN):
    1.普通的文本字符
    2.globbing风格的通配符:
        *:任意长度任意字符
        ?:任意的单个字符
        []:范围内的任意单个字符
        [^]:范围外的任意单个字符
    3.|:或

写一个脚本:
    提示用户输入信息,然后判断用户输入的信息是否合法;

#!/bin/bash
#
read -p "Please make your choice[yes of no]: " CHOICE

case $CHOICE in
    yes)
        echo "right."
        ;;
    no)
        echo "wrong."
        ;;
    *)
        echo "Unknown."
        ;;
esac

if CONDITION1 ; then
    STATEMENT
elif CONDITION2 ; then
    STATEMENT
elif CONDITION3 ; then
    STATEMENT
...
else
    STATEMENT
fi

if的多分支结构和case的分支结构之间的区别:
    相同点:
        1.都是条件为真,执行对应分支的语句;条件为假,就不执行;
        2.都可以设置默认分支语句,即:所有条件都不匹配的时候,所执行的语句;

不同点:
         1.if是根据命令的执行状态返回值来判断正确与否;case是根据变量的值的取值内容是否匹配模式来判断正确与否;
         2.case的每个分支都必须使用‘;;‘结束;

管理用户账户的脚本,第四版:利用case语句实现
#!/bin/bash
#
if [ $# -lt 2 ] ; then
  echo "Usage: $(basename $0) -a User1,User2,...,UserN | -d User1,User2,...,UserN."
  exit 5
fi

case $1 in
  -a)
      for I in $(echo $2 | tr ‘,‘ ‘ ‘) ; do
        if id $I &> /dev/null ; then
          echo "$I exists already."
        else
          useradd $I
          echo $I | passwd --stdin $I &> /dev/null
          echo "Create $I successfully."
        fi
      done
  ;;
  -d)
      for J in $(echo $2 | tr ‘,‘ ‘ ‘) ; do
        if id $J &> /dev/null ; then
          userdel -r $J
          echo "Delte $J finished."
        else
          echo "User $J does not exist."
        fi
      done
  ;;
  *)
      echo "Usage: $(basename $0) -a User1,User2,...,UserN | -d User1,User2,...,UserN."
      exit 6
esac

while
    while 命令; do 命令; done
    while CONDITION ; do
        循环体
    done
        进入循环条件:CONDITION一直为真;
        退出循环条件:CONDITION为假;

until
    until 命令; do 命令; done
    until CONDITION ; do
        循环体
    done
        进入循环条件:CONDITION一直为假;
        退出循环条件:CONDITION为真;

while CONDITION ; do CMD ; done
相当于
until ! CONDITION ; do CMD ; done

注意:对于while和until两个循环结构来讲,如果要实施变量增量操作,必须手动给出;

利用while和until循环结构,计算100以内所有整数的和;
#!/bin/bash
#
declare -i I=1
while [ $I -le 100 ] ; do
    let SUM+=$I
    let I++
done
echo $SUM

#!/bin/bash
#
declare -i I=1
until [ $I -gt 100 ] ; do
    let SUM+=$I
    let I++
done
echo $SUM

循环控制语句:
    continue
    break

continue:
    continue [n]
    提前结束第n层的本次循环,直接进入下一轮条件判断,若符合循环进入条件,则开启下一轮循环;

break:
    break [n]
    提前技术第n层循环;不再继续后续循环;

无限循环用法:
while true ; do
    循环体
done

until false ; do
    循环体
done

在此类的循环结构中,必须适当的使用continue和break,以保证循环不会一直持续下去;

能够实现遍历功能的while循环和until循环;
while read LINES ; do
    循环体
done < /PATH/FROM/SOMEFILE

until ! read LINES ; do
    循环体
done < /PATH/FROM/SOMEFILE

select
    select循环主要用于创建一个菜单式列表,供用户进行选择;
    列表是按照数字顺序排列的,我们只要选择数字即可;

一般来讲,select与case一起使用;

select是一个无限循环结构,因此,必须在循环体中使用break命令以退出循环,或者可以使用exit命令直接终止脚本运行;

select NAME [in 词语 ... ;] do 命令; done

select NAME [in LIST] ; do
        命令
    done

定义函数:
    函数是由两部分组成:
        函数名称 + 函数体(能够实现独立功能的shell语句块)

语法一:
        function func_name {
            函数体
        }

语法二:
        func_name() {
            函数体
        }
        注意:函数名和()之间不能加空白字符;

注意:函数可以在交互式环境下定义,也可以在脚本中定义;

函数的使用
    函数在定义的时候,其函数体中包含的所有命令均不会被执行;只有函数被调用的时候,才会执行其中的命令语句;

调用方式:通过直接给出函数名称的方式调用;

有很多的函数是存放于专门用于保存函数的文件中;如果想要调用这样的文件中保存的函数,使用source命令(.)加载文件,然后再以直接给出函数名称的方式调用函数;

使用set命令可以查看所有当前shell中生效的函数;
使用unset命令可以撤销已经定义的函数;

函数的返回值:
    两种返回值:
        函数的执行结果的返回值:
            1.在函数体中使用了echo或printf命令输出的结果;
            2.在函数体中某些命令输出的结果;
        函数的状态返回值:
            1.函数中最后一条命令的执行状态返回值;
            2.自定义退出状态码:
                return [n]
                    n:0-255 (1 2 127尽可能不使用)
                    0: 表示无错误返回
                    1-255:有错误返回

注意:只要函数在执行时,遇到了return命令,不管函数中的命令语句是否全部执行完成,立刻退出函数;

函数的生命周期:
    从被调用开始,到遇到return命令或全部的语句执行完成为止;

函数的实参
    在函数体中,可以使用$1,$2,..位置变量为函数提供参数;还可以使用$*或[email protected]的方式引用所有位置参数;还可以使用$#计算为函数传递的参数个数;

在调用函数的时候,直接在函数名称后面以空白字符分隔多个参数即可;比如:func_name arg1 arg2 ...

传递给函数参数的位置参数,是调用函数的时候,函数名称后面的以空白字符分隔的字符串序列;跟脚本的位置参数不是一回事;

变量:
    shell中的变量为弱变量
        1.无需事先声明
        2.无需指定变量类型,默认为字符型

变量分类:
        环境变量:
            当前shell及子shell
        本地变量:
            当前shell
        局部变量:
            local VAR_NAME=VALUE
            当前函数体
        位置变量
        特殊变量

建议:手动撤销自己定义或声明的所有变量;

函数的递归调用
    简单来说,就是在函数体中调用函数自身;

阶乘:
        N!=N*(N-1)!=N*(N-1)*(N-2)!=...=N*(N-1)*(N-2)*...*2*1
    shell代码:
#!/bin/bash
# Author: Tianyu.Zhao
#
fact(){
  if [ $1 -eq 0 ] || [ $1 -eq 1 ] ; then
    echo 1
  else
    echo "$[$1*$(fact $[$1-1])]"
  fi
}

echo -n "$1!="
fact $1

时间: 2024-08-28 20:57:38

Linux学习笔记:循环,定义函数的相关文章

python学习笔记5-自定义函数

1 自定义函数  (1)函数代码块以def关键字开头,然后函数标识符名称和圆括号  (2)任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数  (3)函数的第一行语句可以选择性的使用文档字符串用于存放函数说明  (4)函数内容以冒号开始 并且缩进  (5)return[expression]结束函数 选择性的返回一个值给调用方 不带  表达式的return相当于返回none 2 基本的定义和调用 1 #自定义函数 2 ''' 3 def functionname( paramet

Python学习笔记(Ⅱ)——循环/选择/函数

一.循环结构 python中提供了for循环和while循环两种操作,没有do--while语句. 1.for循环: 与其他语言中for循环的常见的写法如for (int i=0;i<10;i++)不同,python中的for循环更加类似于foreach结构: ##举例:遍历输出一个单词的所有字母for letter in 'Python': print('当前字母 :'+letter) 对比: string str = "Python"; foreach(char c in s

linux shell学习笔记二---自定义函数(定义、返回值、变量作用域)介绍

linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.下面说说它的定义方法,以及调用需要注意那些事项. 一.定义shell函数(define function) 语法: [ function ] funname [()] { action; [return int;] } 说明: 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数. 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值. retu

Linux学习笔记——例说makefile 增加宏定义

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

Linux学习笔记——例说makefile 增加系统共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

嵌入式Linux学习笔记之LED驱动

最近在学习嵌入式Linux驱动开发,大致了解了驱动的基本开发流程,本文主要针对字符设备驱动开发做一个简要介绍,也当作是对这几天工作的一个小小总结. 计算机系统是由软硬件相互协调共同完成工作的,作为专用计算机系统的嵌入式系统也不例外,既要有CPU.SDRAM.FLASH.IO等硬件,同时也少不了操作系统和应用软件等软件的支持,而作为应用程序与硬件的桥梁--驱动程序,是整个嵌入式系统开发过程中的关键环节.驱动开发涉及底层,而了解底层作用机制对于整个系统的开发意义重大. Linux内核中有60%以上是

linux学习笔记 (fork && FILE && PC)

一. 下面的代码是对fork的测试 运行结果为: 可以看出,所有进程的pid 为 10604 ~ 10611  (共 8 个   2 ^ 3) 修改循环条件,让循环执行5次, 所有进程的pid 为 : 10637 ~ 10668 (共 32 个  2 ^ 5) 可以看出,循环执行n次,进程的数目为: 2 ^ n 个 二. FILE结构体: 首先定位: cd /usr/include 搜索: gerp 'FILE' stdio.h 搜索出了一大堆,但其中有一行代码:  typedef struct

Linux学习笔记——例说makefile 增加自定义共享库

0.前言 从学习C语言开始就慢慢开始接触makefile,查阅了很多的makefile的资料但总感觉没有真正掌握makefile,如果自己动手写一个makefile总觉得非常吃力.所以特意借助博客总结makefile的相关知识,通过例子说明makefile的具体用法. 例说makefile大致分为4个部分 1.只有单个C文件 2.含有多个C文件 3.需要包括头文件路径 4.增加宏定义 5.增加系统共享库 6.增加自定义共享库 7.一个实际的例子 [代码仓库]--makefile-example

&lt;LINUX &gt;bash shell 入门 --linux学习笔记

首先说下我个人对于shell的理解,我觉得shell是一种通过各种控制语句将linux命令进行集合实现批处理的一种脚本语言. shell编程入门其实很简单,语法知识并不多,但是高级shell编程就很难,因为shell是用户和linux之间的桥梁,要编写高质量的shell脚本,就需要用户对linux有很全面的认识. 这里我们只分析shell脚本的语法知识,如想透彻的学习linux还需多努力. shell结构       1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建she

C++学习笔记--从虚函数说开去

虚函数与纯虚函数: 虚函数:在某基类中声明为virtual并在一个或多个派生类中被重新定义的成员函数,virtual  函数返回类型  函数名(参数表){函数体;} ,实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数.注意虚函数在基类中是有定义的,即便定义是空. 纯虚函数:在基类中是没有定义的,必须由派生类重定义实现,否则不能由对象进行调用. 看下面的例子: #include<iostream> using namespace std; class Cshape { p