SHELL脚本进阶
一、读取参数
$0 程序名称
$1 第一个参数
$2 第二个参数,依次类推
可以使用 basename 来读取程序名称:basename $0
可以使用 dirname 来读取第一个参数的目录:dirname $0
在使用参数之前应该尽量测试参数 [ -n "$1" ] 由于需要将参数作为字符串因此添加引号
特殊的参数变量:
$# 表示参数个数, ${!#} 读取最后一个参数(由于不能在大括号中使用$符号,因此使用!代替)
$* 将所有参数作为一个对象
$@ 将所有参数使用空格分隔的多个对象(因此若一个参数包括空格,应该使用引号)
shift 移位,将$1->$0, $2->$1 ......
注意:$? 表示最后语句的退出状态,$$表示进程自身的PID,$!表示SHELL最后运行的进程的pid
$()的作用与``相同、${}用于有效地将变量的名称分隔开来
while [ -n "$1" ]
do
case $ in
"-a") echo "Found the -a option";;
"-b") echo "Found the -b option";;
"-c") echo "Found the -c option";;
"*") echo "$1 is not an option";;
esac
shift
done count=
cat test1.sh | while read line
do
echo "Line $count: $line"
count=$[ $count+ ]
done #使用read命令读取文件,cat test1.sh | while read line 表示将test1.sh依次读取,读取的行保存在line变量之中
二、输入输出
STDIN 标准输入
STDOUT 标准输出
STDERR 标准错误
command 2>err.log 1>nor.log #重定向标准错误与标准输出
echo "This is an error" >&2 #临时重定向到标准错误
exec 1>nor.log #永久重定向
exec <test1.sh
count= while read line
do
echo "Line #$count: $line"
count=$[$count+]
done #重定向标准输入的例子
可以创建自己的文件描述符:
exec >test.log
echo "Test" >&
重定向文件描述符:
exec >&
exec >nor.log echo "This should store in the output file"
echo "along with this line" exec >& echo "Now things should be back to normal" exec 3>test.log
.....
exec 3>&- #关闭描述符
#在其中先保存3为标准输出,然后重定向标准输出到文件,完成输出后,在把标准输出恢复
列举文件描述符
/usr/sbin/lsof -p pid
禁止命令输出
ls -al > /dev/null
三、临时文件
mktemp zcs.XXXX #按照指定格式在本地目录创建临时文件
mktemp -t zcs.XXX #按照指定格式在系统临时目录创建临时文件
mktemp -d #用于创建临时目录
四、使用tee命令分流
date | tee tee.log
函数的使用
1、函数定义

function name {
commands
}
name() {
commands
}

#注意,name与大括号之间需要有空格
函数只有在定义之后才能使用,因此在脚本的前面引用后面定义的函数将报错,另外同名函数将被替换。
2、函数返回值
1)默认返回值:最后一条命令的退出状态。执行完函数后马上使用 $? 来提取返回值。
2)使用return语句
注意:这两种方式返回值取值范围都是 0~255,若为其他值将被取摸,因此有很大限制
3)使用函数输出,如下:
result=`function`
也就是在函数中使用echo语句进行输出,将输出结果赋值给变量,此时可以输出任何类型的值,但是注意,所有的echo都将被赋值给变量。若要打印日志则要注意使用重定向到日志文件之中。
exec 3>>func.log #打开描述符3重定向添加到func.log文件之中
......
echo "hah,lala">&3 #将日志打印到文件之中

function arraydblr {
local oriarray
local newarray
local elements
local i
oriarray=(`echo $@`)
newarray=(`echo $@`)
elements=$[$#-1]
echo `date` "ori: ${oriarray[*]},new: ${newarray[*]},elements: $elements" >&3
for (( i = 0; i <= $elements; i++ ))
{
newarray[$i]=$[${oriarray[$i]} * 2]
}
echo `date` ${newarray[*]}>&3
echo ${newarray[*]}
}

4)函数中使用参数
向函数传递的参数可以通过 $0 … 类似脚本参数方式读取
注意:对于脚本的参数,在函数内部无法访问,因此若需要应将其作为函数参数传递。
5)全局变量与局部变量
默认情况下,脚本中定义的所有变量都是全局变量,也就是在任何地方都可以访问
可以在脚本的头部引用脚本末尾定义的全局变量值
而函数为了避免污染全局变量,可以在函数内部使用local关键字定义变量。
6)数组变量
向函数传递数组,(注意:直接给函数传递数组变量,只会传递数组第一个值)
方法:将数组拆分后传递给函数,在函数内部在组装成数组
func ${arr[*]}
func {
local arr;
arr=(`echo “$@“`)
}
若要从函数中返回数组,只能通过echo的方式,echo ${ayyry[*]},外面使用变量赋值
7)创建库文件
将函数定义放到单独的文件之中,然后在使用的地方 通过source或者点命令导入库文件即可。
还可以将函数定义到 .bashrc, 或者在其中引用库文件,这样所有新shell都引用了
SHELL脚本进阶的更多相关文章
- shell脚本进阶之条件测试与条件语句
接着上篇博客,今天整理一下关于条件测试和条件语句方面的知识. shell脚本进阶之条件测试 在编写shell脚本时,经常需要对一些条件进行判断,可以使用测试命令test辅助完成测试过程.t ...
- 15-1 shell脚本进阶
shell脚本进阶 循环 循环执行 将某代码段重复运行多次 重复运行多少次 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 for, while, until for循环 for VAR i ...
- shell脚本进阶之循环判断
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; f ...
- Linux运维之shell脚本进阶篇
一.if语句的使用 1)语法规则 if [条件] then 指令 fi 或 if [条件];then 指令 fi 提示:分号相当于命令换行,上面两种语法等同特殊写法:if[ -f"$file ...
- shell脚本进阶 详解及其实例(一)
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- Linux shell脚本进阶使用
shell的循环控制语句 - continue:提前结束某次循环,重新开始下一次 - break:提前结束某层循环 范例: #求100以内的奇数和 #!/bin/bash sum=0 for i in ...
- Shell 脚本进阶2
1.查询系统基础情况脚本 #!/bin/bash # 系统状态查询脚本 # 输出系统基本信息 # # 系统版本 SYSTEM_VERSION=`cat /etc/redhat-release` # 主 ...
- Shell 脚本进阶,经典用法及其案例
一.条件选择.判断 1.条件选择if (1)用法格式 if 判断条件 1 ; then 条件为真的分支代码 elif 判断条件 2 ; then 条件为真的分支代码 elif 判断条件 3 ; the ...
- Shell—脚本编程进阶
shell脚本进阶之条件语句 条件选择if语句 https://www.runoob.com/?s=shell&page=1 https://www.cnblogs.com/flylinux/ ...
随机推荐
- java 实现模拟浏览器 访问网站
一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器,用来浏览页面查看信息或者提交一些数据等等.所访问的这些页面 有的仅仅是一些普通的页面,有的需要用户登录后方可使用,或者需 ...
- mybatis框架入门程序:演示通过mybatis实现数据库的删除操作
1.mybatis的基本配置工作可以在我的这篇博客中查看:https://www.cnblogs.com/wyhluckdog/p/10149480.html 2.删除用户的映射文件: <!-- ...
- 布局xml文件不能预览
原因:xml文件里,有一些值没有设置属性. 如: <LinearLayout android:layout_width="fill_ ...
- centos环境下输入命令不能有中文那么我怎么插入中文数据到数据库
centos环境下输入命令不能有中文那么我怎么插入中文数据到数据库 如下图: 首先查看是否安装了中文语言支持组件 yum grouplist 没有的话安装 yum install Chinese Su ...
- Appium自动化测试-iOS
Appium的哲学 我们相信,对原生应用的自动化测试,应当不必要包含其他的SDK组件或者特别编译您的App,并且应当可以选择任何您喜欢的测试方法,框架和工具.基于这些出发点我们开发了Appium.现在 ...
- Gym 101201F Illumination (Two-Sat)
题意:一个n*n的房子,有很多灯,每个格子只能被上下方向照一次.左右方向照一次,每个灯可以选择上下或是左右照,照明长度以自身位置为中心,占用2*r+1个格子.问能否安排一种方案,使所有格子满足条件. ...
- UVa 1153 Keep the Customer Satisfied (贪心+优先队列)
题意:给定 n 个工作,已知每个工作要用的时间 q 和 截止时间 d,问你最多完成多少个工作,每次最多能运行一个工作. 析:这个题是贪心,应该能看出来,关键是贪心策略是什么,这样想,先按截止时间排序, ...
- Linux 基础教程 38-文件下载
什么是wget wget用原始帮助里面的英文来讲就是:The non-interactive network downloader,非交互式网络下载器.它支持HTTP.HTTPS.FTP等协议 ...
- Web 应用简单测试方案
测试:一定要分阶段测试,先确定入队列成功,再测试队列的执行是否成功. 功能点: 1. 翻页2. 加精3. 置顶4. 帖子浏览量(PV)5. 发帖6. 回复7. 评论 8. crontab 脚本 @20 ...
- datasnap远程方法支持自定义对象传参
有同仁需要远程方法传输自定义的数据类型,他以为要自己写代码会很复杂,其实DATASNAP早就为我们想到了. datasnap的数据序列和还原真是无与伦比的强大,其远程方法支持自定义对象传参,DATAS ...