您的位置:首页 > 运维架构 > Linux

Linux的变量I/O重定向管道全局搜索正则表达式

2011-07-20 23:51 507 查看

linux中的变量

变量的分类:
本地变量:只对当前用户的shell有用
声明方法:变量名(大写)=“xxxxx”或’xxxxx’
环境变量:对当前用户写的shell和子shell都有效
声明方法:export变量名(大写)=“xxxxx”或’xxxxx’
查看环境变量:
[root@server55tmp]#export
DISPLAY:定义是哪个主机,第几个屏幕显示
HISTSIZE:定义history中存取历史记录的条数
HOME:当前用户的家目录
PATH:执行外部命令(非当前shell自带的命令)就在PATH显示的路径中查找
USER:当前用户名
SHELL:当前使用的shell
其他查看环境变量的方法:printevn和evn

变量的引用:
eg:
[root@server55~]#DIR=’/tmp/script’定义变量
[root@server55~]#cd$DIR通过$对变量进行引用
[root@server55~]#mkdir$DIR
[root@server55~]#unsetDIR释放变量

查看变量内容:
将字符输出到显示器使用echo命令
[root@server55~]#echo字符信息
要查看变量中的字符,需要使用$变量
[root@server55~]#echo$变量即将变量内字符输出

特殊变量:$?
$?中的值是上一条命令执行的结果(成功:0,失败1~255)
[root@server55~]#cd
[root@server55~]#echo$?
0
[root@server55~]#cdd
-bash:cdd:commandnotfound
[root@server55~]#echo$?
127

位置变量:$1,$2,$3…
作用:将从输入内容导入脚本
eg:
脚本:
#!/bin/bash
echo$1
echo$2
echo$3
执行脚本:
[root@server55~]#脚本名字符1字符2字符3
执行结果:
字符1字符2字符3

算术运算:
linux中默认所有变量都是字符,所以要执行算术运算需加[]或$(())。
eg:
脚本内容:
#!/bin/bash
echo$[$1+$2]
执行脚本:
[root@server55~]#/sum.h45
9

alias别名的查看与创建:
[root@server55~]#alias直接输入alias显示当前环境中的别名
[root@server55~]#aliascdnet="cd/etc/sysconfig/networking"给命令创建别名
[root@server55~]#cdnet输入别名后实现与输入命令相同的作用
[root@server55networking]#
[root@server55~]#unsetcdnet撤销别名

无论是直接定义的本地变量还是用export声明的环境变量,在重新登录或reboot之后都会消失。若想对其进行长久保存,需要在相关的配置文件中进行修改。

相关的配置文档目录:
全局相关:
/etc/profile
/etc/profile.d/*
/etc/bashrc
局部相关(即每个用户有可以设定自己的一套配置)
~/.bash_profile
~/.bashrc

profile类文件:设置环境变量;
设置某些登陆时就要运行的命令。
bashrc类文件:设置别名;
设置本地变量,和只对当前shell有效的命令。

shell按照过程和应用次序可以分为:非交互式登陆式的shell和交互式登陆式的shell
非交互式登陆式的shell,启动系统时自动执行。
启动顺序为:~/.bashrc→/etc/bashrc→/etc/profile.d/*
交互式登陆式的shell,修要登录用户进入系统输入命令。
启动顺序为:/etc/profile→/etc/profile.d/*→~/.bash_profile→/etc/bashrc

eg:
通过修改配置文件实现用户登录进系统时候,屏幕显示字符串“Hello,youareroot(当前用户的用户名)。”

由于是对于每个用户alluser都有相同的配置,所以应该是全局变量/etc/profile,通过编辑器在文本的最后一行加入“echo"hello,youare$USER."”即可。

输入输出重定向

标准输入standardinput/dev/stdin→0
标准输出standardoutput/dev/stdout→1
错误输出standarderror/dev/stderr→2
以上三个文件均为链接文件。分别指向各自对应的标示符。
所谓重定向redirection:就是改变输入/输出的source来源/destination目地。例如本应输出在显示器终端上来的经过输出重定向,将内容输入某个文件;本应由键盘输入的字符信息,经过输入重定向改为由某个文件导入。
覆盖追加
输入重定向:<<<
输出重定向:>>>
错误重定向:2>2>>

不论输出正确还是错误都进行重定向:&>

eg:
[root@server55~]#ls>/tmp/ls.out#将输出结果从监视器重定向到指定目录下的文档
[root@server55~]#lss2>/tmp/lserr.out#lss为错误命令,重定向错误提示信息到指定文件
[root@server55~]#ls&>/tmp/ignore.out
[root@server55~]#lss&>/tmp/ignore.out#不论命令正确与否输出结果都重定向到指定文件

>>:用法与>相同,>>为向目的文件中追加新信息,而>则是直接覆盖。

注意:&>>是不存在的,若要实现类似的功能,则要遵循特定的指令格式:
[root@server55~]#ls>>/tmp/ignore.out2>>/tmp/ignore.err
#即正确输出重定向到前文件,错误输出重定向到后文件

自定义输出重定向:
exec3~9>文件#定义n为自定义的重定向文件
命令输出>&3#输出到自定义重定向文件中
自定义重定向输出符:>&
eg:
[root@server55~]#exec3>/tmp/ide.out#声明自定义重定向为/tmp/ide.out
[root@server55~]#ls>&3#将输出结果送入自定义重定向文件
作用:在频繁使用重定向输出时,文件会频繁的进行打开关闭,自定义重定向后自定义文件一直处于打开状态,直到撤销。
[root@server55~]#exec3>&-#输出给–表明撤销

管道

管道由分页符|实现,格式为命令1|命令2|命令3,实现的作用为将命令1的执行结果送至命令2的参数,执行完成命令2后再将结果送至命令3处供命令3执行,即前一命令的输出作为后一命令的输入。使用管道也可直接向文件导入输出流,即实现输出重定向。

eg:
[root@server55~]#echo"123456"|passwdhu--stdin
Changingpasswordforuserhu.
passwd:allauthenticationtokensupdatedsuccessfully.

管道分流的实现tee
命令1的执行结果同时给命令2和命令3
[root@server55~]#ls/etc|tee/tmp/lss.out|less
注意:管道向文件导入输出流数据。
管道和输出重定向本质都是改变输出的方向。

全局搜索正则表达式

[root@server55~]#grep选项样式文件目录或文本内容
-i不区分大小写
-v与默认动作相反(grep–v“root”意为查询不包含root的内容)
-n显示匹配行所在的行号
--color将匹配字符高亮显示

样式




其中"\<""\>""\{,\}""\(\)\1"可理解成以转义字符\反斜杠开头的符号来记忆;"\(\)\1"括号内字符与普通字符匹配无区别,其只是将括号内容放入寄存器并进行编号,然后用\1(转义的1)进行调用。

练习:
1、显示/proc/meminfo文件中以不区分大小的s开头的行;
2、显示/etc/passwd中以nologin结尾的行;
3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意字符的行;
4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;

5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行
6、显示/etc/inittab文本中以一个数字开头并以一个与开头数字相同的数字结尾的行;

7、ifconfig命令可以显示当前主机的IP地址相关的信息等,如果使用grep等文件处理命令取出本机的各IP地址,要求不包括127.0.0.1;

8、显示/etc/sysconfig/network-scripts/ifcfg-eth0文件中的包含了类似IP地址点分十进制数字格式的行;
1.[root@server55tmp]#grep--color^[sS]/proc/meminfo
SwapCached:0kB
SwapTotal:522104kB
SwapFree:522104kB
Slab:34588kB

2.[root@server55tmp]#grep--color"nologin$"/etc/passwd

3.[root@server55tmp]#grep--color^\#""*.*/etc/inittab

4.[root@server55tmp]#grep--color:[0-9]:/etc/inittab
[root@server55tmp]#grep--color":[[:digit:]]:"/etc/inittab

5.[root@server55tmp]#grep"^[[:space:]]\{1,\}"/boot/grub/grub.conf
6.[root@server55tmp]#grep--color"^\([[:digit:]]\).*\1$"/etc/inittab
7.[root@server55tmp]#ifconfig|grep"inetadd"|grep-v"127.0.0.1"|cut-d":"-f2|cut-d""-f1
8.[root@server55tmp]#grep--color"[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}"/etc/sysconfig/network-scripts/ifcfg-eth0

命令的连接

命令1&&命令2
当命令1成功执行,才会继续执行命令2;
命令1||命令2
当命令1执行失败,才会执行命令2;
具体实例见最后的shellscript。

ShellScript练习

与今天shellscript相关的命令:

文本截取命令cut:
[root@server55~]#cut选项文档
-d定义分隔符(由定义分隔符将文本分成若干的段)
-fnum定义截取第几段(-f1,2,3,5可同时截取多个段)

ping命令:
[root@server55~]#ping选项ip地址
-c设置ping向目的ip的次数
-W设置超时等待时间
写一个脚本
创建用户test1~10,将密码设置为用户名。

#!/bin/bash
#
forIin`seq110`;do
useradd"test$I"
echo"test$I"|passwd"test$I"--stdin
done

写一个脚本

1、设定变量FILE的值为/etc/passwd

2、使用循环读取文件/etc/passwd的第2,4,6,10,13,15行,并显示其内容;(提示:LINE=`head-2/etc/passwd|tail-1`可以取得第2行)

3、把这些行保存至/tmp/mypasswd文件中

#!/bin/bash
FILE='/etc/passwd'
forIin2461315;do
LINE=`head-$I$FILE|tail-1`
echo"$LINE"
echo$LINE>>/tmp/mypasswd
done

使用自定义输出重定向:
#!/bin/bash
exec3>>/tmp/passwd
FILE='/etc/passwd'
forIin2461315;do
LINE=`head-$I$FILE|tail-1`
echo"$LINE"
echo$LINE>&3
done
exec3>&-

写一个脚本:

1、设定变量FILE的值为/etc/passwd

2、依次向/etc/passwd中的每个用户问好,形如:(提示:LINES=`wc-l/etc/passwd|cut-d""-f1`)Hello,root.

3、统计一共有多少个用户

#!/bin/bash
#
letSUM=0
FILE='/etc/passwd'
LINE=`wc-l$FILE|cut-d""-f1`
forIin`seq1$LINE`;do
NAME=`head-$I$FILE|tail-1|cut-d:-f1`
echohello,$NAME
SUM=$[$SUM+1]
done
echo$SUM

注意:此时不用{1..$LINE}由于head命令对{}中内容不能读取

写一个脚本:

添加10个用户user1到user10,但要求只有用户不存在的情况下才能添加;

#!/bin/bash

forIin`seq110`;do

grep"user$I"/etc/passwd&>/dev/null||useradduser$I

done


写一个脚本:

通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线,

如果在线,就显示"ipisup."

如果不在线,就显示"ipisdown."


#!/bin/bash

forIin{151..254};do
ping-c1-W1192.168.0.$I&>/dev/null&&echo"192.168.0.$Iisup."||echo"192.168.0.$Iisdown."
done

July20th23:572011
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐