shell script简单笔记
变量
shell script是一种脚本语言,变量的定义是通过
myName=HYB
这样的形式定义的。
当存在空格时,可以通过双引号或单引号将其变为字符串。双引号不进行转义,单引号将内容进行转义为一般字符。\
会进行转义。
执行命令
通过小括号$(command)
或者是`command`
可以执行指令,将执行结果返回。
?为上一个指令返回的值
命令
export
可以显示或增添变量,仅在当前会话中有效。
比如 export PATH=$PATH:/bin/bash
还可以将父进程中的自定义变量传递到子进程中。
export myName
echo
将变量进行输出
echo ${PATH}
unset
删除变量 unset myName
read
通过read可以接收键盘输入,如
read name
即可将键盘输入存入name变量中。
参数-t为限时,-p为提示文字。
declare
可以设置变量。declare [-aixr] variable 。-a为数组,-i为整形,-x为将其变为环境变量,-r将其设为不可改变。
test
可以对文件属性进行测试。
test -d file -a -w file 对file是否为目录并且具有w权限进行测试
控制符
删除
#为从前开始懒惰的匹配删除
##为从前开始贪婪的匹配删除
echo ${path##/*:}为只保留path的最后一个的删除操作
%为从后开始懒惰的匹配删除
%%为从后开始贪婪的匹配删除
echo ${path%%/*:}为只保留path的最后一个的删除操作
替换
${变量/旧字符串/新字符串}替换第一个匹配项
${变量//旧字符串/新字符串}替换所有匹配项
值的计算
${var-default}通过使用-可以设置变量默认值,变量var不存在时就会将default值赋予变量。
${var:-default}变量为空是也会设置默认值。
正则表达式
通配符
字符 | 含义 |
---|---|
[:alnum:] | 0-9, AZ, az |
[:alpha:] | A-Z, a-z |
[:blank:] | 空格及tab |
[:cntrl:] | 代表键盘上面的控制按键,亦即包括CR, LF, Tab, Del.. 等等 |
[:digit:] | 0-9 |
[:graph:] | 空格与tab外的其他所有按键 |
[:lower:] | a-z |
[:print:] | 所有能被打印的字符 |
[:punct:] | 标点符号 |
[:upper:] | A-Z |
[:space:] | 空白字符,包括空格键, [Tab], CR 等等 |
[:xdigit:] | 代表16 进位的数字类型,因此包括: 0-9, AF, af 的数字与字符 |
控制符
‘[char]’为char中的任意一个字符
‘[^char]’为不在char中的任意一个字符
^表示行首,$表示行尾
.为任意一个字符,*为重复0到无限次前一个字符
+为1个或以上前一个字符,?为0个或一个前一个字符
{a,b}为重复前一个字符的a到b次,()为组群
|为或符号
命令的执行
cmd;cmd可以按顺序从前到后执行命令
&&和||为逻辑运算符,遵循短路原则,对命令返回结果是否正确进行判断,也就是&&要两个都成功执行,||要最起码一个成功执行
管线
|为管线,前面的标准输出会作为下一个指令的标准输入。
减号
在管线中,可以用-代替在指令中代替stdin和stdout
管线命令
cut
从每行输出中切分出一部分
cut [-bn] [file]
cut [-c] [file]
cut [-df] [file]
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
echo ${PATH} | cut -d ':' -f 3,5 将PATH变量按:进行分割,取出来第3-5项
grep
从输出中提取部分行
grep [-acinv] [--color=auto] '搜寻字串' filename
选项与参数:
-a :将binary文件以text文件的方式搜寻资料
-c :计算找到'搜寻字串'的次数
-i :忽略大小写的不同
-n :输出行号
-v :反向选择,亦即显示出没有'搜寻字串' 内容的那一行!
last | grep 'root'
sort
排序,按照字典序排序
sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f :忽略大小写的差异,例如A 与a 视为编码相同;
-b :忽略最前面的空白字元部分;
-M :以月份的名字来排序,例如JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(预设是以文字型态来排序的);
-r :反向排序;
-u :就是uniq ,相同的资料中,仅出现一行代表;
-t :分隔符号,预设是用[tab] 键来分隔;
-k :以那个区间(field) 来进行排序的意思
cat /etc/passwd | sort -t ':' -k 3,3 以:切分,以第三列排序
uniq
输出仅显示一次uniq [-ic]
选项与参数:
-i :忽略大小写字元的不同;
-c :进行计数
wc
统计字数。wc [-lwm]
选项与参数:
-l :仅列出行;
-w :仅列出多少字(英文单字);
-m :多少字元;
tee
可以将stdout输出到文件中。tee [-a] file
选项与参数:
-a :以累加(append) 的方式,将资料加入file 当中
tr
将文本替换或删除。tr [-ds] SET1 ...
选项与参数:
-d :删除讯息当中的SET1 这个字串;
-s :取代掉重复的字元!
last|tr [a-z] [A-Z] 将小写替换成大写
last|tr -d :从输出中删除:
col
将输出按列切分,并将列间tab分隔符改为一个“ ”。
last||col -x
join
将两个文件以行为单位拼接到一起。join [-ti12] file1 file2
选项与参数:
-t 预设以空白字元分隔资料,并且比对『第一个栏位』的资料,
如果两个档案相同,则将两笔资料联成一行,且第一个栏位放在第一个!
-i :忽略大小写的差异;
-1 :这个是数字的1 ,代表『第一个档案要用那个栏位来分析』的意思;
-2 :代表『第二个档案要用那个栏位来分析』的意思。
paste
将两个文件的行直接拼合,以tab分割
paste test1 teatime2
expand
将tab键转换为空格键
split
split [-bl] file PREFIX
选项与参数:
-b :后面可接欲分割成的档案大小,可加单位,例如b, k, m 等;
-l :以行数来进行分割。
xargs
xargs [-0epn] command
选项与参数:
-0 :如果输入的stdin 含有特殊字符,例如`, , 空白键等等字元时,这个-0 参数
可以将它转义。
-e :这个是EOF (end of file) 的意思。后面可以接一个字符串,当xargs分析到这个字串时,
就会停止继续工作!
-p :在执行每个指令的argument时,都会询问使用者的意思;
-n :后面接次数,每次command指令执行时,要使用几个参数的意思
cut -d ':' -f 1 /etc/passwd | head -n 3 | xargs -p -n 1 id 将/etc/passwd中的:前的第一部分的前三行取出来,每次作为1个参数交由id指令处理
sed
sed [-nefr] [动作]
选项与参数:
-n :使用安静(silent)模式。在一般sed 的用法中,所有来自STDIN 的资料一般都会被列出到萤幕上。
但如果加上-n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在指令列模式上进行sed 的动作编辑;
-f :直接将sed 的动作写在一个档案内, -f filename 则可以执行filename 内的sed 动作;
-r :sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i :直接修改读取的档案内容,而不是由萤幕输出。
动作说明: [n1[,n2]]function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作
是需要在10 到20 行之间进行的,则『 10,20[动作行为] 』
function 有底下这些咚咚:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代n1,n2 之间的行!
d :删除,因为是删除啊,所以d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :列印,亦即将某个选择的资料印出。通常p 会与参数sed -n 一起运作~
s :取代,可以直接进行取代的工作哩!通常这个s 的动作可以搭配正规表示法!
例如1,20s/old/new/g
nl /etc/passwd | sed '2,5d' 打印出来passwd然后删除第2-5行
脚本的编写
参数的传递
$# 表示传入脚本参数的个数
$@ 表示传入参数的数组
$* 表示传入参数的字符串
$0 $1 $2 $3 分别代表执行的脚本/函数名,传入的第1,2,3个参数
shift 指令可以从前到后移走参数
脚本的运算
var=$((运算内容))
脚本的判断
[]可对脚本内的表达式进行判断
[]内的内容要使用空格进行分割,内容粘连会导致逻辑出错。
脚本的流程控制
判断语句
多个条件判断(if ... elif ... elif ... else)分多种不同情况执行
if [条件判断式一]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [条件判断式二]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi
分支语句
case $变量名称in <==关键字为case ,还有变量前有钱字号
"第一个变量内容" ) <==每个变量内容建议用双引号括起来,关键字则为小括号)
程序段
;; <==每个类别结尾使用两个连续的分号来处理!
"第二个变量内容" )
程序段
;;
* ) <==最后一个变量内容都会用*来代表所有其他值
不包含第一个变量内容与第二个变量内容的其他程序执行段
exit 1
;;
esac
循环
while [ condition ] <==中括号内的状态就是判断式
do <==do是循环的开始!
程序段落
done <==done是循环的结束
until [ condition ]
do
程序段落
done
for var in con1 con2 con3 .../for var in $(seq 1 100)
do
程序段
done
for ((初始值;限制值;执行步阶))
do
程序段
done
函数
function fname () {
程序段
}
执行与debug
sh [-nvx] scripts.sh
选项与参数:
-n :不要执行script,仅查询语法的问题;
-v :再执行sccript 前,先将scripts 的内容输出到萤幕上;
-x :将使用到的script 内容显示到萤幕上,这是很有用的参数!
执行方式的区别
使用sh或.直接执行时,系统会进入脚本子线程运行脚本
当使用source 指令执行脚本时,会直接在当前线程执行脚本
shell script简单笔记的更多相关文章
- bash shell学习-shell script基础 (笔记)
A chain no stronger than its weakest link. "一着不慎,满盘皆输" 参考资料:鸟哥的Linux私房菜 基础学习篇(第三版) Linux ...
- shell script 入门 笔记
shell script 入门 在 shell script 注意必须使用完全相同写在下面: 1. 指令的运行是从上而下.从左而右的分析与运行: 2. 指令的运行就如同第五章内提到的: 指令.选项 ...
- shell script 学习笔记-----shell变量
1.在赋值语句name=value中不能存在空格,例如:name = value这样的形式会被认为是三个变量,因为本质上来说,脚本的内容就是传给shell程序的变量,而变量之间是通过空格区分的.如果想 ...
- shell script 学习笔记-----if,for,while,case语句
1.if内的判断条件为逻辑运算: 2.if内的判断条件为目录是否存在,文件是否存在,下图先检验目录/home/monster是否存在,然后再检测/home/monster中的file.txt文件是否存 ...
- shell script 学习笔记-----命令执行
1.PATH变量:shell最主要的功能就是执行用户输入的命令,例如当用户输入一条“ls”命令之后,shell就要找到该命令对应的文件并执行.通常shell都会设置一个名叫PATH的环境变量,其中保存 ...
- shell script 学习笔记-----标准输出
1.将标准输出(stdout)和标准错误输出(stderr)分别重定向到两个不同的文件 其中符号'>'默认将标准输出重定向,意思和'1>'相同,‘2>'表示重定向标准错误输出,数字1 ...
- 菜鸟教程之学习Shell script笔记(中)
菜鸟教程Shell script学习笔记(中) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...
- 菜鸟教程之学习Shell script笔记(下)
菜鸟教程Shell script学习笔记(下) 以下内容是学习菜鸟教程之shell教程,所整理的笔记 菜鸟教程之shell教程:http://www.runoob.com/linux/linux-sh ...
- Shell Script Notes
shell Script学习笔记 <鸟哥的Linux私房菜 3rd Edition>: @1:若变量内容中包含空格字符,则可使用双引号"或单引号'将变量内容结合起来,但不同的是: ...
随机推荐
- mysql分批导出数据和分批导入数据库
mysql分批导出数据和分批导入数据库 由于某些原因,比如说测试环境有很多库,需要迁移到新的环境中,不需要导出系统库的数据.而数据库又有好多,如何才能将每个库导出到独立的文件中呢?导入到一个文件的话, ...
- js 页面 保持状态 的方法
A -> B 带参数进去B页面, 刷新B页面还 保持状态 单机下一页, 改变请求参数, A->B 不带参数进去B页面 (不存在)当前状态保存在cookies中, 刷新页面,判断cooki ...
- 这个 'ip' 竟然把我搞蒙圈了……
1.查看redis连接配置(某项目) <bean id="redisCacheServer" class="com.spring.cache.RedisCacheS ...
- PHP 字符串相关常识
0x00 前言 第一次遇见字符串这个概念是在学 C 语言的时候,那时候觉得字符串也没有什么难的,不就是一个以 \0 结尾的 char 数组而已咯.后来在学习 PHP 的过程中也同样保持这个观念,不过在 ...
- html br标签 语法
html br标签 语法 br标签什么意思? 作用:插入一个简单的换行符.广州大理石机械构件 说明:<br> 标签是空标签(意味着它没有结束标签,因此这是错误的:<br>< ...
- std::string 和 CString问题
std::string stdTemp; CString strTemp; strTemp = stdTemp; ;//这一步直接赋值可不可以 因为CString可以接受const char*的 ...
- Shell中Bash的基本功能(二)
1 历史命令 1)历史命令的查看[root@localhost ~]# history [选项] [历史命令保存文件]选项:-c: 清空历史命令-w: 把缓存中的历史命令写入历史命令保存文件.如果不手 ...
- 容器————map
序列容器是管理数据的宝贵工具,但对大多数应用程序而言,序列容器不提供方便的数据访问机制.一种典型的方法是通过名称来寻找地址.如果记录保存在序列容器中,就只能通过搜索得到这些数据.相比而言,map 容器 ...
- 如何下载如腾讯课堂等PC网页视频的方法
其实网上的教程有很多,实际也没那么复杂. 一.用插件法 方法是用插件,大多数主流的浏览器都是支持插件的,只要下载个插件应用市场的视频插件就可以搞定了. 当然,每个浏览器的视频插件品牌都是不一样的.这里 ...
- clr/c++自定线程安全集合
代码如下: 难点重写索引器.重写基类方法.基类方法显示调用示例 generic <class T> public ref class SyncList : public List<T ...