读《Linux Shell脚本攻略》Word文件下载.docx
- 文档编号:18763760
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:43
- 大小:45.93KB
读《Linux Shell脚本攻略》Word文件下载.docx
《读《Linux Shell脚本攻略》Word文件下载.docx》由会员分享,可在线阅读,更多相关《读《Linux Shell脚本攻略》Word文件下载.docx(43页珍藏版)》请在冰豆网上搜索。
42mGreenbackground\e[0m”
4.cat/proc/`pgrepjava`/environ|tr‘\0′‘\n’
tr‘\0′‘\n’重新格式化输出,将\0(null字符)替换成\n(换行)
5.bc
设定小数精度:
scale=2将小数位个数设置为2.
echo“scale=2;
3/8″|bc
.37
进制转换:
echo“obase=2;
100″|bc
1100100#十进制转换成二进制
echo“obase=10;
ibase=2;
1100100″|bc
100#二进制转换成十进制
计算平方以及平方根:
echo“sqrt(100)”|bc
10
echo“10^10″|bc
10000000000
6.stdin、stdout、stder、tee
0–stdin(标准输入)
1–stdout(标准输出)
2–stderr(标准错误)
$echoa1>
a1;
cpa1a2;
cpa2a3;
chmod000a1
$cat*|tee-aout.txt|cat-n
cat:
a1:
Permissiondenied
a1
$catout.txt
a1
tee命令接收到来自stdin的数据。
它将stdout的一份副本写入文件out.txt。
同时将另一份副本作为后续命令的stdin。
命令cat-n将从stdin中接收到的每一行数据前加上行号并写入stdout。
-a参数可以用于追加内容
可以使用stdin作为命令参数,只需要将-作为命令的文件名参数即可:
$echowhoisthis|tee-
whoisthis
7.自定义文件描述符
文件描述符是用于访问文件的一个抽象指针。
存取文件离不开被称为“文件描述符”的特殊数字。
0、1和2分别是stdin、stdout和stderr的预留描述符。
我们可以使用exec命令创建自定义的文件描述符。
3中模式:
只读模式;
截断模式;
追加模式
为读取文件创建一个文件描述符:
#touchinput.txt
#exec3<
input.txt
#使用文件描述符3打开并读取文件
#echoThisisatestline>
input.txt
input.txt
#cat<
&
3
Thisisatestline
如果要再次读取,我们就不能再继续使用文件描述符3了,而是需要用exec重新分配文件描述符3以便用于读取。
创建一个文件描述符用户写入(截断模式):
#exec4>
output.txt#打开文件用于写入
#echonewline>
4
#catoutput.txt
newline
创建一个文件描述符用于写入(追加模式):
#exec5>
>
#echoappendedline>
5
#catinput.txt
appendedline
8.数组和关联数组
bash同时支持普通数组和关联数组。
普通数组只能使用整数作为数组索引,而关联数组可以使用字符串作为数组索引。
关联数组是从bash4.0开始被引入。
定义关联数组
首先需要使用单独的声明语句将一个变量名声明为关联数组。
声明语句如下:
#declare-Aass_array
声明之后,可以用两种方法将元素添加到关联数组中。
1).利用内嵌索引值列表法,提供一个索引值列表:
#ass_array=([index1]=val1[index2]=val2)
2).使用独立的索引值进行赋值:
#ass_array[index1]=val1
#ass_array[index2]=val2
列出数组索引
每一个数组元素都有一个索引用于查找。
普通数组和关联数组具有不同的索引类型
9.获取终端信息
获取终端的行数和列数:
tputcols
tputlines
打印出当前终端名:
tputlongname
将光标移动到方位(100,100)处:
tputcup100100
设置终端背景色:
tputsetbno#no取值在0~7之间
将文本前景色设置为白色:
tputserfno#no取值在0~7之间
设置文本样式为粗体:
tputbold
删除当前光标位置到行尾的所有内容:
tputed
在输入密码的时候,不能让输入的内容显示出来,在下面的例子中,我们将看到如何使用stty来实现这个要求:
#Filename:
password.sh
echo-e“Enterpassword:
”
stty-echo
readpassword
sttyecho
echo
echo$password
echoPasswordread.
其中,选项-echo禁止将输出发送到终端,而选项echo则允许发送输出。
用tput和sleep从0开始计数到40:
#Filenamesleep.sh
echo-nCount:
tputsc
count=0;
whiletrue;
do
if[$count-lt40];
thenletcount++;
sleep1;
tputrc
echo-n$count;
elseexit0;
fi
done
在上面的例子中,变量count初始化为0,随后每循环一次便增加1。
echo语句打印出count的值。
我们用tput
sc储存光标位置。
在每次循环中,我们通过恢复之前储存的光标位置,在终端中打印出新的count值。
恢复光标位置的命令是tputrc。
tput
ed清除从当前光标位置到行尾之间的所有内容,使得旧的count值可以被清除并写入新值。
循环内的1s延时是通过sleep命令来实现的。
10.调试shell脚本
set-x:
在执行时显示参数和命令。
set+x:
禁止调试。
set-v:
当命令进行读取时显示输入。
set+v:
禁止打印输入。
11.Fork炸弹
:
(){
|:
&
};
:
是函数名,执行一个调用自己的递归并且pipe到自己,&
表示后台执行程序,最后的一个:
是在函数外调用和执行:
()这个函数的意思
12.read
参数可以组合使用
#read-n2var
读取2个字符并存入变量var
#echo$var
#read-svar
#用不回显的方式读取密码
#read-p“Enterinput:
”var
#显示提示信息
#read-t2var
#在2s内将输入的字符串存入到变量var
#read-d“:
#使用:
作为定界符结束输入行
13.字段分隔符和迭代器
内部字段分隔符(InternalFieldSeparator,IFS)
#catifs.sh
data=”name,sex,rollno,location”
oldIFS=$IFS
IFS=”,”
foritemin$data;
echoItem:
$item
IFS=$oldIFS
结果如下:
Item:
name
sex
rollno
location
IFS的默认值为空白符(换行符、制表符或者空格)。
当IFS被设置为逗号时,shell将逗号解释成一个定界符,因此变量$item在每次迭代中读取由逗号分隔的字串作为变量值。
如果没有把IFS设置成”,”,那么上面的脚本将会全部数据作为单个字符串打印出来。
14.Bash多种类型的循环
for循环
while循环
until循环
逻辑与运算符
||逻辑或运算符
15.算术比较
条件通常被放置在封闭的中括号内。
一定要注意在[]与操作数之间有一个空格。
-gt:
大于
-lt:
小于
-ge:
大于或等于
-le:
小于或等于
-eq:
等于
-ne:
不等于
可以结合-a逻辑与-o逻辑或条件进行测试
文件系统相关属性测试:
[-f$file_var]
如果给定的变量包含正常的文件路径或文件名,则返回真
[-x$var]
如果给定的变量包含的文件可执行,则返回真
[-d$var]
如果给定的变量包含的是目录,则返回真
[-e$var]
如果给定的变量包含的文件存在,则返回真
[-c$var]
如果给定的变量包含的是一个字符设备文件的路径,则返回真
[-b$var]
如果给定的变量包含的是一个块设备文件的路径,则返回真
[-w$var]
如果给定的变量包含的文件可写,则返回真
[-r$var]
如果给定的变量包含的文件可读,则返回真
[-L$var]
如果给定的变量包含的是一个符号链接,则返回真
字符串比较:
使用字符串比较是,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开他们。
[[$str1=$str2]]
当str1等于str2时,返回真。
str1和str2包含的文本是一模一样
[[$str1==$str2]]
这是检查字符串是否相等的另一种写法。
也可以检查两个字符串是否不同
[[$str1!
=$str2]]
如果str1和str2不相同,则返回真
[[$str1>
$str2]]
如果str1的字母序比str2大,则返回真
[[$str1<
如果str1的字母序比str2小,则返回真
[[-z$str1]]
如果str1包含的是空字符串,则返回真
[[-n$str1]]
如果str1包含的是非空字符串,则返回真
注意:
在=前后各有一个空格,如果忘记加空格,那就不是比较关系了,而变成了赋值语句
1.cat(concatenate)
#标准输入和输入文件的内容拼接在一起
echo‘Textthroughstdin’|cat–file.txt
压缩空白行
#将多个空行压缩成单个空格行,如下:
[root@server1~]#catmulti_blanks.txt
line1
line2
line3
line4
[root@server1~]#cat-smulti_blanks.txt
#用tr移除空白行
[root@server1~]#catmulti_blanks.txt|tr-s‘\n’
制表符显示为^|
单从视觉上很难将制表符同连续的空格区分开。
而在用Python之类的语言编写程序时,将将制表符和空格用于代码缩进,具有特殊含义,并进行区别对待。
因
此,若在应该使用空格的地方误用了制表符的话,就会产生缩进错误。
仅仅在文本编辑器中进行查看是很难发现这种错误的。
cat有这个特性,可以将制表符重点
标记出来。
该特性对排除缩进错误非常有用。
用cat命令的-T选项能够将制表符标记成^|。
例如:
[root@server1test]#catfile.py
deffunction();
var=5
next=6
third=7
[root@server1test]#cat-Tfile.py
^Ivar=5
^I^Inext=6
^Ithird=7
2.录制与回放终端会话
[root@server1test]#script-t2>
timing.log-aoutput.session
Scriptstarted,fileisoutput.session
[root@server1test]#ls
a1
a2
a3
file.py
ifs.sh
jd2.sh
jd.sh
multi_blanks.txt
output.session
setff=unix
timing.log
[root@server1test]#exit
exit
Scriptdone,fileisoutput.session
两个文件被当做script命令的参数。
其中一个文件timing.log用于存储时序信息,描述每一个命令在何时运行;
另一个文件
output.session用于存储命令输出。
-t选项用于将时序数据导入stderr。
2>
则用于将stderr重定向到
timing.log。
借助这两个文件:
timing.log(存储时序信息)和output.session(存储命令输入信息),我们可以按照下面的方法回放命令执行过程:
[root@server1test]#scriptreplaytiming.logoutput.session
#按播放命令序列输出
script命令同样可以用于建立可在多个用户直接进行广播的视频会话。
打开两个终端,Terminal1和Terminal2
1)在Terminal1中输入以下命令:
[root@server1test]#mkfifoscriptfifo
2)在Terminal2中输入以下命令:
[root@server1test]#catscriptfifo
3)在Terminal1中输入以下命令:
[root@server1test]#script-fscriptfifo
Scriptstarted,fileisscriptfifo
[root@server1test]#commands
Terminal1就成为了广播员,而Terminal2则成为了听众,不管你在Terminal1中输入什么内容,它都会在Terminal2或者使用了catscriptfifo命令的终端都会实时播放.
如果需要结束会话,输入exit并按回车键,退出
3.find
列出当前目录及子目录下所有的文件和文件夹
findbash_path-print
bash_path:
查找路径
-print:
使用’\n’作为定界符打印每一个匹配的文件名(路径)
-print0:
使用’\0′作为定界符打印每一个匹配的文件名(路径)
-name参数:
根据文件名或正则表达式匹配搜索,-iname:
忽略字母大小写
如果想匹配多个条件中的一个,可以采用or条件操作:
find.\(-name“*.txt”-o-iname“*.pdf”\)-print
-path:
参数可以使用通配符来匹配文件路径或文件。
-name总是用给定的文件名进行匹配,-path则将文件路径作为一个整体进行匹配。
-regex:
和-path类似,只不过-regex是基于正则表达式来匹配文件路径的。
正则表达式是通配符的高级形式。
如:
[a-z0-9]+@[a-z0-9]+.[a-z0-9]+(Email地址形式,+指明在它之前的字符类中的字符可以出现一次或多次)
-iregex:
忽略正则表达式的大小写
!
:
否定参数
-maxdepth:
最大深度
#find命令向下的最大深度限制为1(-maxdepth1)
-mindepth:
最小深度
-maxdepth和-mindepth应该作为find的第3个参数出现。
如果作为第4个或之后的参数,就可能会影响到find的效率,因为它不得不进
行一些不必要的检查。
例如,如果-maxdepth作为第4个参数,-type作为第三个参数,find首先会找出符合-type的所有文件,然后在所有
匹配的文件中再找出符合指定深度的那些。
但是如果反过来,目录深度作为第三个参数,-type作为第四个参数,那么find就能够在找到所有符合指定深度
的文件后,再检查这些文件的类型,这才是最有效的搜索顺序。
时间戳(timestamp)
-atime(访问时间):
用户最近一次访问文件的时间。
-mtime(修改时间):
文件内容最后一次被修改的时间。
-ctime(变化时间):
文件元数据(metadata,例如权限或所有权)最后一次改变的时间。
-atime、-mtime、-ctime可作为find的时间参数。
单位是天。
这些整数值通常还带有-或+;
-表示小于,+表示大于。
-amin(访问时间)、-mmin(修改时间)、-cmin(变化时间),单位分钟。
-newer:
指定一个用于比较时间戳的参考文件,然后找出比参数文件更长的修改时间的所有文件。
find命令的时间戳操作出来选项对编写系统备份和很有帮助。
基于文件大小的搜索
find.-typef-size+2k#大于2k的文件
find.-typef-size-2k#小于2k的文件
find.-typef-size2k
#等于2k的文件
除了k单位,还有其他文件大小单位b(块,512字节)、c(字节)、w(字,2字节)、k(千字节)、M(兆字节)、G(吉字节)
删除匹配的文件
-delete可以用来删除find查找到的匹配文件
删除当前目录下所有的.swp文件:
find.-typef-name“*.swp”-delete
基于文件权限和所有权的匹配
find.-typef-perm644-print
#打印当前目录下权限为644的文件
find.-typef-name“*.sh”-perm755-userroot-print
#找出.sh结尾用户名为root权限为755的文件
-exec
find命令可以借助选项-exec与其他命令进行结合。
find.-typef-userroot-name“*.swp”-execrm-rf{}\;
{}是一个特殊的字符串,与-exec选项结合使用。
对于每一个匹配的文件,{}会被替换成相应的文件名。
-exec能够同printf结合来生成有用的输出信息。
#find.-typef-name“*.swp”-execprintf“Textfile:
%s\n”{}\;
Textfile:
./1.swp
./2.swp
./3.swp
find跳过特定的目录
在搜索目录并执行某些操作的时候,有时为了提高性能。
需要跳过一些子目录。
例如,程序员会在git所管理的开发源码树中查找特定的文件,源代码层级结构总
是会在每个子目录中包含一个.git目录(.git存储每个目录相关的版本控制信息)。
因为与版本控制相关的目录对我们而言并没有什么用处,所以没必要去
搜索这些目录。
#find.\(-name“.git”-prune\)-o\(-typef-print\)
\(-name“.git”-prune\)的作用是用于进行排除,它指明了.git目录应该排除掉,而\(-typef-print\)指明了需要执行的动作。
这些动作需要被放置在第二个语句块中
4.xargs
可以处理stdin标准输入并将其转换成特定命令的命令行参数。
还可以将单行或多行文本输入转换成其他格式,例如单行变多行或是多行变单行。
将多行输入转换成单行输出
[root@server1test]#catexample.txt
123456
7
8910
1112
[root@server1test]#catexample.txt|xargs
123456789101112
将单行输入转换成多行输出
[root@server1test]#catexample.txt|xargs|xargs
-n2
12
34
56
78
910
-d选项为输入指定一个定制的定界符
#echo“splitXsplitXsplitXsplit”|xargs-dX
splitsplitsplitsplit
可以结合-n参数
#echo“splitXsplitXsplitXsplit”|x
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux Shell脚本攻略 读Linux Shell脚本攻略 Linux Shell 脚本 攻略