linux中的变量

变量的分类:

本地变量:只对当前用户的shell有用

声明方法:变量名(大写)= “xxxxx” ’ xxxxx’

环境变量:对当前用户写的shell和子shell都有效

       声明方法:export 变量名(大写)= “xxxxx” ’ xxxxx’

查看环境变量:

[root@server55 tmp]# export

DISPLAY:定义是哪个主机,第几个屏幕显示

HISTSIZE:定义history中存取历史记录的条数

HOME:当前用户的家目录

PATH:执行外部命令(非当前shell自带的命令)就在PATH显示的路径中查找

USER:当前用户名

SHELL:当前使用的shell

       其他查看环境变量的方法:printevnevn

 

变量的引用:

eg

[root@server55 ~]#DIR=’/tmp/script’ 定义变量

[root@server55 ~]#cd $DIR         通过$对变量进行引用

[root@server55 ~]#mkdir $DIR     

[root@server55 ~]#unset DIR        释放变量

 

查看变量内容:

将字符输出到显示器使用echo命令

[root@server55 ~]# echo 字符信息

要查看变量中的字符,需要使用  $变量 

[root@server55 ~]# echo $变量   即将变量内字符输出

 

特殊变量:$?

$?中的值是上一条命令执行的结果(成功:0,失败1~255

[root@server55 ~]#cd

[root@server55 ~]# echo $?

0

[root@server55 ~]# cdd

-bash: cdd: command not found

[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.h 4 5

9

 

alias别名的查看与创建:

[root@server55 ~]#alias  直接输入alias显示当前环境中的别名

[root@server55 ~]# alias cdnet="cd /etc/sysconfig/networking" 给命令创建别名  

[root@server55 ~]# cdnet 输入别名后实现与输入命令相同的作用

[root@server55 networking]#  

[root@server55 ~]#unset cdnet 撤销别名

 

无论是直接定义的本地变量还是用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:

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

 

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

 

输入输出重定向

标准输入 standard input  /dev/stdin   0

标准输出 standard output  /dev/stdout 1

错误输出 standard error   /dev/stderr 2

以上三个文件均为链接文件。分别指向各自对应的标示符。

所谓重定向redirection:就是改变输入/输出的source来源/destination目地。例如本应输出在显示器终端上来的经过输出重定向,将内容输入某个文件;本应由键盘输入的字符信息,经过输入重定向改为由某个文件导入。

             覆盖     追加

输入重定向: <        <<

输出重定向: >        >>

错误重定向: 2>       2>>

 

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

 

eg:

[root@server55 ~]#ls > /tmp/ls.out  #将输出结果从监视器重定向到指定目录下的文档

[root@server55 ~]#lss 2> /tmp/lserr.out  #lss为错误命令,重定向错误提示信息到指定文件

[root@server55 ~]#ls &> /tmp/ignore.out

[root@server55 ~]#lss &> /tmp/ignore.out #不论命令正确与否输出结果都重定向到指定文件

 

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

 

注意:&>>是不存在的,若要实现类似的功能,则要遵循特定的指令格式:

[root@server55 ~]#ls >> /tmp/ignore.out 2>> /tmp/ignore.err

#即正确输出重定向到前文件,错误输出重定向到后文件

 

自定义输出重定向:

exec 3~9> 文件 #定义n为自定义的重定向文件

命令输出 >&3 #输出到自定义重定向文件中

自定义重定向输出符:>&

eg

[root@server55 ~]#exec 3> /tmp/ide.out #声明自定义重定向为/tmp/ide.out

[root@server55 ~]#ls >&3 #将输出结果送入自定义重定向文件

作用:在频繁使用重定向输出时,文件会频繁的进行打开关闭,自定义重定向后自定义文件一直处于打开状态,直到撤销。

[root@server55 ~]#exec 3>&-   #输出给 表明撤销

管道

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

 

eg:

[root@server55 ~]# echo "123456" | passwd hu --stdin

Changing password for user hu.

passwd: all authentication tokens updated successfully.

 

管道分流的实现 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文本中以一个数字开头并以一个与开头数字相同的数字结尾的行;

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

8、显示/etc/sysconfig/network-scripts/ifcfg-eth0文件中的包含了类似IP地址点分十进制数字格式的行;

 

1.[root@server55 tmp]# grep --color ^[sS] /proc/meminfo

SwapCached:          0 kB

SwapTotal:      522104 kB

SwapFree:       522104 kB

Slab:            34588 kB

 

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

 

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

 

4.[root@server55 tmp]# grep --color :[0-9]: /etc/inittab

[root@server55 tmp]# grep --color ":[[:digit:]]:" /etc/inittab

5. [root@server55 tmp]# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf

6. [root@server55 tmp]# grep --color "^\([[:digit:]]\).*\1$" /etc/inittab

7. [root@server55 tmp]# ifconfig | grep "inet add" | grep -v "127.0.0.1"| cut -d":" -f2 | cut -d" " -f1

8.[root@server55 tmp]#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

具体实例见最后的shell script

 

Shell Script练习

与今天shell script相关的命令:

 

文本截取命令cut

[root@server55 ~]# cut 选项 文档

-d 定义分隔符(由定义分隔符将文本分成若干的段)

-f num 定义截取第几段(-f1,2,3,5可同时截取多个段)

 

ping命令:

[root@server55 ~]# ping 选项 ip地址

-c 设置ping向目的ip的次数

-W设置超时等待时间

写一个脚本

创建用户test1~10,将密码设置为用户名。

 

 

#!/bin/bash

#

for I in `seq 1 10`;do

        useradd "test$I"

        echo "test$I" | passwd "test$I" --stdin

done

 

写一个脚本

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

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

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

#!/bin/bash

FILE='/etc/passwd'

for I in 2 4 6 13 15;do

        LINE=`head -$I $FILE | tail -1`

        echo "$LINE"

echo $LINE>>/tmp/mypasswd

done

 

使用自定义输出重定向:

#!/bin/bash

exec 3>> /tmp/passwd

FILE='/etc/passwd'

for I in 2 4 6 13 15;do

       LINE=`head -$I $FILE | tail -1`

       echo "$LINE"

echo $LINE >&3

done

exec 3>&-

 

写一个脚本:

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

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

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

#!/bin/bash

#

let SUM=0

FILE='/etc/passwd'

LINE=`wc -l $FILE | cut -d" " -f1`

for I in `seq 1 $LINE`;do

        NAME=`head -$I $FILE | tail -1 |cut -d: -f1`

        echo hello,$NAME

        SUM=$[$SUM+1]

done

echo $SUM

 

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

 

写一个脚本:

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

#!/bin/bash

for I in `seq 1 10`;do

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

done

 

写一个脚本:

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

         如果在线,就显示"ip is up."

         如果不在线,就显示"ip is down."

 

#!/bin/bash

 

for I in {151..254};do

        ping -c1 -W1  192.168.0.$I &> /dev/null  && echo "192.168.0.$I is up." || echo "192.168.0.$I is down."

done

 

                                                        

July 20th 23:57 2011