本文涉及的命令: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并退出
- ${变量名}字符-----------------使用大括号,给变量后面加一些特定的字符
- 关于某个档名的『文件类型』判断,如 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
- 1.在中括号 [] 内的每个组件都需要有空格键来分隔;
- 2.在中括号内的变数,最好都以双引号括号起来;
- 3.在中括号内的常数,最好都以单或双引号括号起来。
- 1.利用直接执行的方式来执行 script,是子程序运行 (子程序中的变量无法在父程序中运行)
- 利用 source 来执行脚本:在父程序中执行。例:source sh02.sh
- /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" 』之意。
- shift 会移动变量,而且 shift 后面可以接数字,代表拿掉最前面的几个参数的意思。
- 例: echo "Total parameter number is ==> $#"
- 单层、简单条件判断式
- 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
- sh [-nvx] scripts.sh
- -n :不要执行 script,仅查询语法的问题;
- -v :再执行 sccript 前,先将 scripts 的内容输出刡屏幕上;
- -x :将使用刡的 script 内容显示刡屏幕上,这是很有用的参数!
============================================================================
() 和 {}的区别
这两个都是对一串命令的执行,但有些区别
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 ...
随机推荐
-
使用Scala实现Java项目的单词计数:串行及Actor版本
其实我想找一门“具有Python的简洁写法和融合Java平台的优势, 同时又足够有挑战性和灵活性”的编程语言. Scala 就是一个不错的选择. Scala 有很多语言特性, 建议先掌握基础常用的: ...
-
linux命令:more
1.命令介绍: more用来逐页输出文件内容,空格键进入到下一页,b键返回到上一页. 2.命令格式: more [选项] 文件 3.命令参数 +n 从笫n行开始显示 -n 定义屏 ...
-
CSS3:不可思议的border属性&;Web字体图标Font Awesome
CSS3:不可思议的border属性 转载至——译文:不可思议的CSS border属性 原文:Magic of CSS border property Web字体图标Font Awesome 转载 ...
-
【转】从零开始编写自己的C#框架(7)——需求分析
转自:http://www.cnblogs.com/EmptyFS/p/3653934.html 本章内容虽然叫“需求分析”,实际上关于具体的需求分析操作步骤并没有深入去写,因为细化的话那将是一本厚厚 ...
-
03_MySQL中文乱码处理_01_MySQl数据库字符集知识
[MySql数据库常见字符集介绍] 在互联网环境中,使用MySql时常用的字符集有: [如何选择合适的字符集] 1.如果处理各种各样的文字,发布到不同语言的国家地区,应选Unicode字符集,对MyS ...
-
html5 API
1.Canvas绘图 2.postMessage跨域.多窗口传输 3.requestAnimationFrame动画 4.PageVisibility API页面可见性 5.File 本地文件操作 6 ...
-
ORA-02266: 表中的唯一/主键被启用的外键引用
http://www.cnblogs.com/cici-new/archive/2013/01/01/2841700.html 需要如下操作 先取消子表外键的外键约束,之后删除父表数据,最后再次启用外 ...
-
git图形化界面gitk里中文乱码解决
将git全局配置成utf-8格式即可,命令行里输入 git config --global gui.encoding utf-8
-
新装 Win7 系统装完驱动精灵,一打开到检测界面就卡死——原因与解决方案
1.现象: 重装系统后,鼠标反应慢,且不能上网.因此装了个驱动精灵,准备更新下驱动,但驱动精灵一打开到检测界面就卡死(换驱动人生.鲁大师也一样). 2.原因: Win7 系统 iso 中自带的驱动程序 ...
-
Hive中的Row_Number()使用
语法:row_number() over (partition by 字段a order by 计算项b desc ) rank --这里rank是别名 partition by:类似hive的建表, ...