shell scripts
本文涉及的命令:test、[]、shift、if、case、for、while、until、function、sh。
- 撰写 shell script 的良好习惯
- 在每个 script 的文件头处记录好:
- script 的功能;
- script 的版本信息;
- script 的作者与联绚方式;
- script 的版权宣告方式;
- script 的 History (历叱纪录);
- script 内较特殊的指令,使用『绛对路径』的方式来下达;
- script 运作时需要的环境变量预先宣告与设定
- 变量替换(赋值)
- $variable 保存在variable中的值
- ${variable} 保存在variable中的值
- ${variable:-string} 如果variable的值非空,则值为variable,否则值为string
- ${variable:+string} 如果variable的值非空,则值为string,否则值为空
- ${variable:=string} 如果variable的值非空,则值为variable,否则值为string且variable的值设置为string
- ${variable:?string} 如果variable的值非空,则值为variable,否则显示string并退出
- ${变量名}字符-----------------使用大括号,给变量后面加一些特定的字符
- "basename $0" 显示程序名,去掉目录信息
- 变量在引用时不带引号,则空格和换行符会被删除,带引号则会保留。
- test------------------测试
- 关于某个档名的『文件类型』判断,如 test -e filename 表示存在否
- -e 该『档名』是否存在?(常用)
- -f 该『档名』是否存在且为档案(file)?(常用)
- -d 该『文件名』是否存在且为目录(directory)?(常用)
- -b 该『档名』是否存在且为一个 block device 装置?
- -c 该『档名』是否存在且为一个 character device 装置?
- -S 该『档名』是否存在且为一个 Socket 档案?
- -p 该『档名』是否存在且为一个 FIFO (pipe) 档案?
- -L 该『档名』是否存在且为一个连结档?
- 关于档案的权限侦测,如 test -r filename 表示可读否 (但 root 权限常有例外)
- -r 侦测该档名是否存在且具有『可读』的权限?
- -w 侦测该档名是否存在且具有『可写』的权限?
- -x 侦测该档名是否存在且具有『可执行』的权限?
- -u 侦测该文件名是否存在且具有『SUID』的属性?
- g 侦测该文件名是否存在且具有『SGID』的属性?
- -k 侦测该文件名是否存在且具有『Sticky bit』的属性?
- -s 侦测该档名是否存在且为『非空白档案』?
- 两个档案之间的比较,如: test file1 -nt file2
- -nt (newer than)判断 file1 是否比 file2 新
- -ot (older than)判断 file1 是否比 file2 旧
- ef 判断 file1 与 file2 是否为同一档案,可用在判断 hard link 的判定上。主要意义在判定,两个档案是否均指向同一个 inode。
- 关于两个整数之间的判定,例如 test n1 -eq n2
- -eq 两数值相等 (equal)
- -ne 两数值不等 (not equal)
- -gt n1 大于 n2 (greater than)
- -lt n1 小于 n2 (less than)
- -ge n1 大于等于 n2 (greater than or equal)
- -le n1 小于等于 n2 (less than or equal)
- 判定字符串的数据
- test -z string 判定字符串是否为 0 ?若 string 为空字符串,则为 true
- test -n string 判定字符串是否非为 0 ?若 string 为空字符串,则为 false。注: -n 亦可省略
- test str1 = str2 判定 str1 是否等于 str2 ,若相等,则回传 true。
- test str1 != str2 判定 str1 是否不等于 str2 ,若相等,则回传 false
- 多重条件判定,例如: test -r filename -a -x filename
- -a (and)两状况同时成立!例如 test -r file -a -x file,则 file 同时具有r 与 x 权限时,才回传 true。
- -o (or)两状况任何一个成立!例如 test -r file -o -x file,则 file 具有r 或 x 权限时,就可回传 true。
- ! 反相状态,如 test ! -x file ,当 file 不具有 x 时,回传 true
- 关于某个档名的『文件类型』判断,如 test -e filename 表示存在否
- []------------和test的功能相同
- 1.在中括号 [] 内的每个组件都需要有空格键来分隔;
- 2.在中括号内的变数,最好都以双引号括号起来;
- 3.在中括号内的常数,最好都以单或双引号括号起来。
- script 的执行方式差异 (source, sh script, ./script)
- 1.利用直接执行的方式来执行 script,是子程序运行 (子程序中的变量无法在父程序中运行)
- 利用 source 来执行脚本:在父程序中执行。例:source sh02.sh
- Shell script 的默认变数($0, $1...)
- /path/to/scriptname opt1 opt2 opt3 opt4
- $0 $1 $2 $3 $4
- $# :代表后接的参数『个数』,以上表为例这里显示为『 4 』;
- $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
- $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隑字符,默认为空格键, 所以本例中代表『 "$1 $2 $3 $4" 』之意。
- /path/to/scriptname opt1 opt2 opt3 opt4
- shift:造成参数变量号码偏移
- shift 会移动变量,而且 shift 后面可以接数字,代表拿掉最前面的几个参数的意思。
- 例: echo "Total parameter number is ==> $#"
- 条件判断式-----------------------------if中的运算符必须在两个[]之间。
- 单层、简单条件判断式
- if .... then
- if [ 条件判断式 ];
- then 当条件判断式成立时,可以进行的指令工作内容;
- fi <==将 if 反过来写,就成为 fi 啦!结束 if 之意!
- && 代表 AND ;
- || 代表 or ;
- 例: read -p "Please input (Y/N): " yn
- if [ "$yn" == "Y" ] || [ "$yn" == "y" ];
- then echo "OK, continue"
- exit 0
- fi
- if [ "$yn" == "N" ] || [ "$yn" == "n" ];
- then echo "Oh, interrupt!"
- exit 0
- fi
- echo "I don't know what your choice is" && exit 0
- if [ "$yn" == "Y" ] || [ "$yn" == "y" ];
- if [ 条件判断式 ];
- if .... then
- 多重、复杂条件判断式
- 一个条件判断
- if [ 条件判断式 ];
- then 当条件判断式成立时,可以进行的指令工作内容;
- else 当条件判断式不成立时,可以进行的指令工作内容;
- fi
- if [ 条件判断式 ];
- 多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
- if [ 条件判断式一 ];
- then 当条件判断式一成立时,可以进行的指令工作内容;
- elif [ 条件判断式二 ];
- then 当条件判断式二成立时,可以进行的指令工作内容;
- else
- 当条件判断式一与二均不成立时,可以进行的指令工作内容;
- fi
- if [ 条件判断式一 ];
- 一个条件判断
- case ... in .... esac-----------------(实际案例)
- case $变量名称 in <==关键词为 case ,还有变数前有钱字号
- "第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号 )
- 程序段
- ;; <==每个类删结尾使用两个连续的分号来处理!
- "第二个变量内容")
- 程序段
- ;;
- *) <==最后一个变量内容都会用 * 来代表所有其他值
- 不包含第一个变量内容与第二个变量内容的其他程序执行段
- exit 1
- ;;
- "第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号 )
- esac <==最终的 case 结尾!
- case $变量名称 in <==关键词为 case ,还有变数前有钱字号
- function 功能------------函数
- function fname() --------fname为自定义名称
- {
- 程序段 ------程序内也可以使用变量($1...),在调用时直接函数名加变量数字
- }
- {
- function fname() --------fname为自定义名称
- while do done, until do done (不定循环)
- while [ condition ] <==中括号内的状态就是判断式
- do <==do 是循环的开始!
- 程序段落
- done <==done 是循环的结束
- do <==do 是循环的开始!
- until [ condition ]
- do
- 程序段落
- done
- do
- while [ condition ] <==中括号内的状态就是判断式
- for...do...done (固定循环) ---------------已知要循环几次
- for var in con1 con2 con3 ...
- do
- 程序段
- done
- do
- for var in con1 con2 con3 ...
- for (( 初始值; 限制值; 执行步阶 )) -------------数值的处理
- do
- 程序段
- done
- do
- 单层、简单条件判断式
- shell script 的追踪与 debug
- sh [-nvx] scripts.sh
- -n :不要执行 script,仅查询语法的问题;
- -v :再执行 sccript 前,先将 scripts 的内容输出刡屏幕上;
- -x :将使用刡的 script 内容显示刡屏幕上,这是很有用的参数!
- sh [-nvx] scripts.sh
============================================================================
() 和 {}的区别
这两个都是对一串命令的执行,但有些区别
1.()只是对一串命令重新开一个子进程进行执行
{}是在当前进程执行
2.()和{}内的命令都是以;隔开
()最后一个命令可以不用分号;
{}最后一个分号需要
3.()第一个命令不需要和括号间有空格
{}第一个命令和左边的括号间有空格
对于1:
$ var=10
$ (var=20;echo $var)
20
$ echo $var
10
说明()中执行的语句没有调用当前的变量,所以是在子进程中实现
$ var=30
$ { var=40;echo $var } #第一个要有空格哦
40
$ echo $var
40
说明var被修改了,是在同一个进程中实现
--------------------------------------------------------------------------------------------------------------------
2.POSIX标准的扩展计算:$((exp))
这种计算是符合C语言的运算符,也就是说只要符合C的运算符都可用在$((exp)),甚至是三目运算符。
注意:这种扩展计算是整数型的计算,不支持浮点型.若是逻辑判断,表达式exp为真则为1,假则为0。
$ echo $((3+2))
5
$ echo $((3>2))
1
$ echo $((25<3 ? 2:3))
3
$ echo $var
$ echo $((var=2+3))
5
$ echo $var
5
$ echo $((var++))
5
$ echo $var
6
-----------------------------------------------------------------------------------------------------------------------
shell scripts的更多相关文章
- 第十三章、学习 Shell Scripts
什么是 Shell scripts shell script (程序化脚本) :shell script 是针对 shell 所写的『脚本!』 shell script 是利用 shell 的功能所写 ...
- React native采坑路 Running 1 of 1 custom shell scripts
1. Running 1 of 1 custom shell scripts 卡住的问题. 分析: 四个文件没有下载完成. boost_1_63_0.tar.gz folly-2016.09.26.0 ...
- 鸟哥的 Linux 私房菜Shell Scripts篇(一)
参考: http://linux.vbird.org/linux_basic/0340bashshell-scripts.php#script_be http://www.runoob.com/lin ...
- 鸟哥的Linux私房菜——第十六章:学习Shell Scripts
视频链接:http://www.bilibili.com/video/av10565321/ 1. 什么是 Shell Script (shell写的脚本)1.1 干嘛学习 shell s ...
- 鸟哥的Linux私房菜-第10/11/12/13章(vim程序编辑器、学习bash、正则表达式与文件格式化处理、学习Shell Scripts)
第10章 vim程序编辑器 可以将vim看做vi的进阶版本,vim可以用颜色或底线等方式来显示出一些特殊的信息. 为何要学习vim?因为: a. 所有的 Unix Like 系统都会内建 vi 文书编 ...
- linux source命令与sh shell scripts的区别
source FileName 作用:在当前bash环境下读取并执行FileName中的命令. 注:该命令通常用命令“.”来替代. 如:source .bash_rc 与 . .bash_rc 是等效 ...
- Expect Command And How To Automate Shell Scripts Like Magic
In the previous post, we talked about writing practical shell scripts and we saw how it is easy to w ...
- 鸟哥的linux私房菜——第十二章学习(Shell Scripts)
第十二章 Shell Scripts 1.0).什么是shell scripts? script 是"脚本.剧本"的意思.整句话是说, shell script 是针对 shel ...
- 第十三章、学习 Shell Scripts 条件判断式
利用 if .... then 单层.简单条件判断式 if [ 条件判断式 ]; then 当条件判断式成立时,可以进行的命令工作内容: fi <==将 if 反过来写,就成为 fi !结束 i ...
随机推荐
- QPS/QPS/PV/UV/服务器数量/并发数/吐吞量/响应时间计算公式
QPS:每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力.QPS = req/sec = 请求数/秒QPS统计方式 [一般使用 http_load 进行统计]QP ...
- linux 常用的酷炫命令
1 命令行日常系快捷键 如下的快捷方式非常有用,能够极大的提升你的工作效率: CTRL + U -剪切光标前的内容 CTRL + K -剪切光标至行末的内容 CTRL + Y -粘贴 CTRL + E ...
- Maven项目
1,创建项目,类似于创建一个VS.net 项目的 解决方案. http://stackoverflow.com/questions/6328778/how-to-create-an-empty- ...
- osx 文本编辑工具下载地址Sublime Text 3
下载地址: http://www.sublimetext.com/3 Sublime Text 是一个代码编辑器(Sublime Text 3是收费软件,但可以无限期试用),也是HTML和散文先进的文 ...
- knockout 学习实例7 foreach
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- bzoj3745: [Coci2015]Norma
Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. 预处理每个位置的数作为最小/大值向左延伸的最大距离, ...
- 【Linux】浅谈段页式内存管理
让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址.如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存 ...
- python Requests库在处理response时的一些陷阱
python的Requests(http://docs.python-requests.org/en/latest/)库在处理http/https请求时还是比较方便的,应用也比较广泛.但其在处理res ...
- Sqlite: FOREIGN KEY constraint failed on remove的错误原因。
sqlite外键约束中.restrict约束:如果要删除父表,则子表需空. 如果没有定义约束.会报错,需设置一个约束.
- Fighting Game
感谢上外静中任淳同学提供 uses crt; label h; //h是重新开始游戏 const y1=18; y2=18; //p1,p2的纵坐标 var ...