Chinaunix首页 | 论坛 | 博客
  • 博客访问: 298573
  • 博文数量: 58
  • 博客积分: 2763
  • 博客等级: 少校
  • 技术积分: 731
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-04 19:07
文章分类

全部博文(58)

文章存档

2011年(55)

2009年(1)

2008年(2)

分类: LINUX

2011-07-21 18:46:55

1.变量的类型
1)本地变量(局部变量)
2)环境变量(全局变量)
   export,导出一个变量。例如:export a=3或者先输入a=3再输入 export a,两者效果是一样的。
   export可以让一个用户自定义的变量变为环境变量。直接输入export,可以查看系统设置的环境变量,其中有DISPLAY(定义显示桌面到什么地方),HISTSIZE(历史记录的条数),HOME(用户家目录),LOGNAME(登录名),PATH(命令路径),SHELL,USER等信息
3)特殊变量
   echo $?,如果上条命令执行成功,则返回0;如果不成功,则返回1-255中的随机一个
4)位置变量:直接向脚本传递参数,如$1,$2
2.算术运算:$[]或$(())
 例如:写一个脚本,内容为:echo "the sum is:$[$1+$2]"。它会接收你从键盘输入的数据,例如你输入:10 25,结果会显示:the sum is:35,这就是位置变量的作用。
3.在bash中你可以为你的命令设置别名,使用alias命令,可以让你的操作变得简单。
例如:alias ll='ls -l --color=auto'
如果要想取消定义的别名使用unalias 别名。
4.环境变量的配置文件又分为两种:一种是全局有效,另一种是局部有效。
全局有效的文件:/etc/profile,/etc/profile.d/*,/etc/bashrc
局部有效的文件:~/.bash_profile,~/.bashrc,~/.bash_logout
从上面我们可以看出大致分为两类:profile类和bashrc类。profile类主要是设置环境变量,运行用户登录时要执行的一些命令;bashrc类主要是设置别名,设置本地变量的。
shell分为两类:交互式登录式shell,非登录式shell(系统自动执行的),不同的shell,其读取文件的次序也不相同。
交互式登录的shell:读取次序:/etc/profile-->/etc/profile.d/*-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
非登录式shell:读取次序:~/.bashrc-->/etc/bashrc-->/etc/profile.d/*
修改过配置文件后,若想立即生效,则使用source或者.。例如:source /etc/profile
                                                         . /etc/profile
例如:让用户登录进来时,显示“hi,I konw you,you are...”
因为让所有用户都能看到,因此要设置全局有效地文件,修改/etc/profile,在最后输入echo -e "hi,I know you,you are $LOGNAME",然后用source让其生效就可以了。
 
5.输入输出重定向:
1)标准输入输出(默认输入输出)
标准输入:/dev/stdin,ll /dev,用0表示标准输入,keyboard,<
标准输出:/dev/stdout,1  ,monitor,>
错误输出:/dev/stderr,2  ,monitor,2>
&> :将正确,错误都重定向到一个文件中
例如:ls -al /tmp &>a.txt。也可以写为ls -al > /tmp 2>&1,也同样表明将正确错误结果都输入到/tmp中。但是写成ls -al > /tmp 2> /tmp,这是错误的写法。请谨记。
2)追加输出重定向:>>,刚才的>是覆盖重定向,会把之前的内容覆盖掉,而>>则表明不会覆盖原有内容,而是在原有基础上继续添加。
错误追加 :2>>
要想取消重定向的覆盖功能,则使用下列命令:
set -C  禁止使用覆盖重定向
set +C  或 >| 解除禁止使用覆盖重定向
  
6.1)管道:|  ,把前一个命令的结果,作为后一个命令的输入内容,command|command|command
例如:cat /etc/passwd |grep 'root'
我们之前有了解到passwd 命令中有一个参数--stdin,作用是将标准输入改为别的
例如:echo "123456"|passwd --stdin redhat,将redhat的密码改为123456
       
2)双向重定向命令tee
tee命令会同时将数据流送与文件与屏幕;而输出到屏幕的,其实就是stdout,可以让下个命令继续处理。一个输入流保存两分,一份保存到文件当中,一份送到屏幕上。
例如:ls -al /etc/passwd |tee /tmp/passwd.txt
7.自定义输出重定向
 保存到自己定义的方向
 例如:exec 3> /tmp/myout.out
       exec 3>> /tmp/myout.out
 例如:ls /var >&3  ,>与&3之间没有空格,有空的的话,就回出错,一定要牢记。
 撤销自定义输出重定向 exec 3>&-
 
 无底洞:/dev/null,将错误信息输入到此设备下,说明此文件将消失。
     例如:find /home -name .bashrc 2> /dev/null,屏幕上是会显示正确信息,而错误信息被丢弃了。
 
8.程序的执行流:包括顺序执行,选择分支,循环执行
循环执行:for格式如下:
 for 变量 in 列表;do          
  statement1
  statement2
  done
 如果我要创建10个用户user1,......,user10,利用for进行循环
  例如: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
 其中in的内容可以简写为seq 1 10,所以就可以改写为for I in `seq 1 10`;do
 另外还可以简写为{1..10},则 for I in {1..10};do
 
for列表中的形式:可以是简单列表,复杂列表,变量,通配符等。
例如:
简单列表:1 2 3 4
复杂列表:this is tom\'s cat
变量:`seq 1 $LINES`
命令:`ls /var`
通配符 for I in /var/*
例如显示/etc/passwd中的用户名,并且向所有用户问好,形如:Hello,root。并且统计用户数量,就可以使用上面命令的列表格式。但是必须声明一下,以换行符作为一行的结束,在linux中,默认会有多种结束符,因此,我们需要加以说明,用IFS=$'\n'来设定。
#!/bin/bash
IFS=$'\n'  只识别换行符
let SUM=0
for LINE in `cat /etc/passwd`;do
 user=echo $LINE |cut -d ":" -f1
  echo "Hello,$user"
 SUM=$[$SUM+1]
done
  echo "$SUM users."
 
9.文本处理类命令:cut,grep,egrep
1)cut 切割命令,把我们想要的部分切割下来
例如: cut -d ":" -f 1 /etc/passwd
       cut -d ':' -f1,7 /etc/passwd
       cut -d: -f5-7 /etc/passwd
这三种写法都是正确的。
 
2)grep  
grep,egrep,fgrep
刚才的cut是在一行信息当中取出某部分我们想要的,而grep则是分析一行的信息,要当中有我们想要的信息,就将该行拿出来,
grep [options] PATTERN(模式) file....
正则表达式(RE),元字符
例如:grep 'root' /etc/passwd
grep 
 -i 忽略大小写
 -v 反向显示
 -n 显示行号
 -An 显示后n行
 -Bn 显示前n行
 -Cn 显示前后n行
 --color=auto
 -E 支持扩展表达式
模式:正则表达式
正则表达式:基本正则表达式,扩展正则表达式
正则表达式中的元字符:^       行首定位符
                      $       行尾定位符
                      .       匹配单个字符
                      *       重复前一位0或多个
                      []      匹配指定范围内的任意单个字符
                      [^]     匹配不在指定组内的字符
                      \       用来转移元字符 
                      \<      词首定位符
                      \>      此为定位符
                      \(...\) 匹配稍后将要使用的标签
                      \{m\}   重复前一个字符m次 
                      \{m,\} 至少重复前一个字符m次
                      \{m,n\}至少重复前一个字符m次,且不超过n次
补充一下:[]这个元字符中的数字,字母,空格等,可以用一些特殊的符号表示:
[:alnum:]  代表英文大小写及数字
[:alpha:]  代表任何英文大小写
[:blank:]  代表空格键与[tab]键
[:cntrl:]  代表键盘上面的控制按键,如CR,LF,Tab,Del
[:digit:]  代表数字0-9
[:lower:]  代表小写字母
[:upper:]  代表大写字母
[:punct:]  代表标点符号
[:space:]  代表任何会产生空白的字符
扩展正则表达式中新增的元字符:+      匹配一个或多个加号前的字符
                                       ?       匹配0个或1个前导字符
                                       a|b      匹配a或b
                              ()   字符组
例如:1.显示/proc/meminfo文件中以不区分大小写的s开头的行,并显示其前两行,后3行。
        cat /proc/meminfo |grep -A3 -B2 '^[sS]'
      2.显示/etc/passwd中以nologin结尾的行
        cat /etc/passwd |grep 'nologin$'
      3.显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟任意字符的行。
        cat /etc/inittab |grep '^#[[:space:]]\{1,\}.'
        4.显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行。
        cat /etc/inittab |grep ':[0-9]:'
      5.ifconfig命令可以显示当前主机的IP地址相关信息等,用grep文件处理命令取出本机的各ip地址,要求不包括127.0.0.1.
        ifconfig |grep 'inet'|cut -d ":" -f2 |cut -d " " -f1|grep -v 127.0.0.1
10.短路操作符:
command1 && command2如果第一个命令执行成功,才执行第二个,如果第一个命令,就退出,不再执行第二个命令。
command1 || command2如果第一个命令不成功,才执行第二个命令,如果第一个成功了,就退出,不再执行第二个命令了
例如:写一个脚本,添加十个用户user1-user10,但要求只有用户不存在的情况下才能添加
#!/bin/bash
for I in {1..10};do
    grep 'user$I' /etc/passwd ||useradd user$I
    echo 'new user$I'
    cat /etc/passwd
done
在写一个脚本:例如:用ping命令去ping一下192.168.1.1-192.168.1.10,并判断是否在线,形如“192.168.1.1 is up,192.168.1.9 is down”,我们赶紧来写一下吧!
#!/bin/bash
for L in {1..10};do
    ping -c1 192.168.1.$L && echo -e "$L is up" || echo -e "$L is down"
done
OK,很简单吧!
 
 
 
 
阅读(1506) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~