Linux Unix shell 编程指南学习笔记(第四部分)
第十六章 shell脚本介绍
此章节内容较为简单,跳过。
第十七章 条件測试
test命令
expr命令
test
格式 test condition 或者 [ condition ] (注意: condition两側有空格)
文件状态測试:
- - d 文件夹 。 - s 文件长度大于0、非空 ; - f 正规文件
- - w 可写 。 - L 符号连接 ; - u 文件有s u i d位设置
- - r 可读 ; - x 可运行
測试的逻辑操作符:
-a :逻辑与。操作符两边均为真。结果为真,否则为假。
-o : 逻辑或。操作符两边一边为真,结果为真。否则为假。
! : 逻辑否,条件为假,结果为真。
字符串測试:
- = 两个字符串相等。
- ; !
- = 两个字符串不等。
- -z 空串。
- 。 -n 非空串。
数值測试:
- -eq 数值相等。
- ; -ne 数值不相等。
- -gt 第一个数大于第二个数。 。 -lt 第一个数小于第二个数。
- -le 第一个数小于等于第二个数。
- <span style="white-space:pre"> </span>。 -ge 第一个数大于等于第二个数。
expr(一般用于整数值 也能够 用于字符串 , expr 測试成功返回 1 , 其它值为错误)
格式: expr argument operator argument
对数字: expr number1 [+ - * / 等] number2
对字符串: expr string1 [= 模式匹配等 ]
expr的模式匹配: expr string : pattern
第十八章 控制流程
退出状态
while、for 和 until loop 循环
if then else 语句
脚本中动作
菜单
退出状态
使用 $? 查看最后退出状态。主要有4种退出状态,即 $ ?
和控制次序命令($ $、| |)。
其余两种是处理s h e l l脚本或s h e l l退出及对应退出状态或函数返回码。
退出当前进程 exit n 。 n 为一个数值。
键入e x i t,s h e l l将试图(一般是这样)返回上一个命令返回值
循环
for
循环每次处理依次列表内信息。直至循环耗尽。
Until 循环 此循环语句不常使用,u n t i l循环直至条件为真。
条件部分在循环末尾部分。
While 循环 w h i l e循环当条件为真时,循环运行,条件部分在循环头。
if then else 语句(也能够检測命令是否成功返回)
- if 条件1
- then 命令1
- elif 条件2
- then 命令2
- else 命令3
- fi
例子代码
- #!/bin/bash
- # it is used to create a file which add header "#!/bin/bash" automatically
- filename=$1
- # get the first parameter used as filename
- #echo $filename
- if [!$filename ]; then
- read var
- filename=$var
- else
- echo $filename
- fi
- echo '#!/bin/bash' > $filename # write data to filename
- vim $filename # open file with vim editor
一段简单脚本代码,在当前文件夹下创建一个当前文件夹不存在的文件。键入 文件名称 -h 还能够查看帮助文档。
- #!/bin/bash
- fname=$1
- function help(){
- echo "this is a simple helper document for use this tool";
- echo "basic form : ./newFile [option] [filename]";
- echo -e "\t -h\t print this help page"
- }
- if [ $fname ]; then
- case $fname in
- -h) help;exit;;
- esac
- fileArray=$(ls -a)
- for aFile in $fileArray; do
- if [ $aFile = $fname ]; then
- echo " file $fname already exits ."
- exit
- fi
- done;
- else
- echo "please input a file name that will be created ! "
- exit
- fi
- touch $fname && echo "file $fname create success !"
if 检查命令运行结果
- #!/bin/bash
- #name: if_test_comman
- if grep -nr "good" ./ > /dev/null 2>&1
- then echo "string good found !"
- else echo "there isn't a string called good under $PWD"
- fi
測试传递參数个数: if [ $# lt n ] 。then 命令 ; 假设传入參数少于 n 个。 那么运行命令。
推断脚本是否为交互模式(终端模式)还是非交互模式(c r o n或a t): if [ -t ]
检測前面近期一个的命令状态: if [ $? = 0 ] ; then 命令
case 语句 (模式中能够是常量和变量)
- <span style="font-size:14px;"><strong>case 值 in
- 模式1)命令...;;
- 模式2)命令...;;
- 模式3)命令...;;
- ......
- esac</strong></span>
模式中还能够包括元字符:
* 随意字符。;?随意单字符。。[..] 类或范围中随意字符。
- #!/bin/bash
- case $1 in
- "1") echo "one";;
- "2") echo "two";;
- "3") echo "three";;
- "4") echo "four";;
- "5") echo "five";;
- "6"|"six") echo "six";;
- *)echo "unknown data $1"
- esac <span style="color:#006600;"> </span>
for 循环
- for 值 in 列表(假设不指定列表,默认取位置參数)
- do
- 命令...
- done
使用for循环显示全部的位置參数(能够是随意个数的參数)
- #!/bin/bash
- #name: for_use_geovar
- echo -e "location variables are : \c"
- for VAR # the same as “in "$@"” or "in "$*""
- do
- echo -e $VAR "\c"
- done
- echo ""
嵌套for循环
- for 变量名1 in列表1
- d o
- <span style="white-space:pre"> </span>for 变量名2 in 列表2
- <span style="white-space:pre"> </span>d o
- <span style="white-space:pre"> </span>命令1
- <span style="white-space:pre"> </span>. . .
- <span style="white-space:pre"> </span>d o n e
- d o n e
until 循环(一般可用while循环替代。通常情况while循环优于until循环)
- until 条件
- do
- <span style="white-space:pre"> </span>命令1
- <span style="white-space:pre"> </span>. . .
- d o n e
while 循环
- while 命令
- d o
- <span style="white-space:pre"> </span>命令1
- <span style="white-space:pre"> </span>. . .
- d o n e
while从文件里读取数据:
- <span style="font-size:14px;"><strong>while read LINE
- do
- XXX
- echo $LINE
- done < filename</strong></span>
break 和 continue 适合于 case 和循环。
第十九章 shell 函数
shell 函数定义:一组命令集或语句组成的可用块。
函数的组成: 函数标题 和 函数体。
使用函数能够节省大量的脚本编写时间。创建可用和可重用的脚本非常有意义。能够使主脚本变短,结构更加清晰。
定义函数
在脚本中使用函数
在函数文件里使用函数
函数举例
定义函数(全部函数在使用前必须定义)
定义函数的格式为:
- [function] 函数名(){
- 命令1
- ...
- }
在脚本中使用函数:
- #!/bin/bash
- function hello(){
- echo "hellow ting , nice to meet you !"
- }
- echo "today is `date`"
- hello
- echo "I'm glad to see you again ~_~!"
向函数中传递參数
想函数传递參数跟向脚本传递參数一样(使用位置变量參数 $1,$2,...)。函数取得所传參数后,将原始參数传回shell脚本。
函数离调用參数的转换下面划线開始。后加变量名,如 : _key。
从调用函数中返回
1、函数正常运行到函数末尾,然后返回脚本中调用函数的控制部分。
2、使用return返回
- return 从函数中返回,使用最后状态命令决定返回值
- return 0 无错误返回
- return 1 有错误返回
函数返回值測试:
- hello
- if [ $? =0 ] ; then
- 或者
- if hello ; then
在shell中使用函数
1、创建函数文件 (随意文件)
2、将函数文件加载shell (. 函数文件位置)(能够通过set查看全部加载当前shell的函数。unset删除shell函数)
3、运行shell函数 (函数名称 參数 ....)
如: 函数文件 funs.h
- #!/bin/bash
- function find_file(){
- tarName=$1;
- if [ -n tarName ]; then
- find ./ -name ${tarName}
- else
- echo "please input a file name ."
- fi
- }
将该文件加载shell : . funs.h
运行函数: find_file filename(随意字符串)
在脚本中调用函数
要在脚本中调用函数,必须先定义该函数(在调用之前)。
在脚本中调用函数文件里的函数:
1、首先创建函数文件
2、在脚本文件里加载函数文件(跟在shell中加载函数文件类似)
3、调用函数
如: call_fun.sh 和 funs.h 文件在同一个文件夹,其内容例如以下:
- #!/bin/bash
- . funs.h
- find_file $1
第二十章 向脚本传递參数
shift
getopts
shift
shift作用: 在向脚本传递參数时,shift 能够将每个參数向左偏移一位。
- #!/bin/bash
- while [ $# -ne 0 ] #while ther are still arguments
- do
- echo $1
- shift
- done
最后一个參数获取的方法:
- eval echo \$$# 或 shift 'expr $# -2'
通过验证在ubuntu12.04上 第二个命令应该为 : shift `expr $# - 1` 。 shift 后接偏移的数量然后用$1 就能够取得该值。 如 lastVar.sh :
- #!/bin/bash
- shift `expr $# - 1`
- echo $1
./lastVar.sh file name good , 输出结果为good
getopts
假设要控制诸如 command -l -c 23 -v file1 file2 时。shift命令就不够了。此时该用getopts命令。
getopts 格式: getopts varString variable
- #!/bin/bash
- ALL=false
- HELP=false
- FILE=false
- VERBOSE=false
- while getopts ahfv OPTION
- do
- case $OPTION in
- a) ALL=true; echo "ALL is $ALL";;
- h) HELP=true; echo "HELP is $HELP";;
- f) FILE=true; echo "FILE is $FILE";;
- v) VERBOSE=true; echo "VERBOSE is $VERBOSE";;
- esac
- done
假设參数中包括一个未指定的选项參数 。如 ./getopts_test.sh -p 则提示: ./getopts_test.sh: illegal option -- p
getopts指定变量必须取值:将冒号放在选项后面,如对上述代码 ahfv 改动为 ahfvt: ,那么t必须指定取值。
用法为 ./getopts -[a h f v] -[t value] XXX
第二十一章 创建屏幕输出
tput命令
使用转义序列和产生控制码
使用颜色
tput
使用tput前。须要先初始化: tput init
经常使用字符串:
- 名字 含义
- b e l 警铃
- b l i n k 闪烁模式
- b o ld 粗体
- c i v i s 隐藏光标
- c l e a r 清屏
- c n o r m 不隐藏光标
- c u p 移动光标到屏幕位置(x,y)
- e l 清除到行尾
- e l l 清除到行首
- s m s o 启动突出模式
- r m s o 停止突出模式
- s m u l 開始下划线模式
- r m u l 结束下划线模式
- s c 保存当前光标位置
- rc 恢复光标到最后保存位置
- s g r 0 正常屏幕
- r e v 逆转视图
经常使用数字:
- 名字 含义
- c o l s 列数目
- i t t a b设置宽度
- l i n e s 屏幕行数
bool操作符
- 名字 含义
- c h t s 光标不可见
- h s 具有状态行
通过发送命令打开和关闭光标(Linux/BSD):
- echo -e "\033[?
- 25h" 和 echo -e "\033[?25l"
System V :
- echo "\033[?25h" 和 echo "\033[?25l"
发送命令清屏,而且将光标移动到左上角(Linux/BSD):
- echo -e "\033[2J"
使用颜色:
产生颜色格式 : escape [ background_color;foreground_color m
linux/bsd : echo -e "\033[40;33m" (黑色背景,黄色字体)
第二十二章 创建屏幕输入
差点儿都是实例操作代码,略过。
第二十三章 调试脚本
一般错误
set命令介绍
一般错误
1、循环错误
2、漏泄引號
3、測试错误 [ condition ] , condition 两边都有空格。
4、字符大写和小写
5、for循环 注意$符号
6、echo , 不要在echo命令后直接加最后状态命令,此时值永远为真
set命令 (-打开选项, +关闭选项)
set [-n (读命令但不运行) | -v(显示读取的全部行) | -x(显示全部的命令及其參数)]
第二十四章 shell 嵌入命令
shell 嵌入命令在 bourne shell 里面创建而不是存在于 /bin 或 /usr/bin文件夹里。同样的命令 。嵌入命令要比系统命令要快。
标准的bourne shell 嵌入命令列表
- : 空,永远返回为t r u e
- . 从当前shell中运行操作
- break 退出for、while、until或case语句
- cd 改变到当前文件夹
- continue 运行循环的下一步
- echo 反馈信息到标准输出
- eval 读取參数,运行结果命令
- exec 运行命令,但不在当前shell
- exit 退出当前shell
- export 导出变量,使当前 shell 可利用它
- pwd 显示当前文件夹
- read 从标准输入读取一行文本
- readonly 使变量仅仅读
- return 退出函数并带有返回值
- set 控制各种參数到标准输出的显示
- shift 命令行參数向左偏移一个
- test 评估条件表达式
- times 显示 shell 运行过程的用户和系统时间
- trap 当捕获信号时运行指定命令
- ulimit 显示或设置 shell 资源
- umask 显示或设置缺省文件创建模式
- unset 从 shell 内存中删除变量或函数
- wait 等待直到子进程运行完成。报告终止
set在脚本内部给出执行參数(主要作用是用于測试脚本的时候避免每次都要输入參数):
- #!/bin/bash
- set ting er xy
- while [ $# != 0 ]
- do
- echo $1
- shift
- done
假设运行脚本时带了參数,那么后面的參数会被脚本内部的參数给覆盖掉。
times : times第一行给出shell消耗时间。第二行给出执行命令消耗时间
type: 查询命令是否仍驻留系统及命令类型。
- #!/bin/bash
- set cd good
- while [ $# != 0 ]
- do
- if type $1 > /dev/null 2>&1;then
- echo "command $1 is still in shell ."
- else
- echo "the command $1 not found ."
- fi
- shift
- done
用type 查询命令是否驻留在系统中,屏蔽type的输出,使用我们自己定义的输出。
ulimit:设置执行在shell上的显示限制
-a 显示当前的全部限制
-c 限制内核垃圾大小
-f 限制执行进程输出文件的大小
wait :等待子进程完毕。不带进程id会等待全部的子进程完毕。
Linux Unix shell 编程指南学习笔记(第四部分)的更多相关文章
- Linux Unix shell 编程指南学习笔记(第五部分)
第二十五章 深入讨论 << 当shell 看到 << 的时候,它知道下一个词是一个分界符.该分界符后面的内容都被当做输入,直到shell又看到该分界符(位于单独的一行).比方: ...
- Linux Unix shell 编程指南学习笔记(第三部分)
第十三章 登陆环境 登陆系统时.输入username和password后.假设验证通过.则进入登录环境. 登录过程 文件/etc/passwd $HOME.profile 定制$HOME.profi ...
- Linux Unix shell 编程指南学习笔记(第二部分)
第七章 正則表達式介绍 匹配行首与行尾 匹配数据集 职匹配字母和数字 句点 "." 匹配随意单字符. ^,在行首 匹配字符串或字符序列,如查询当前文件夹下的全部文件夹: ls - ...
- Linux 与 unix shell编程指南——学习笔记
第一章 文件安全与权限 文件访问方式:读,写,执行. 针对用户:文件属主,同组用户,其它用户. 文件权限位最前面的字符代表文件类型,常用的如 d 目录:l 符号链 ...
- Linux与Unix shell编程指南(完整高清版).pdf
找到一本很详细的Linux Shell脚本教程,其实里面不光讲了Shell脚本编程,还介绍了系统的各种命令 http://vdisk.weibo.com/s/yVBlEojGMQMpv 本书共分五部分 ...
- 摘自《Linux与unix shell编程指南》
shift运行后,$#随之减少:如果需要知道命令行中输入的最后一个参数(通常是一个文件名),可以有两种选择:使用命令 eval echo \$$#;使用shift命令:shift 'expr $# - ...
- Linux与unix shell编程指南
第14章 环境和shell变量 1.使用变量时,尽量用花括号将之括起来,防止shell误解变量值. 2.设置变量时的不同模式 variable-name=value 设置实际值到variable-na ...
- maven权威指南学习笔记(四)—— maven生命周期(lifecycle)
定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) -- 编译源码(compile) -- 编译测试源码(test-com ...
- maven生命周期(lifecycle)—— maven权威指南学习笔记(四)
定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) …… 编译源码(compile) …… 编译测试源码(test-com ...
随机推荐
- [oldboy-django][1初始django]web框架本质 + django框架 + ajax
web框架本质 浏览器(socket客户端) - 发送请求(ip和端口,url http://www.baidu.com:80/index/) - GET 请求头(数据请求行的url上: Http1. ...
- chrome浏览器无法安装非应用商店插件的解决办法
不久前,安装了一个非chrome应用商店的第三方应用,今天突然发现无法使用,打开chrome的扩展程序后,发现该插件以及被禁用,在网上查找了解决方法,设置“开发者模式”,修改了chrome的参数,仍然 ...
- 版本控制——hg教程
hg教程 引用来自官方网站的思维导图,来说明hg的使用规则:
- 密码 (pasuwado)
密码 (pasuwado) 题目描述 哪里有压迫,哪里就有反抗. moreD的宠物在法庭的帮助下终于反抗了.作为一只聪明的宠物,他打算把魔法使moreD的魔法书盗去,夺取moreD的魔法能力.但mor ...
- vue父组件向子组件传递数据
父组件 <template> <div id="app"> <v-header :childseller="fatherseller&quo ...
- Linux 命令行下使用多行输入
比较简单,建议实操,直接上图: 一行结束,直接敲回车换行.上一个例子,输入eof,终止多行输入:下一个例子,输入done,终止多行 ~~ 如果是参数太多,一行输入不完,可以通过 "空格\en ...
- pat 甲级 1066. Root of AVL Tree (25)
1066. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- 介绍一款可以滚动加载的插件droploader
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Atcoder CODE FESTIVAL 2017 qual C C - Inserting 'x' 回文串
题目链接 题意 给定字符串\(s\),可以在其中任意位置插入字符\(x\). 问能否得到一个回文串,若能,需插入多少个\(x\). 思路 首先统计出现次数为奇数的字符\(cnt\). \(cnt\ge ...
- 安卓全屏状态下键盘充满屏幕留不出ui控件的解决办法附edittext和键盘的属性
1.我们先看看常用和不常用的属性值(Edittext) android:inputType参数类型说明 android:inputType="none"--输入普通字符 andro ...