余苏明的幻想乡

第五 shell函数

第五 shell函数

@(shell脚本)[学习]

[toc]

函数的执行

执行不带参数的函数时,直接输入函数名即可

  • 执行Shell函数时,函数名前的function和函数后面的小括号都不要带
  • 函数的定义必须在执行的程序前面定义或加载
  • Shell执行系统中各种程序的执行顺序为:系统别名->函数->系统命令->可执行文件
  • 函数执行时,会和调用它的脚本共用变量,也可以为函数设定局部变量及特殊位置参数。
  • 在shell函数里面,return命令的功能与exit类似,return的作用是退出函数,而exit是退出脚本文件
  • return语句会返回一个返回值给调用函数的当前程序,而exit会返回一个返回值给执行程序的当前shell
  • 如果将函数存放在独立的文件中,被脚本加载使用时,需要使用source或者”.“来加载
  • 在函数内一般使用local定义局部变量

    带参数的函数执行方法如下:

    函数名 args1 args2 ..

  • shell的位置参数都可以作为函数的参数来使用。

  • 此时父脚本的参数临时地被函数参数所掩盖或隐藏
  • $0比较特殊,它仍然时父脚本的名称
  • 当函数执行完成时,原来的命令行脚本的参数即可恢复
  • 函数的参数变量时在函数体里面定义的

学习了函数后,应该尽量将脚本功能模块化,每个模块实现一个功能,并且让脚本可以通用。

case条件语句

case条件语句相当于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更规范更工整。

1
2
3
4
5
6
7
8
9
10
case "ARGS" in
value 1)
command
;;
value 2)
pass
;;
*)
command3 ...
esac

  1. case语句和if语句的实用性
    case语句比较适合变量值较少且为固定的数字或字符串集合的情况
  2. case语句和if语句的常用场景
  • case主要写服务的启动脚本,传参不同且具有少量的字符串
  • 几乎所有的case语句都可以用if语句来实现
  1. case语句的特点及优势
    规范,易读

    while循环和until循环

    while循环使用与频率小于1分钟的循环处理,其他的while循环几乎都可以被for循环和crond功能代替
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while <条件表达式>
    do
    command...
    done
    ---------------------
    until <条件表达式>
    do
    command...
    done

for和select循环语句

for循环语句

for循环主要用于执行次数有限的循环,而不是用于守护进程及无限循环

1
2
3
4
for 变量名 in 变量取值列表
do
command...
done

在此结构中“in 变量取值列表”可以省略,省略时相当于in “$@”,也就是for i in "$@"

c语言型for循环

1
2
3
4
for((exp1;exp2;exp3))
do
command...
done

使用ls与awk实现批量改名

1
ls|awk -F "." '{print "mv",$0,$1"_finished."$2}'|bash

使用rename改名

1
rename "_finished" "" *.jpg

select 循环语句

select 循环语句的主要作用可能就是创建菜单,在执行带select循环语句脚本时,输出会按照数字顺序的列表显示一个菜单项,并显示提示符,同时等待用户输入数字顺序的列表进行选择。
相当于半自动可控for循环。

1
2
3
4
select 变量名 [ in 菜单取值列表 ]
do
command ...
done

使用PS3='...'来改变默认提示符
$REPLY变量为上一个输入的值

循环控制及状态返回值

break,continue,exit,return

命令 说明
break n 跳出整个循环,n表示跳出循环的层数
continue n 跳过本次循环,n表示跳过循环的次数
exit n 退出当前shell程序,n为状态返回值
return n 函数返回

以上n均可省略

shell数组

1
array=(value1 value2 ...)

输出数组的所有元素值

1
2
3
echo ${array[*]}
#或
echo ${array[@]}

动态定义数组

1
2
3
array=($(command))
#或
array=(`command`)

数组也是变量,所以前面的变量子串知识也试用与数组 。例如echo ${\#array[@]}获取数组长度