数据透视表怎么用2007是否可以引用不连续的数组,比不A&F&Z

linux&shell
Linux常用命令登录时显示信息放在/etc/motd和/etc/profile.d/xxx.sh motd放置字符串profile.d下放置脚本文件echoecho -e 处理特殊字符,若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出: /a 发出警告声;/b 删除前一个字符;/c 最后不加上换行符号;/f 换行但光标仍旧停留在原来的位置;/n 换行且光标移至行首;/r 光标移至行首,但不换行;/t 插入tab;/v 与/f相同;/ 插入/字符;/nnn 插入nnn(八进制)所代表的ASCII字符;echo -n 不换行输出date +%T 以格式化输出当前时间ls -lrt 按时间升序列表显示dirname 路径
dirname $0basename 文件名在环境变量文件中使用alias vi=’vim’即可实现vi代替vim命令ShellShell脚本的建立与执行Shell 脚本的建立使用文本编辑器编辑脚本文件 vi script-file为脚本文件添加可执行权限 chmod +x script-fileShell 脚本的执行在子Shell中执行 变量及结果在结束时从内存销毁,外部shell无法引用bash script-file或者./script-file在当前Shell中执行 当前shell可继续引用运行结束shell的变量及结果source script-file.
script-fileShell脚本的编码规范以 #! 开头:通知系统用何解释器执行此脚本#!/bin/bash或者#!/bin/sh以注释形式说明如下的内容:# 脚本名称# 脚本功能# 作者及联系方式# 版本更新记录# 版权声明# 对算法做简要说明(如果是复杂脚本)示例#!/bin/bash# This is the first Bash shell program # Scriptname: greetings.shechoecho -e "Hello $LOGNAME, /c"echo
"it's nice talking to you."echo -n "Your present working directory is: "pwd # Show the name of present directoryechoecho -e "The time is `date +%T`!. /nBye"echo时间同步shell脚本#!/bin/bash## Script Name:/etc/cron.daily/ntpdate# 使用NTP的客户端命令ntpdate与远程NTP服务器进行同步# 也可以用局域网内的NTP服务器替换 pool.ntp.org/usr/sbin/ntpdate -s pool.ntp.org# 更改硬件时钟时都会记录在/etc/adjtime文件中# 使hwclock根据先前的记录来估算硬件时钟的偏差,# 并用来校正目前的硬件时钟/sbin/hwclock --adjust# 将系统时钟同步到硬件时钟/sbin/hwclock –systohc 脚本调试方法在 bash 调用脚本时使用参数bash [-x] [-n] [-v]
scriptName sh –x 脚本名
该选项可以使用户跟踪脚本的执行,此时 shell 对脚本中每条命令的处理过程为:先执行替换,然后显示,再执行它。shell 显示脚本中的行时,会在行首添加一个加号 “ + ”以调试模式执行脚本sh –v 脚本名 在执行脚本之前,按输入的原样打印脚本中的各行显示脚本中每个原始命令行及其执行结果sh –n 脚本名 对脚本进行语法检查,但不执行脚本。如果存在语法错误,shell 会报错,如果没有错误,则不显示任何内容对脚本进行语法检查 在脚本中使用 bash 内置的 set 命令使整个或部分脚本处于调试模式开启:set [-x] [-n] [-v] 在脚本内使用set命令开启调试选项 set -x :显示由shell执行的命令及其参数set -v :显示由shell读入的命令行set -n :读取命令但不执行他们,用于语法检查结束:set [+x] [+n] [+v] 在脚本内使用set命令关闭已开启的调试选项 set +xset +vset +n示例
#!/bin/bash
# This is the first Bash shell program
# Scriptname: greetings.sh
set -x ### Turn ON debug mode ###
echo -e "Hello $LOGNAME, /c"
"it's nice talking to you."
echo -n "Your present working directory is: "
pwd # Show the name of present directory
set +x ### Turn OFF debug mode ###
echo -e "The time is `date +%T`!. /nBye"
echoShell脚本的类型非交互式脚本不需要读取用户的输入, 也不用向用户反馈某些信息每次执行都是可预见的, 因为它不读取用户输入, 参数是固定的可以在后台执行交互式脚本脚本可以读取用户的输入, 实时向用户反馈信息(输出某些信息)这样的脚本更灵活, 每次执行时的参数可由用户动态设定用户界面更友好,但不适用于自动化任务(如cron任务)Shell变量操作变量替换扩展 变量测试变量的字符串操作变量的间接引用变量的数值计算 $[expression]
$((expression))exprletdeclare -i输入 变量赋值 name=valuereadonly从标准输入读取 read输出 echoprintf变量替换扩展变量测试示例字符串计数、截取示例字符串替换示例变量的间接引用通过 str2 的值来引用 str1 的值错误示例str1="Hello World"str2=str1echo $str2正确示例str1="Hello World"str2=str1newstr=${!str2}echo $newstrHello World或echo ${!str2}Hello World或eval newstr=/$$str2echo $newstrHello World或eval echo /$$str2Hello World x=”CENTOS”CENTOS_URL=”/centos/”通过 x 的值来引用 CENTOS_URL 的值# bash2.0以上才支持newstr=${x}_URLecho $newstrCENTOS_URLecho ${!newstr}/centos/ 或eval newstr=/$${x}_URLecho $newstr或eval echo /$${x}_URLShell内置命令——evaleval arg1 [arg2] … [argN] * 对参数进行两次扫描和替换
* 将所有的参数连接成一个表达式,并计算或执行该表达式
* 参数中的任何变量都将被展开
listpage="ls -l | more"
eval $listpage
eval $(ssh-agent)
eval newstr=/$$str2
eval echo /$${x}_URL Shell 变量的分类用户自定义变量 由用户自己定义、修改和使用Shell 环境变量 由系统维护,用于设置用户的Shell工作环境只有少数的变量用户可以修改其值位置参数变量(Positional Parameters) 通过命令行给程序传递执行参数可用 shift 命令实现位置参数的迁移专用参数变量(Special Parameters) Bash 预定义的特殊变量用户不能修改其值位置变量是一组特殊的内置变量 跟在脚本名后面的用空格隔开的每个字符串1表示第1个参数值,……,9 表示第9个参数值10表示第10个参数值,{11} 表示第11个参数值, ……位置参数的用途 从 shell 命令/脚本 的命令行接受参数在调用 shell 函数时为其传递参数专用参数变量命令行参数相关$*
获取当前shell脚本所有传参的参数,将所有位置参量看成一个字符串(以空格间隔),相当于""$1$2$3$4$5 。$@
将每个位置参量看成单独的字符串(以空格间隔)"$!" "$2" "...."。"$*"
将所有位置参量看成一个字符串(以$IFS间隔)。"$@"
将每个位置参量看成单独的字符串(以空格间隔) 。$0
命令行上输入的Shell程序名。$#
表示命令行上参数的个数。进程状态相关$?
表示上一条命令执行后的返回值$$
当前进程的进程号$!
显示运行在后台的最后一个作业的 PID $_
在此之前执行的命令或脚本的最后一个参数示例 位置参数和 shift 命令shift [n]将位置参量列表依次左移n次,缺省为左移一次一旦位置参量列表被移动,最左端的那个参数就会从列表中删除经常与循环结构语句一起使用,以便遍历每一个位置参数#!/bin/sh# ScriptName: pp_shift.sh# To test Positional Parameters & Shift.echo "The script name is :
$0"echo '$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4
'$#'="$#" echo '$@': "$@" shift
# 向左移动所有的位置参数1次echo '$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4
'$#'="$#"echo '$@': "$@"shift 2
# 向左移动所有的位置参数2次echo '$1'=$1,'$2'=$2,'$3'=$3,'$4'=$4
'$#'="$#"echo '$@': "$@"$ ./pp_shift.sh
1 b 3 d 4 f退出/返回状态$?:返回上一条语句或脚本执行的状态0:成功1-255:不成功1:执行正确126:命令或脚本没有执行权限127:命令没有找到exit 命令exit 命令用于退出脚本或当前Shell exit n n 是一个从 0 到 255 的整数0 表示成功退出,非零表示遇到某种失败返回值 被保存在状态变量 $? 中示例
# 显示当前进程的 PID
# 显示在此之前执行的命令的返回值
# 调用子Shell
# 显示当前进程的 PID
# 指定返回值并返回父Shell
# 显示上一个Shell/脚本的返回值
# 执行不存在的命令
bash: list: command not found
$ touch bbb.sh
$ ./bbb.sh
# 执行不具有执行权限的命令
bash: ./bbb.sh: Permission denied
126read从键盘输入内容为变量赋值 read
[var1 var2 …]若省略变量名,则将输入的内容存入REPLY变量结合不同的引号为变量赋值 双引号 ” ”:允许通过$符号引用其他变量值单引号 ’ ’:禁止引用其他变量值,$视为普通字符反撇号
:将命令执行的结果输出给变量示例
#!/bin/bash
# This script is to test the usage of read
# Scriptname: ex4read.sh
echo "=== examples for testing read ==="
echo -e "What is your name? /c"
echo "Hello $name"
echo -n "Where do you work? "
echo "I guess $REPLY keeps you busy!"
read -p "Enter your job title: "
echo "I thought you might be an $REPLY."
echo "=== End of the script ==="只读变量是指不能被清除或重新赋值的变量readonly variable示例
[lrj@centos1 ~]$ myname=Osmond
[lrj@centos1 ~]$ echo $myname
[lrj@centos1 ~]$ readonly myname
[lrj@centos1 ~]$ unset myname
-bash: unset: myname: cannot unset: readonly variable
[lrj@centos1 ~]$ myname="Osmond Liang"
-bash: myname: readonly variable同时输出多行信息使用 echo使用
here file整数运算Bash 变量没有严格的类型定义 本质上 Bash 变量都是字符串若一个字面常量或变量的值是纯数字的,不包含字母或其他字符, Bash可以将其视为长整型值,并可做算数运算和比较运算。Bash 也允许显式地声明整型变量 declare -i 变量名算数运算符算术运算扩展—在此没有空格的问题
$ var=test
$ echo $var
$ echo $varAA
$ echo ${var}AA
$ echo $(ls)
$ echo `ls`
a b cShell内置命令letlet 内置命令用于算术运算num2=1; echo $num2let num2=4+1; echo $num2let num2=$num2+1; echo $num2赋值符号和运算符两边不能留空格!如果将字符串赋值给一个整型变量时,则变量的值为 0如果变量的值是字符串,则进行算术运算时设为 0let num2=4 + 1let "num2=4 + 1" # 用引号忽略空格的特殊含义用 let 命令进行算术运算时,最好加双引号expr通用的表达式计算命令表达式中参数与操作符必须以空格分开。表达式中的运算可以是算术运算,比较运算,字符串运算和逻辑运算。expr 5 % 3expr 5 /* 3
# 乘法符号必须被转义expr 2 + 5 /* 2 - 3 % 2expr /( 2 + 5 /) /* 2 – 3
# 括号必须被转义浮点数运算bash 只支持整数运算可以通过使用 bc 或 awk 工具来处理浮点数运算n=$(echo "scale=3; 13/2" | bc )echo $nm=`awk 'BEGIN{x=2.45;y=3.123;printf "%.3f/n", x*y}'`echo $mprintfprintf 可用来按指定的格式输出变量printf format 输出参数列表
示例数组变量Bash 2.x 以上支持一维数组,下标从 0 开始使用 declare 声明或直接给变量名加下标来赋值declare -a variablevariable=(item1 item2 item2 ... )数组的引用${variable[n]}示例declare内置命令 declare 可用来声明变量declare [选项] variable[=value] 示例
declare myname=osmond
declare –r myname=osmond
unset myname
declare myname=“Osmond Liang"
declare –x myname2=lrj
myname2=lrj
declare –x myname2变量及相关命令小结
条件测试条件测试可以判断某个特定条件是否满足 测试之后通常会根据不同的测试值选择执行不同任务条件测试的种类 命令成功或失败表达式为真或假条件测试的值 Bash中没有布尔类型变量 退出状态为 0 表示命令成功或表达式为真非0 则表示命令失败或表达式为假状态变量 $? 中保存了退出状态的值示例条件测试语句语句 格式1: test &测试表达式& 格式2: [ &测试表达式& ] 格式3: [[ &测试表达式& ]] (bash 2.x 版本以上)说明 格式1 和 格式2 是等价的,格式3是扩展的 test 命令在 [[ ]] 中可以使用通配符进行模式匹配&&, ||, &, 和&能够正常存在于[[ ]]中,但不能在 [] 中出现[和[[之后的字符必须为空格,]和]]之前的字符必须为空格要对整数进行关系运算也可以使用 (()) 进行测试条件测试操作符条件测试表达式中可用的操作符 文件测试操作符字符串测试操作符整数二元比较操作符使用逻辑运算符文件测试测试:文件是否存在,文件属性,访问权限等字符串测试字符串按从左到右对应字符的ASCII码进行比较
字符串空值检查检查空值检查非空值整数测试操作符两边必须留空格! 操作符两边的空格可省略 示例 逻辑测试示例流程控制——分支流程控制语句 分支 if 条件语句case 选择语句循环 for 循环语句while 循环语句until 循环语句select 循环与菜单循环控制 break
语句continue
语句位置参数处理 shift
命令getopts 命令 if 语句
# 如果 expr1 为真(返回值为0)
# 执行语句块 commands1
elif expr2
# 若 expr1 不真,而 expr2 为真
# 执行语句块 commands2
# 可以有多个 elif 语句
# else 最多只能有一个
# 执行语句块 commands4
# if 语句必须以单词 fi 终止elif 可以有任意多个(0 个或多个)else 最多只能有一个(0 个或 1 个)if 语句必须以 fi 表示结束exprX 通常为条件测试表达式;也可以是多个命令,以最后一个命令的退出状态为条件值。commands 为可执行语句块,如果为空,需使用 shell 提供的空命令 “ : ”,即冒号。该命令不做任何事情,只返回一个退出状态 0if 语句可以嵌套使用示例
case expr in # expr 为表达式,关键词 in 不要忘!
# 若 expr 与 pattern1 匹配,注意括号
commands1 # 执行语句块 commands1;
# 跳出 case 结构
# 若 expr 与 pattern2 匹配
commands2 # 执行语句块 commands2;
# 跳出 case 结构
# 可以有任意多个模式匹配
# 若 expr 与上面的模式都不匹配
# 执行语句块;
# 跳出 case 结构
# case 语句必须以 esac 终止表达式 expr 按顺序匹配每个模式,一旦有一个模式匹配成功,则执行该模式后面的所有命令,然后退出 case。如果 expr 没有找到匹配的模式,则执行缺省值 “ ) ” 后面的命令块 ( 类似于 if
中的 else );“ ) ” 可以不出现。所给的匹配模式 pattern 中可以含有通配符和“ | ”。每个命令块的最后必须有一个双分号,可以独占一行,或放在最后一个命令的后面。
流程控制——循环
for variable in list
# 每一次循环,依次把列表 list 中的一个值赋给循环变量
# 循环体开始的标志
# 循环变量每取一次值,循环体就执行一遍
# 循环结束的标志,返回循环顶部列表 list 可以是命令替换、变量名替换、字符串和文件名列表 ( 可包含通配符 ),每个列表项以空格间隔for 循环执行的次数取决于列表 list 中单词的个数可以省略
in list ,省略时相当于
in “$@”首先将 list 的 item1 赋给 variable执行do和done之间的 commands然后再将 list 的 item2 赋给 variable 执行do和done之间的 commands *如此循环,直到 list 中的所有 item 值都已经用完示例
break 和 continuebreak [n] 用于强行退出当前循环如果是嵌套循环,则 break 命令后面可以跟一数字 n,表示退出第 n 重循环(最里面的为第一重循环)continue [n] 用于忽略本次循环的剩余部分,回到循环的顶部,继续下一次循环如果是嵌套循环,continue 命令后面也可跟一数字 n,表示回到第 n 重循环的顶部示例 for循环(C语言型)语法
for ((expr1;expr2;expr3)) # 执行 expr1
do # 若 expr2的值为真时进入循环,否则退出 for循环
# 执行循环体,之后执行 expr3
# 循环结束的标志,返回循环顶部通常 expr1和 expr3是算数表达式; expr2是逻辑表达式expr1 仅在循环开始之初执行一次expr2 在每次执行循环体之前执行一次expr3 在每次执行循环体之后执行一次首先执行 expr1执行 expr2 其值为假时,终止循环其值为真时,执行do和done之间的 commands执行expr3,进入下一次循环示例
while 循环语句
while expr
# 执行 expr
do # 若expr的退出状态为0,进入循环,否则退出while
# 循环结束标志,返回循环顶部示例 * While 和输入重定向
* 使用管道为 while 传递输入
until 循环语句
until expr
# 执行 expr
do # 若expr的退出状态非0,进入循环,否则退出until
# 循环结束标志,返回循环顶部示例
将循环结果通过管道传递给其他命令处理(done |) 后台执行循环(done &) 循环与菜单一般地,使用 while 循环配合 case实现Bash 提供了专门的 select 循环 select 循环主要用于创建菜单select 是个无限循环 通常要配合 case 语句处理不同的选单及退出select 循环的退出 按
退出循环在循环体内用 break 命令退出循环或用 exit 命令终止脚本示例使用while循环实现菜单 循环结构——select 语法
select variable in list
# 循环开始的标志
# 循环变量每取一次值,循环体就执行一遍
# 循环结束的标志按数值顺序排列的菜单项(list item)会显示到标准输出菜单项的间隔符由环境变量 IFS 决定用于引导用户输入的提示信息存放在环境变量 PS3 中用户输入的值会被存储在内置变量 RELAY 中用户直接输入回车将重新显示菜单与 for 循环类似,省略 in list 时等价于 in “$*”示例
位置参数和命令行参数处理在脚本中经常使用流程控制处理位置参数 循环结构:while、for多分支结构:case在脚本中经常使用如下命令配合位置参数处理 shiftgetopts示例参数位置遍历
位置参数处理举例 选项和参数mybackup -z -c /etc/mybackup.conf
-r -v ./foo.txt
./mydir-z是个选项(option),以减号开始的单字符-c也是个选项,/etc/mybackup.conf 是该选项的附加参数(additional argument )-r和-v也是选项,且不带附加参数./foo.txt
和 ./mydir 是脚本的处理对象,他们是不与任何选项相关的参数,在POSIX(R)标准中称其为“操作 对象/数”(operands)按照Linux的命令行书写规范,如下命令行mybackup -z -c /etc/mybackup.conf
-r -v ./foo.txt
./mydir也可以写成如下的等价形式mybackup -zr -c /etc/mybackup.conf -v ./foo.txt
./mydirmybackup -zv -c /etc/mybackup.conf -r ./foo.txt
./mydirmybackup -vr -c /etc/mybackup.conf -z ./foo.txt
./mydirmybackup -vz -c /etc/mybackup.conf -r ./foo.txt
./mydirmybackup -zrv -c /etc/mybackup.conf ./foo.txt
./mydir用户使用自己的代码分析这些选项将变得十分困难Shell的内置命令getopts可以识别所有常见的选项格式,为用户处理选项和参数提供了方便内置命令——getoptsgetopts OPTSTRING VARNAME [ARGS…]OPTSTRING
是由若干有效的选项标识符组成的选项字符串若某选项标识符后有冒号,则表示此选项有附加参数若整个字符串前有冒号,将使用“安静”的错误模式VARNAME :每次匹配成功的选项保存在变量中ARGS : 参数列表,省略时为 ”$@”getopts c:zrv optgetopts :c:zrv optgetopts的执行过程通常需要以循环的方式执行多次 getopts 来解析位置参数中的选项以及可能存在的选项附加参数 *每次调用 getopts,将会处理参数列表中的“下一个”选项 将选项存储在VARNAME变量中将此选项对应的附加参数存储在环境变量OPTARG中对环境变量OPTIND进行自增操作,使 $OPTIND 总是指向原始参数列表中“下一个”要处理的元素位置若VARNAME与OPTSTRING的所有选项均不匹配,则做“invalid option”的错误设置若某选项的参数不存在,则做“required argument not found”的错误设置getopts的错误报告模式冗余(Verbose)模式( OPTSTRING 不以:开头) “invalid option” VARNAME=“?” ; unset OPTARG“required argument not found” VARNAME=“?” ; unset OPTARG 并输出错误信息安静(Silent)模式( OPTSTRING 以:开头) “invalid option” VARNAME=“?” ; OPTARG=‘无效的选项字符’“required argument not found” VARNAME=“:” ; OPTARG=‘与参数对应的选项字符’while循环与getopts处理
while getopts
case $VARNAME in
…) ………… ;;
…) ………… ;;
:) ………… ;;
/?) ………… ;;
donegetopts 返回假时终止 while 循环 当 getopts 遭遇到第一个非选项参数时终止解析当
getopts 遭遇到 “–”参数时终止解析getopts的注意事项getopts 不能解析 GNU-style 长参数 (–myoption) getopts从不改变原始位置参数 若希望移动位置参数,需手工执行 shiftgetopts会自动对变量 OPTIND 做自增处理 OPTIDX的初始值为 1若要重新解析命令行参数,需将OPTIDX的值置为 1getopts 遭遇到第一个非选项参数时终止解析 终止解析后执行命令 shift ((OPTIND-1))可以使 ”$@” 只包含“操作 对象/数”(operands示例示例1#!/bin/bash## filename : pp_parse_getopts_1.shwhile getopts
"abc:def:ghi" flagdo
echo "$flag" $OPTIND $OPTARGdoneecho "Resetting"OPTIND=1while getopts
"bc:def:ghi" flagdo
echo "$flag" $OPTIND $OPTARGdone$ ./pp_parse_getopts_1.sh -a -bc foo -f "foo bar" -h –gde$ ./pp_parse_getopts_1.sh -abf "foo bar" -h -gde –c$ ./pp_parse_getopts_1.sh -abf “foo bar” -h –c -gde示例2#!/bin/bash## filename : pp_parse_getopts_2.shwhile getopts
":abc:def:ghi" flagdo
echo "$flag" $OPTIND $OPTARGdoneecho "Resetting"OPTIND=1while getopts
":bc:def:ghi" flagdo
echo "$flag" $OPTIND $OPTARGdone$ ./pp_parse_getopts_2.sh -a -bc foo -f "foo bar" -h -gde$ ./pp_parse_getopts_2.sh -abf "foo bar" -h -gde –c$ ./pp_parse_getopts_1.sh -abf “foo bar” -h –c -gde* 示例3
#!/bin/bash
## filename : mybackup_getopts.sh
while getopts :zc:x:rv opt
case $opt in
c) ConfFile=$OPTARG;
x) ExcludeFile=$OPTARG;
z) Compress=;
r) Recursive=;
v) Verbose=;
echo "$0: Must supply an argument to -$OPTARG." &&2
/?) echo "Invalid option -$OPTARG ignored." &&2;
shift $((OPTIND-1)) ; echo $0 ; echo "$@"示例4#!/bin/bash## filename : mybackup_getopts2.shwhile getopts :zc:x:rv optdo
case $opt in
c) if [[ $OPTARG = -* ]]; then
((OPTIND--)) ;
ConfFile=$OPTARG;
x) ExcludeFile=$OPTARG;
z) Compress=;
r) Recursive=;
v) Verbose=;
echo "$0: Must supply an argument to -$OPTARG." &&2
/?) echo "Invalid option -$OPTARG ignored." &&2;
esacdoneshift ((OPTIND-1)) ; echo $0 ; echo "$@"函数为了避免大型脚本变得复杂、晦涩而使用函数将大型脚本代码分割成小块,将这些被命名的代码块称为函数 一个函数就是一个子程序,用于完成特定的任务 如:添加一个用户、判断用户是否为管理员 等函数定义之后可以被使用它的主程序调用 调用函数的方法与执行Shell命令无异可以在Shell脚本中调用(函数需先定义而后调用)在命令行上直接调用(定义函数的文件需先加载合理使用Shell函数简化程序代码,实现代码重用 实现一次定义多次调用。如:is_root_user()函数可以由不同的shell脚本重复使用。实现结构化编程 使脚本内容更加简洁,增强程序的易读性提高执行效率 将常用的功能定义为多个函数并将其保存在一个文件中 类似其他语言的“模块”文件在 ~/bashrc 或命令行上使用 source 命令调用这个文件此文件中定义的多个函数一次性地调入内存,从而加快运行速度函数的定义和调用函数定义函数调用只需输入函数名即可调用函数 函数名函数名
…函数必须在调用之前定义函数的存储和显示函数的存储 函数和调用它的主程序保存在同一个文件中 *函数的定义必须出现在调用之前 *函数和调用它的主程序保存在不同的文件中 保存函数的文件必须先使用 source 命令执行,之后才能调用其中的函数函数的显示 显示当前Shell可见的所有函数名 $ declare -F显示当前Shell可见的所有(指定)的函数定义 $ declare -f$ declare -f
示例函数的定义和调用示例1#!/bin/bash## filename: all_in_one_backup_select.sh### User define Function (UDF) ###sql_bak
() { echo "Running mysqldump tool..."; }sync_bak () { echo "Running rsync tool..."; }git_bak
() { echo "Running gistore tool..."; }tar_bak
() { echo "Running tar tool..."; }### Main script starts here ###PS3="Please choose a backup tools : "select s in
mysqldump rsy do
case $REPLY in
esacdone示例2#!/bin/bash## filename: /root/bin/my_backup_functions.sh### User define Function (UDF) ###sql_bak
() { echo "Running mysqldump tool..."; }sync_bak () { echo "Running rsync tool..."; }git_bak
() { echo "Running gistore tool..."; }tar_bak
() { echo "Running tar tool..."; }示例3#!/bin/bash## filename: all_in_one_backup_select.sourcefunc.shsource /root/bin/my_backup_functions.sh### Main script starts here ###PS3="Please choose a backup tools : "select s in
mysqldump rsy do
case $REPLY in
1|[mM]ysqldump) sql_;
2|[rR]sync)
3|[gG]istore)
esacdone函数与变量参数(Arguments) 调用函数时,使用位置参数的形式为函数传递参数函数内的1-{n} 、*和@ 表示其接收的参数函数调用结束后位置参数 1-{n} 、*和@ 将被重置为调用函数之前的值在主程序和函数中,$0始终代表脚本名变量(Variables) *函数内使用 local 声明的变量是局部(Local)变量
*局部变量的作用域是当前函数以及其调用的所有函数 函数内未使用 local 声明的变量是全局(Global)变量 *即主程序和函数中的同名变量是一个变量(地址一致示例函数与位置参数示例1#!/bin/bash## filename: pp_and_function.shecho "===Print positional parameters in main :"echo "$0: $*"pp1(){
echo 'f1--Print $* parameters in fun1 :' ; echo "$0: $*"}pp2(){
echo 'f2--Print $* parameters in fun1 :' ; echo "$0: $*"
pp1 1st 2nd 3th 4th 5th 6th 7th 8th 9th
echo 'f2--Print $* parameters in fun1 :' ; echo "$0: $*"}pp1 1 2 3 4 5 6 7 8 9echo "===Print positional parameters in main :"echo "$0: $*"pp2 I II III IV V VI VII VIII IX./pp_and_function.sh
a b c d e f g h i示例2#!/bin/bash## filename: function_max.sh# User define Function (UDF)usage () {
echo "List the MAX of the positive integers in command line. "
echo "Usage: `basename $0` &num1& &num2& [ &num3& ... ]"
exit}max () {
[[ -z $1 || -z $2 ]] && usage
largest=0 do
((i&largest)) && largest=$ done}### Main script starts here ###max "$@"echo "The largest of the numbers is $largest."./function_max.sh
1 58 111 32768 66由于largest变量在函数max内没有使用local声明,所以它是全局的函数的结束与返回值当函数的最后一条命令执行结束函数即结束 函数的返回值就是最后一条命令的退出码其返回值被保存在系统变量$?中可以使用 return 或 exit 显式地结束函数 return [N] return 将结束函数的执行可以使用 N 指定函数返回值exit
[N] exit 将中断当前函数及当前Shell的执行可以使用 N 指定返回值示例
#!/bin/bash
## filename: function_max2.sh
# User define Function (UDF)
if [[ -z $1 || -z $2 ]] ; then
"Need 2 parameters to the function." ; exit
[ $1 -eq $2 ] &&
{ echo "The two numbers are equal." ; }
(($1&$2)) && return $1 || return $2
### Main script starts here ###
read -p "Please input two integer numbers
echo "n1=$n1 , n2=$n2“
max2 $n1 $n2
return_val=$?
echo "The larger of the two numbers is $return_val."函数返回值使用全局变量引用函数的值不利于结构化编程使用 return 或 exit 只能返回整数值使用标准输出实现函数的返回值 是一种通用的方法,既能返回整数又能返回字符串函数结束前使用 echo 命令将结果显示到标准输出调用函数时使用如下的格式将函数的输出结果存到变量 RES 中,之后便可使用变量 $RES 的值(或输出、或执行测试、或进一步处理等)RES=$(functionName)echo $RES示例使用标准输出返回函数值#!/bin/bash## filename: function_to-upper.sh# User define Function (UDF)to_upper () {
local str="$@"
local output
output=$(tr '[a-z]' '[A-Z]'&&&"${str}")
echo $output}### Main script starts here ###to_upper "This Is a TEST"res=$(to_upper "$@")echo "$res"res=$(to_upper "$1")[[ $res == "YES" ]] && echo "Continue..." || echo "Stop"./function_to-upper.sh YES we are./function_to-upper.sh No we are not系统INIT 启动脚本的结构——/etc/rc.d/init.d/*
最新教程周点击榜
微信扫一扫}

我要回帖

更多关于 数据透视表怎么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信