shell的特性之十

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell的特性之十相关的知识,希望对你有一定的参考价值。

shell的特性之十:输入输出重定向和管道
I/O:设备,寄存器
I/O port
Linux:一切皆文件
名称解析
文件描述符(句柄):file descriptor ,FD 是内核用来追踪现在文件的
INPUT:标准输入,stdin,0
OUTPUT:标准输出,stdout,1
ERRPUT:标准错误输出,stderr,2
I/O重定向:
<,<<:输入重定向
<:输入重定向
<<:此处创建文件,常用于在脚本中创建文件或生成菜单
<< EOF: EOF 此处生成文件,结束符;

,>>:输出重定向
:覆盖输出
>:追加输出
set -C:禁止覆盖重定向至已经存在的文件
? >|:在-C 特性下,强制使用覆盖重定向
set +C:关闭上述特性

/dev/null:bit bucket 位桶

2>,2>>:错误重定向    会输出正确信息,错误信息写入指定文件
    2>:覆盖
    2>>:追加
    2>&1:将错误结果转为正确结果

同时重定标准输出和错误输出
Command > /path/to/outfile 2> /path/to/errfile
Command &> /path/to/somefile
Command > /path/to/somefile 2>&1 &1:文件描述用&;标准输出为1;
管道:
Linux:使用目的单一的小程序,组合小程序完成复杂的任务
Command1 | Command2 | Command3
tee:分叉输出,命令不会处理,会送到下一个管道
~]# cat /etc/rc.d/rc.sysinit | tee /tmp/a.out | wc -l 即输出重定向给文件/tmp/a.out,又输出给wc -l

bash中的算术运算
declare
-i:×××变量
-x:环境变量,类似于export
let
let varName=算术表达式
varName=$[算术表达式]
varName=$((算术表达式))
varName=expr 变量1 + 变量2
变量:命名的内存空间
操作符:+,-,,/,%(余数)
除法运算有余数被省略(圆整)
两种相同运算方式:
? let totalWeight+=2
? totalWeight=$[$totalWeight+2]
+=,-=,
=,/=,%=
i++,i--,每次都+1

bash的单步执行
bash -x /path/to/script

位置参数br/>$0:脚本自身
$1:脚本的第一个参数
$2:脚本的第二个参数
....
${10}:
特殊变量
$#:显示所有位置参数的个数
$*,[email protected]:引用所有的位置参数
? $ 传递给脚本的所有参数,全部参数合为一个字符串
? [email protected] 传递给脚本的所有参数,每个参数为独立字符串
o [email protected] $
只在被双引号包起来的时候才会有差异
set -- 清空所有位置变量

交互式脚本
read -p 交互[X] read 命令的使用?
-t 5:延时5秒,等待用户输入信息;用户不输入则给变量默认值
给变量以默认值
varName=${varName:-value}
如果varName有值,则其值不变;否则,varName会使用value作为其值

文本处理工具之grep、egrep和fgrep
grep:(global search regular expression(RE)and print out the line)
文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,并显示匹配的行
格式:grep [options] ‘PATTERN‘ file,默认只支持基本正则表达式,要匹配额外功能的字符用-E
选项:
--color:指定颜色
-v:反向匹配,显示不能被模式匹配到的行
-o:仅匹配被模式匹配到的字串,而非整行
-e:-e KeyWord1 -e KeyWord2 表示或者关系
-w:匹配整个单词 表示字符边界;也可以用"<关键字>"
-i:不区分大小写,ignore-case
-E:支持扩展
-A #:还显示模式下面的一行
-B #:还显示模式上面的一行
-C #:前后各显示一行
正则表达式:是一类字符所书写出的模式(pattern)
元字符:类似统配符,不表示字符本身的意义,用于额外功能性的描述
基本正则表达式和扩展正则表达式
基本正则表达式的元字符:

字符匹配:   
    . :任意单个字符
    [ ]:指定范围内的任意单个字符
    [^]:指定范围外的任意单个字符
    [0-9],[[:digit:]]
    [a-z],[[:lower:]]
    [A-Z],[[:upper:]]
    [[:alpha:]]: 所有的字母
    [[:alnum:]]:字母+数字
    [[:space:]]:空格
    [[:punct:]]:标点符号

次数匹配:用来指定匹配其前面的字符的次数
    *:任意次

? xy xxy xy y 都能匹配
.
:匹配任意长度的任意字符
?:前面字符出现0次或者1次的
{m}:匹配m次
{m,n}:至少m次,至多n次
{m,}:至少m次
{0,n}:至多n次

    " ":做变量换算需要使用

    贪婪模式:尽可能的长的去匹配字符

位置锚定:用于指定字符出现的位置
    ^:锚定行首

? ^Char
$:锚定行尾
? grepchar$
^$:空白行
? ^[[:space:]]$
单词的位置锚定
<char:锚定词首,或者,char
char>:锚定词尾,char
分组
( )
? (ab)
xy
引用
1:后向引用,引用前面的第一个左括号以及与之对应的右括号中的模式匹配到的内容,意思是说前面出现一次,在1这也要出现一次一模一样的;
(a.b)xy1,a6bxya6b

练习 grep

grep egrep fgrep
egrep:使用扩展正则表达式来构建模式,相当于 grep -E
元字符:
字符匹配
.:任意单个字符
[ ]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
次数匹配
*:匹配器前面的字符任意次
?:匹配器前面的字符0或1次
+:匹配其前面字符至少一次
{m}:匹配其前面字符m次
{m,n}:至少m次,至多n次
{m, }:至少m次
{0,n}:只读n次
分组:
( ):分组
|:或者,ac|bc 表示 ac或者bc

fgrep:fast,不解析正则表达式

bash编程之条件判断
判定后续操作的前提条件是否满足
条件判断的常用判断类型
整数测试:
字符测试:
文件测试:

$?
? 0:正确
? 1-255:错误
布尔值:
? 真 假
逻辑运算:
与运算:
? 真 && 真 = 真(0)
? 真 && 假 = 假
? 假 && 真 = 假
? 假 && 假 = 假
或运算:
? 真 || 真 = 真(0)
? 真 || 假 = 真
? 假 || 真 = 真
? 假 || 假 = 假
非运算:
? !真 = 假
? !假 = 真

bash中如何做测试
test 表达式
? [ 测试表达式 ]
? [[ 测试表达式 ]]

bash中条件判断使用if
? 单分支:
if 条件; then
分支1;
fi
? 双分支:
if 条件; then
分支1;
else
分支2;
fi
? 多分支:
if 条件; then
分支1;
elif 条件2; then
分支2;
elif 条件3; then
分支3;
...
else
分支n;
fi
只要命令用作条件,就表示引用的是其状态结果(即执行成功与否),而非命令的输出结果,因此,不能使用命令替换符 Command 或 $(Command);当使用或用变量保存命令执行结果时,才可使用命令替换符。
bash编程之:整数测试
二元测试
num1 操作符 num2
-eq:等于
-ne:不等于

        -le:小于等于
        -ge:大于等于

        -lt:小于
        -gt:大于

bash知识点之脚本自动退出
exit n:n不为0,1,127,255


以上是关于shell的特性之十的主要内容,如果未能解决你的问题,请参考以下文章

Java中面向对象的三大特性之封装

C++11特性之std:call_once介绍

Linux之bash特性

shell的特性之十

Linux之bash shell特性

shell脚本之变量与状态码