Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115052
  • 博文数量: 42
  • 博客积分: 932
  • 博客等级: 准尉
  • 技术积分: 470
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-18 22:33
文章分类
文章存档

2011年(42)

分类: LINUX

2011-07-21 19:59:27

今天是第4天了,老师给休息的时间啊!不过最主要的任务还是让我们回来总结复习!由于这俩天系统有毛病在这儿抗争了俩天,终于胜利了!还是赶紧把昨天学到的东西总结下把!!
上一次说到了脚本的问题并且发了我写的第一个脚本的图,里面写的很麻烦!
 
这是修改后的,好的这次学的新东西就是从这里开始的,同样看这个脚本,如果让我么再写一个同样的不过我们换个目录例如说 /tmp/scripts2 怎么办呢?我们首先想到的方法就是将脚本里面的scripts都改为scripts2这样做当然可以!然而这是个小脚本就够麻烦了,如果大脚本不更难办了!所以这是后引入了变量的问题!昨天已经稍微说了下变量了,好的我们在这个脚本里声明一个变量是它的 = /tmp/scripts2
好的这是用变量改过的脚本,以后如果遇到都是创建不同目录的相同脚本我们只要改变量的值就可以了省力啊!呵呵。这里还有要说明的是 引号 "" '' 的问题,这里我用了单引号,这里是一个字符串并且没用空格可以不加引号,但是规范最好还是加上! 如果里面有其他变量的引用必须用双引号,没有的话用单引号或双引号都可以!还有一个变量我们使用完之后要释放它占用的空间这时候要用 uset 命令即可,当然脚本的变量在它执行完之后就自动释放了 !
这里是说明变量的使用能给我们带来极大的方便!那么LINUX里有哪些变量呢!又怎么用呢?
变量有4中类型
1、本地变量 只对当前SHELL有效对子SHELL无效
2、环境变量 对子SHELL同时有效
子SHELL就是在一个SHELL里面又打开的其他SHELL /bin/bash
环境变量的声明 必须使用 export 表示导出一个变量 作用就是使其对子SHELL也有效
LINUX里面内置里许多环境变量用于定义用户工作环境
利用不带任何选项的 export 能够看到系统内置的环境变量 export可以看到声明过程 declare 声明一个变俩用的
                   printenv 显示当系统全部或部分环境变量
                   env显示当前的环境变量 主要作用是使用某个特定命令式在特定环境下的变量
3、特殊变量 BASH里内置的变量用于调用BASH脚本编程环境一些特殊的执行结果
例如 $? 表述上一个命令是否执行成功 0表示执行成功 1-255表示错误 系统使用的1 2 127
4、位置变量 $1 $2 等能直接向脚本传递参数 10以后${}写
   算数运算 $[] $(())
 
如这是个计算俩个数的和差积商的脚本我们传个参数看看
 
 
这就是变量大致的类型了!
下面说几个
系统内置的环境变量
HISTSIZE 记录历史命令的大小 条数
PATH 用于记录命令搜索的路径
HOME 用于记录用户家目录
PS1 不是很清楚 是个宏 可以有当前变量中的值进行替换
重要功能BASH的命令别名:
alias cdnet='cd /etc/sysconfig/network-scripts'设置命令的别名方法
unalias cdnet 撤消别名
声明的别名仅对当前SHELL有效
昨天的博文里其实就有过别名出现了
要想使这些别名永久有效怎么办呢?这要将他们存放在特定的文件中如下:
 
全局配置文件放的位置:/etc/profile,/etc/profile.d/*,/etc/bashrc
局部配置文件放的位置:~/.bash_profile,~/.bashrc,~/.bash_logout
3类区分标准
profile类:
  设置环境变量
  运行用户登录要执行的一些命令
bashrc类:
  设置别名
  设置本地变量
shell两类
shell:交互式登录式shell以一个用户身份登录后能输入命令的,交互式登录的shell引用配置文件的次序:
/etc/profile-->/etc/profile.d/*-->~/.bashrc-->/etc/bashrc
非登录式shell:非登录式shell系统自动运行不需要用户登录且不用用户发送命令自动执行的shell
读取配置的过程:~/.bashrc-->/etc/bashrc-->/etc/profile.d/*
我们可以用source或. 来读取配置文件使其生效
下面做个课堂上的练习
让用户登录进来的时候,显示,Hi,I know you, you are 用户名.
这是在用户输入完用户名密码后登陆进来时要执行的命令所以存放在profile类里,不同的用户登陆进来后看到的是自己的名字这说明是全局的配置因此存放在 /etc/profile里面 因此我们只要在这个文件里添加一句话就好!
下面是演示的结果
 
接下来我们学习的是 输入/输出重定向还有管道
 
标准输入:/dev/stdin,0表示标准输入 设备的描述符 KEBYBOARD
标准输出:/dev/stdout,1,MONITOR
错误输出:/dec/stderr,2,MONITOR
输入重定向:<
输出重定向:>覆盖输出重定向 >>追加输出重定向 不覆盖原有内容
echo"  ">> /tmp/a.txt 向文件末追加一行
错误输出重定向:2>
cat查看文件内容将输入的内容输出出来
输出流 标准输出跟错误输出时俩个不同的输出流
&>合并错误输出跟标准输出的输出流
set -C 避免使用覆盖重定向 在此模式下想要用覆盖则使用 >|
set +C 关闭功能
set -/+ 表示打开/关闭一个功能
管道,连接多个命令 将前一个命令的输出结果当做下个命令的输入结果来使用
即将输出结果重定向给下个命令来处理
例如 echo "123456" | passwd --stin redhat 就将redhat的密码改为 123456
自定义输出重定向
exec 3> (>>) /tmp/myout.out 自定义覆盖(追加)输出重定向
ls /etc >&3
撤销自定义重定向 exec 3>&-
> /dev/null
&> /dev/null 重定向到这里就是丢弃没用的输出
这里就不演示了和以下的FOR循环一起在脚本里演示
LINUX里程序的执行流:顺序执行,选择分支(执行),循环执行
下面将主要说循环执行
脚本里面
循环关键字
for I in LIST; do
 statement1
 statement2
done
其中LIST是列表 列表又分以下几种:
简单列表 ,1 2 3 4
复杂列表,This is Tom`s cat
变量 `seq 1 $LINES`
命令 `ls /var`
通配符 for I in /var/*
例题
for I in 1 2 3 4 5 6 7 8 9 10; do
  useradd user$I
  echo user $I | passwd --stdin user$I
done
这个脚本的工作就是创建user1-user10并将其密码分别设置为user1-user10
由于我做过其他类似的脚本并没有删除这些用户 所以又做了其他脚本如下显示
注意不删家目录也是不能创建同名用户的 -r连同用户的家目录一起删除
 
好如果注意到的话 我上面做的另外一个usradd.sh里面用到了 grep这个命令 这就是我接下来学到的一个东西了!下面说下它是什么东东,学它的时候被老师折磨的不轻
grep家族 通过给定的模式找到匹配的行给予显示
grep [options] "PATTERN" file...
                模式 正则表达式(基本正则表达式,扩展正则表达式),元字符
      -i 不区分大小写
      -v 跟默认方式相反 显示没有匹配的行
      -n 显示匹配到的行在文中的行号
      -An 显示匹配的行及后n行
      -Bn 显示匹配的行及前n行
      -Cn 显示匹配的行及前后n行
      --color 高亮显示
 元字符 ^ 行首定位符
        $ 行尾定位符
        . 任意单个字符
        * 前一个字符出现0次 或者n次
        []
        [^]
        -E = egrep
这个看起来似乎是不多 不过用起来就好玩了!老师出了一堆难题让你来匹配,这要有很强的逻辑能力啊!这个还是多练练吧!这个及看下上面那个吧 !下面这些元字符的东东组合起来我还没整太明白类!一串一串的写出来后得看半天才知道什么是什么啊!还有egrep里面的元字符 扩展的,由于电脑的问题上课这个是用PPT讲的 抓的图没有了 下次去上课的时候我再把PPT复制下来再补上吧!
 
最后在发个作业是关于管道和重定向的
 
大家看到后面少了点儿东西 后面echo "192.168.0.$I is down"
至于为什么会这样 因为我用的是 nano的编辑器 有兴趣的同学可以试下按我这么写会出现什么结果挺郁闷的!其实就是后面只有2个字符的位置 ||要在另一行显示的话会出现俩个空格这样脚本就不会执行了!昨天试了好几次才发现...
&&  短路操作  command && command  前面执行成功执行后面的命令 前面执行失败则不执行后面的命令
||  短路操作  command || command  前面执行失败则执行后面的命令 前面执行成功则不执行后面的命令
在命令中起到判断的作用
 
这是这个脚本的部分执行结果 我再寝室用虚拟及做的虚拟网卡都禁用了竟然有UP出现...
最后再附加个关于for循环和重定向的脚本
 
这里面有自定义重定向 自定义重定向的好处是减小系统的开支!这里我有个不好的习惯就是没撤销变量,虽然说脚本执行完在脚本里定义的变量会自动释放,但是这是个不好的习惯,一定要改!
这里面有个特殊列表 /var/*
 
 
对里这里少总结了一个很重要的东西cut
cut
 -d 指定以什么分隔符将内容分段
 -f 取第几段 n,m  n-m
还有里面有很多命令的引用 最重要的是第2个脚本的第4行和第6行 第4行的意思是取/etc/passwd的每行以空格分段的第1段!绕啊!
第6行使最近常碰到的 是怎么取一个文件的第几行的 具体的做法就是取前几行然后再取最后一行,意思就是说例如取前5行的最后一行不就是第5行了么?!绕吧!然后通过管道将这个命令的结果给后面这个命令同样是将这个行以:分段取第一段 这综合说明了管道 for循环还有 cut 以及变量 命令的引用!
grep这个下次再详细总结吧
不知为何!一向勤奋的马哥今天上午没来!趁这个机会把grep 和 egrep 总结下吧!用下面的几个练习具体说明下吧!
 
1、显示/proc/meminfo文件中以不区分大小的s开头的行;
grep ^[Ss] /proc/meminfo
2、显示/etc/passwd中以nologin结尾的行;
grep nologin$ /etc/passwd
3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意字符的行;
grep "^#[[:space:]]\{1,\}" /etc/inittab
4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
grep :[0-9]: /etc/inittab
5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
"^[[:space:]]\{1,\}" /boot/grub/grub.conf
grep -E "^#[[:space:]]+" /etc/inittab
6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;
grep "^\([0-9]\).*\1$" /etc/inittab
7、ifconfig命令可以显示当前主机的IP地址相关的信息等,如果使用grep等文本处理命令取出本机的各IP地址,要求不包括127.0.0.1;
[root@server70 ~]# ifconfig | grep "inet addr" | cut -d: -f2 | cut -d" " -f1 | grep -v "127.0.0.1"
8、显示/etc/sysconfig/network-scripts/ifcfg-eth0文件中的包含了类似IP地址点分十进制数字格式的行;
grep "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" /etc/sysconfig/network-scripts/ifcfg-eth0
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-eth0
grep -E = egrep
由于博客插图相册容量有限就没法插图说明了!不过也因此学会了使用Xmanager Enterprise 3这个东东!好方便能将里面的命令直接复制到文本里 还不用来回的从虚拟机里切换!所以上面的命令都是从Xshell里面复制出来的,都经过了测试可行!上面的题是前天上课的练习题!上课做的很慢没跟上 正好趁这会儿又重新做了一遍!做完后感觉 egrep 扩展元字符里面最好用的就是匹配重复出现多个字符的时候比grep要方便许多!例如上面的第5题和第8题 明显可以感觉到出现次数匹配的时候egrep好用的多!!还有在使用grep这个命令的时候一定要严谨,分析透彻,这要求强大的逻辑分析 比如说写第6个的时候刚开始没写.*就错了!
上面有兴趣的同学可以自己再做做!下面总结下 grep和 egrep的元字符
grep支持的元字符:
^ 行首定位符
$ 行尾定位符
. 匹配单个字符
* 匹配0个或多个位于星号前的字符 注意这个包含0个(PS:这在写第3题和第5题的时候就曾经写成*虽然命令不报错但是结果是错的并且很难发现)
[] 匹配一组字符中的任何一个
[x-y] 匹配指定范围内的任一个字符
[^] 匹配不在指定字符组内的字符
\ 用来转义元字符 例如第8题里面 \. 就把.转义 直接引用为.
\< 词首定位符
\> 词尾定位符  这俩个刚刚才跟上面的行首和行尾区分开,就拿第2题来说吧!要求取nologin结尾的行
上面我们用的是$ 如果我们换成\> 可能就会出现其他的行 比如说我在里面加一行
user10:x:513:513::nologin/home/user10:/bin/bash
添加这个东西的格式不对 不过只是做个测试 !好了,接着上面的说 如果换成\> 它不仅会显示以nologin结尾的行还会显示我们新添加的行!这就是词尾和行尾的区别!
\(..\) 匹配稍后要使用的字符标签 例如第6题
下面还有一组就一起写了就是匹配次数相关的
x\{m\}或x\{m,\}或x\{m,n\}  x出现m次或至少出现m次或至少出现m次至多出现n次例如上面第5,8题的使用
以上就是grep支持的元字符了!
egrep这里仅说明新增的 其他的用法跟grep基本相同新增的有以下几个
+ 匹配一个或多个加号前的字符
?匹配零个或一个?前的字符
a|b 匹配a或b
() 匹配字符组
"love(able|ly)(ov)+"
例如这个我自己做了个test.txt文本测试里面的每行分别是
love
loveable
lovely
lovovovely
loveovov
lovelyovov
lo
lov
下面是测试的结果
[root@server70 ~]# grep -E "love(able|ly)(ov)+" ./test.txt
lovelyovov
终于把这个总结完了!
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
阅读(1272) | 评论(0) | 转发(0) |
0

上一篇:LINUX学习之路1

下一篇:LINUX学习之路4

给主人留下些什么吧!~~