shell脚本学习总结(不断更新中)
前言:自从大学毕业参加工作以来,接触的开发工作都是在服务端完成,于是接触了比较多的Linux当做开发机使用,或多或少有一些重复性的工作,于是开始琢磨学习一些shell脚本的知识,以便处理这些繁琐的事情。
shell种类有很多bash、sh、csh、ksh等,不同的环境下使用的也不同,不过bash应该是使用最广泛了~也是Linux发行版默认的;
主要就是掌握常见的命令以及语法格式吧~然后就可以上手干活了:
命令如下:
- echo:输出命令到终端
- -e:表示对转义字符进行替换
- -E:禁止转义
- read:从终端中读入命令
- readonly:将命令标记为只读命令
- unset:删除变量,但是不能删除readonly标记的变量
- printf:usage: printf format-string [arguments...] eg:printf "%s %s %s\n" a b c d e f g h i j
转义字符:
- \\:反斜杠
- \a:警报
- \b:退格
- \f:换页
- \n:换行
- \r:回车
- \t:tab键
- \v:垂直制表符
特殊变量:
- $0:当前脚本的文件名
- $n:表示传递给文件或者函数的参数,n是几就表示第几个参数
- $#:表示参数的个数
- $*:表示所有的参数
- $?:上个命令的退出状态或则函数的返回值
- $$:当前shell的进程ID
- $@:也是表示所有参数,和$*的区别就是:"$@"会显示所有的参数,每个一行,"$*"将所有的参数显示在一行
命令替换:`command`
DATE=`date`
echo "Date is $DATE"USERS=`who | wc -l`
echo "Logged in user are $USERS"UP=`date ; uptime`
echo "Uptime is $UP"
变量替换:
- ${var} 变量本来的值
- ${var:-word} 如果变量var为空或则Unset,那么返回word,但是不改变var的值
- ${var:=word}如果变量var为空或则unset,那么返回word,并将var的值设置为word
- ${var:?messgage}如果变量var为空或则unset,那么messgae将送到标准错误输出,脚本停止运行
- ${var:+word}如果变量var被定义,那么返回word,但不改变var的值
运算符:
- 算术运算符(expr):
- + 加法 `expr $a + $b`
- - 减法 `expr $a - $b`
- * 乘法 `expr $a \* $b`
- / 除法 `expr $b / $a`
- % 取余 `expr $b % $a`
- = 赋值 a=$b 把变量b的值赋给a
- == 相等,用于比较两个数字,相同则返回true [$a == $b]
- != 不相等。用于比较两个数字,不相同则返回true [$a != $b]
- eg:
#!/bin/sh
a=
b=
val=`expr $b % $a`
.echo "b % a : $val"
- 关系运算符
- -eq 检测两个数是否相等,相等则返回true
- -ne 检测两个数是否不相等,不相等则返回true
- -gt 检测左边的数是否大于右边的数,如果是,则返回true
- -lt 检测左边的数是否小于右边的数,如果是,则返回ture
- -ge 检测左边的数是否大于等于右边的数,如果是,则返回true
- -le 检测右边的数是否小于等于右边的数,如果是,则返回true
- eg:
#!/bin/sh a=
b=
if [ $a -eq $b ]
then
echo "$a -eq $b : a is equal to b"
else
echo "$a -eq $b: a is not equal to b"
fi
- 布尔运算符:
- ! 非运算 [!false] 返回true
- -o 或运算 [$a -lt 20 -o $b -gt 100]
- -a 与运算 [$a -lt 20 -a $b -gt 100]
- 字符串运算符:中括号两边要留个空隙
- = 检测两个字符串是否相等,相等则返回true [ $a = $b ]返回false
- != 检测两个字符串是否相等,不相等返回true [ $a != $b ]返回true
- -z 检测字符串长度是否为0, 为0返回ture [ -z $a ]
- -n 检测字符串长度是否不为0,不为0返回true [ -n $a ]
- str 检测字符串是否为空,不为空返回true [ $a ] 返回true
- 文件测试运算符:
- -b file 检测是否是块设备文件 [-b $file]
- -c file 检测是不是字符设备文件 [-c $file]
- -d file 检测是不是目录 [-d $file]
- -f file 检测是不是普通文件(既不是目录,也不是设备文件) [-f $file]
- -g file 检测是否设置了SGID位
- -k file 检测是否设置了(sticky bit)
- -p file 检测是否具有管道
- -u file 检测是否设置了SUID位
- -r file 检测是否可读
- -w file 检测是否可写
- -x file 检测是否可以执行
- -s file 检测是否为空文件(大小为0)
- -e file 检测文件是否存在
字符串操作:
- ${#string} $string的长度
- ${string:position} 在$string中,从位置$position开始提取子串
- ${string:position:length} 在$string中,从位置$position开始提取长度为$length的子串
- ${string#substring} 从变量$string的开头,删除最短匹配$substring的子串
- ${string##substring} 从变量$string的开头,删除最长匹配$substring的子串
- ${string%substring} 从变量$string的结尾,删除最短匹配$substring的子串
- ${string%%substring} 从变量$string的结尾,删除最长匹配$substring的子串
- ${string/substring/replacement} 在$string中用$replacement取代第一个匹配的$substring
- ${string//substring/replacement} 在$string中用$replacement取代全部匹配的$substrng
- ${string/#substring/replacement} 如果$string的前缀匹配$substring,那么用$replacement取代$substring
- ${string/%substring/replacement} 如果$string的后缀匹配$substring,那么用$replacement取代$substring
数组的操作:
定义数组:array_name=(value0 value1 value2 value3)数组的操作:
读取数组:${array_name[2]}
读取数组的元素的个数:${#array_name[@]}/${#array_name[*]}
返回数组的所有的下标:${!array_name[@]}/${!array_name[*]}
返回数组的所有的元素:${array_name[@]}/${!array_name[*]}
注意的事项:
- 变量的初始化中间不能有空格,eg: name="Spider"
- 变量的使用时候,最好以${name}这种形式,确认变量的边界;eg: echo 'I am ${name}-spiders'
- 注释只能用#号
- if..else使用:
- if then... fi 语句;
- if then... else ... fi 语句;
- if then... elif then... else ... fi 语句。
- case..switch
-
echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
) echo 'You select 1'
;;
) echo 'You select 2'
;;
) echo 'You select 3'
;;
) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
esac
-
- for循环:
-
for 变量 in 列表
do
command1
command2
...
commandN
done
-
- while循环:
-
while command
do
Statement(s) to be executed if command is true
done
-
- until循环:
-
until command
do
Statement(s) to be executed until command is false
done
-
- break and continue ,和其它语言不同的是,shell中的可以后加数字n,表示第几层循环
- 函数:
- 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数
function_name () {
list of commands
[ return value ]
}command > file 输出重定向到file
- command < file 输入重定向到file
- command >> file 输出以追加的方式重定向到file
- n > file 将文件描述符重定向到file
- n >> file 将文件描述符以追加的方式重定向到file
- n >& m 将输出文件m和n合并
- n <& m 将输入文件m和n合并
- << tag 将开始标记tag和结束标记tag之间的内容作为输入
- 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数
- 重定向,如果希望将 stdout 和 stderr 合并后重定向到 file,可以这样写:
- 重定向到/dev/null 文件,屏蔽输出结果
- 调试shell 脚本:在#! /bin/bash -x 就可以看到脚本执行的顺序
- 通配符
shell常见通配符:
字符 含义 实例 * 匹配 0 或多个字符 a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。 ? 匹配任意一个字符 a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。 [list] 匹配 list 中的任意单一字符 a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。 [!list] 匹配 除list 中的任意单一字符 a[!0-9]b a与b之间必须也只能有一个字符, 但不能是阿拉伯数字, 如axb, aab, a-b。 [c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b。 {string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串 a{abc,xyz,123}b a与b之间只能是abc或xyz或123这三个字符串之一。
shell脚本学习总结(不断更新中)的更多相关文章
- 笔记——shell脚本学习指南
<shell脚本学习指南>机械工业出版 ISBN 987-7-111-25504-8 第2章 2.4 初级陷阱 1.当今的系统,对#!这一行的长度限制从63到1024个字符都有,尽量不要超 ...
- Shell 脚本学习资料搜集
Shell文档 ChinaUnix上大神“網中人”总结的Shell十三问,强烈推荐,这本书讲得比较精炼,而且都是一些Shell学习中容易把握不住的一些细节难点.每一问都写得非常精彩.ChinaUnix ...
- 转 shell脚本学习指南
shell脚本学习指南 以下八点不敢说就能成为你shell脚本学习指南de全部,至少可以让你编写出可靠的shell脚本. 1. 指定bashshell 脚本的第一行,#!之后应该是什么?如果拿这个问题 ...
- Shell脚本学习 - 运算符
继续shell脚本学习.上一篇是基本数据类型和语法的总结,这一篇是运算相关的操作. 运算符 bash不支持简单的数学计算,需要依赖其他命令实现. expr可以代为实现. # 表达式一般这么写 ` + ...
- shell脚本学习总结02--数组
bash同时支持普通数组个关联数组,普通数组只能使用整数作为数组的索引,关联数组可以使用字符串作为数组的索引. 数组的定义方法: 在单行中使用一列值定义一个数组 [root@new ~]# array ...
- Shell脚本学习指南笔记
Shell脚本学习指南 作者:Danbo 2015-8-3 脚本编程语言与编译型语言的差异 许多中型.大型的程序都是用编译型语言写的,例如:C.C+.Java等.这类程序只要从源代码(Source C ...
- shell脚本学习之6小时搞定(1)
shell脚本学习之6小时搞定(1) 简介 Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把 ...
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
正则表达式_百度百科 http://baike.baidu.com/link?url=ybgDrN2WQQKN64_gu-diCqdeDqL8LQ-jiQ-ftzzPaNUa9CmgBRDNnyx50 ...
- shell脚本实现读取一个文件中的某一列,并进行循环处理
shell脚本实现读取一个文件中的某一列,并进行循环处理 1) for循环 #!bin/bash if [ ! -f "userlist.txt" ]; then echo &qu ...
随机推荐
- 《Clean Code》阅读笔记
Chapter 2 命名 命名要表现意图 避免歧义和误导,增强区分 命名可读性:便于发音,增强印象,便于交流 命名可查性:增强区分,便于搜索 类和对象的命名:名词或名词短语 方法的命名:动词或动词短 ...
- 从Scratch到Python:会动的小猫
大部分人提起儿童编程,就会想到Scratch,然而当儿童升入中学,学习什么语言比较合适呢?我认为,Python是未来的方向,为此我将会把一些经典的Scratch案例用Python重新实现,抛砖引玉,希 ...
- Vue小项目二手书商城:(四)详情页和购物车(emit、prop、computed)
实现效果: 点击对应商品,对应的商品详情页出现,详情页里面还有“Add to cart”按钮和“×”退出按钮. 点击“Add to cart”可以将商品加入购物车,每件商品只能添加一次,如果把购物车的 ...
- C语言的三目运算符
语法: 表达式1 ? 表达式2 : 表达式3; 等价于 if(表达式1) { 表达式2 } else { 表达式3 }
- shell脚本while read line的使用
#### 题目要求计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字.例如a.txt内容如下:12aa*lkjskdjalskdflkskdjflkjj我们脚本名字为 ...
- 《R语言入门与实践》第五章:对象改值
本章将了如何对一个数据对象中的数据进行改动,分为以下方法: 直接改值 条件取值然后改值 直接改值 单个改值:vec[1] <- 1000多个改值: vec[c(1,3,5)] <- 100 ...
- Windows Server 2008 R2 免费使用900天的方法
无需破解:Windows Server 2008 R2 免费使用900天的方法 1.安装后就有一个180天的试用期. 2.在180天试用期即将结束时,使用下面的评估序列号激活Server 2008 R ...
- Python自学:第三章 动手试一试 3-4、3-5
# -*- coding: GBK -*- liebiao = ["zhang", "li", "wang", "zhou&quo ...
- excel 批量上传图片
1.在excel中 输入公式 ="<table><img src=""D:\素材\"&A2&".jpeg&quo ...
- 多重if-else语句
C语言自学之多重if-else语句 Dome : 某游戏对不同等级的积分的玩家赋予不同的荣誉称号,其对应关系如下: 积分>=10000分为钻石玩家 积分>=5000并且<10000为 ...