变量的分类:

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

声命方法:变量名(大写)=xxxxx”或者变量名=’XXXXX’

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

声明方法:export 变量名(大写)=XXXXX”或者’xxxxxx’

查看环境变量:

[root@localhost ~]# export

declare -x G_BROKEN_FILENAMES="1"

declare -x HISTCONTROL="ignoredups"

declare -x HISTSIZE="1000"

declare -x HOME="/root"

declare -x HOSTNAME="localhost"

declare -x LANG="zh_CN.UTF-8"

declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"

declare -x LOGNAME="root"

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

HISTSIZE:定义历史记录的条数;

HOME:当前用户的家目录;

SHELL:当前使用的shell

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

变量的引用:

Eg:

A=’/tmp/script’定义

Cd $A

Mkdir $A

Unset A变量释放

查看变量内容:

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

特殊变量$?

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

位置变量:

$1,$2,$3….

[root@localhost ~]# cat zl.sh 

#!/bin/bash

echo $1

echo $2

echo $3

[root@localhost ~]# 

[root@localhost ~]# ./zl.sh 123 456 789

123

456

789

算数运算:

Linux中默认所有的变量都是字符,所以要执行算术运算需要加[]$(())

Eg:

脚本内容:

[root@localhost ~]# ./zs.sh 3 5

8

[root@localhost ~]# cat zs.sh

#!/bin/bash

echo $[$1+$2]

[root@localhost ~]#

Alias别名的查看与创建:

[root@localhost ~]# alias

alias cp='cp -i'

alias l.='ls -d .* --color=auto'

alias ll='ls -l --color=auto'

alias ls='ls --color=auto'

alias mv='mv -i'

alias rm='rm -i'

alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

显示当前环境中的别名;

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

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

[root@localhost networking]# unset cdnet 撤销别名

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

相关配置文档目录:

全局相关

/etc/profile

/etc/profile.d/*

/etc/bashrc

局部相关

局部相关文档说明即每个可以设定自己的一套配置。

~/.bash_profile

~/.bashrc

文件说明:

Profile类文件作用设置某些登陆时就要运行的命令;设置环境变量

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

什么是当前shell和子shell

当前shell和子shell区别:在一个shell脚本调用另一个shell脚本时,这个被调用的shell脚本就称为子shell

Bashrc类文件:设置别名;

设置本地变量,和只对当前shell有效的命令。

Shell按照过程和应用次序可以分为:非交互式登录的shell和交互式登录的shell

非交互式登录的shell,启动系统时自动执行。

启动顺序为:~/.bashrc/etc/bashrc/etc/profile.d/*

交互式登录的shell,需要登录用户进入系统输入命令。

启动顺序为:/etc/profile/etc/profile.d/*~/.bash_profile/etc/bashrc

Eg:

通过修改配置文件实现用户登录进系统的时候,屏幕显示字符串“hell0,you are $user

分析:对于每个用户都有相同的设置,因此应该是全局变量/etc/profile

输入输出重定向

标准输入 standard input/dev/stdin0

标准输出standard output /dev/stdout1

错误输出standard error /dev/stderr2

[root@localhost dev]# ll std*

lrwxrwxrwx. 1 root root 156?.26 21:23 stderr -> /proc/self/fd/2

lrwxrwxrwx. 1 root root 156?.26 21:23 stdin -> /proc/self/fd/0

lrwxrwxrwx. 1 root root 156?.26 21:23 stdout -> /proc/self/fd/1

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

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

操作符:

覆盖追加

输入重定向:<<<

输出重定向:>>>

错误重定向:2>2>>

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

Eg:793ls > /tmp/ls.out

794lss >/tmp/ls.errout

795lss > /tmp/ls.errout

796lss 2> /tmp/ls.erroout

797ls &> /tmp/ignore.out

798lss $> /tmp/ignore.out

799lss &> /tmp/ignore.out

800cat /tmp/ignore.out 

801ls &>> /tmp/ignore.out 

802cat /tmp/ignore.out

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

[root@localhost ~]# lss >>/tmp/ignore.out 2>>/tmp/error.out

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

自定义输出重定向:

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

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

775exec 3> /tmp/zl.out

声明自定义重定向为/tmp/zl.out

776ls >& 3

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

777cat /tmp/zl.out 

778exec 3>&-输出给 -表明撤销

779history

管道

管道由分页符|实现,格式为:命令1|命令2|命令3,实现的作用是将命令1的执行结果送至命令2的参数,执行完成命令2后再将结果送至命令3处,供命令3使用。

注意:使用管道也可直接将文件导入输出流,即实现输出重定向。

Eg

[root@localhost ~]# echo "123456" |passwd zl --stdin

Changing password for user zl.

passwd: all authentication tokens updated successfully

通道分流的实现tee

命令1的执行结果同时给命令2和命令3

Tee将标准输出输出到屏幕上的同时,添加到文件中去;

785ls /etc/ | tee /tmp/ls.tout

786cat /tmp/ls.out

全局搜索正则表达式

[root@localhost ~]# grep 选项样式文件目录或者文本内容

-i不区分大小写

-v与默认动作相反(grep –vroot意为查询不包含root的内容)

-n显示匹配行所在的行号

--color 将匹配字符高亮显示

spacer.gifba

样式

/^love/ 匹配所有以love开头的行

/love$/ 匹配所有以love结尾的行

.匹配单个字符

1、显示/proc/meminfo 文件中以不区分大小的s开头的行

分析:s开头首先找到行首定位符^,然后是[sS]

grep--color –n ^[sS] /proc/meminfo

[root@localhost ~]# grep --color -n ^[sS] /proc/meminfo

5:SwapCached:0 kB

14:SwapTotal:1015800 kB

15:SwapFree:1015800 kB

20:Shmem:212 kB

21:Slab:70876 kB

22:SReclaimable:24244 kB

23:SUnreclaim:46632 kB

2、显示/etc/passwd中以nologin结尾的行;

分析行尾定位符号 $;nologin$

[root@localhost ~]# grep --color -n nologin$ /etc/passwd

2:bin:x:1:1:bin:/bin:/sbin/nologin

3:daemon:x:2:2:daemon:/sbin:/sbin/nologin

4:adm:x:3:4:adm:/var/adm:/sbin/nologin

5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

10:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

11:operator:x:11:0:operator:/root:/sbin/nologin

12:games:x:12:100:games:/usr/games:/sbin/nologin

13:gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

14:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

15:nobody:x:99:99:Nobody:/:/sbin/nologin

16:vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

17:saslauth:x:499:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin

18:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

19:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

3、显示/etc/inittab中以#开头,且后面跟一个或多个空白符,而后又跟了任意字符的行;

分析:要有行首定位符^,后跟元字符,需要加转义字符\

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

4、显示/etc/inittab中包含了:一个数字:的行;

[root@localhost ~]# grep --color \:[[:digit:]]\: /etc/inittab 

id:3:initdefault:

命令的链接

命令1&&命令2

当命令1成功执行时,才会继续执行命令2

命令1||命令2

当命令1执行失败,才会执行命令2

SHELL 练习

Cut 学习

Cut的工作就是剪,具体的说就是在文件中负责剪切数据用的。Cut是以每一行为一个处理对象的,这种机制和sed是一样的。

剪切依据:

[root@localhost ~]# date |cut -b 1-4

Fri 

[root@localhost ~]#

Ping命令:

Ping –c设置向目的IP的词数

-w设置超时等待时间

写一个脚本

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

2、使用循环读取文件/etc/passwd的第2,3,5,7,13,15行,并显示其内容;

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

[root@localhost ~]# cat b.sh 

#!/bin/bash

FILE=/etc/passwd

for I in 2 3 5 7 13 15

do

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

echo $a 

echo $a>>/tmp/mypassswd 2>&1

done

Cut命令主要是接受三个定位方法:

-b字节一个空格算一个字节,一个汉字算三个字节

-c (characters)字符

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

-f(fileds)num (定义截取第几段)

seq 作用用于产生从一个数到另外一个数的所有整数。

[root@localhost ~]# seq 1 25 

1

2

3

4

5

6

7

wc命令说明:

wc –c显示一个文件的字节数

wc –m显示一个文件的字符数

wc –l 显示一个文件的行数

wc –L 显示一个文件中最长行的长度

wc –w 显示一个文件的字数

写一个脚本

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

2、依次向/etc/passwd中的每个用户问好;

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

4、#!/bin/bash

5、#

6、let SUM=0

7、FILE='/etc/passwd'

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

9、for I in `seq 1 $LINE`;do

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

11、echo hello,$NAME

12、SUM=$[$SUM+1]

13、done

14、echo $SUM

写一个脚本

添加10个用户zl1zl10,但要求只有用户不存在的情况下才能进行添加。

分析:

||当命令1执行失败,才会执行命令2

[root@localhost ~]# cat a.sh 

#!/bin/bash

for i in`seq 1 10`

do

grep "zl$i" /etc/passwd >& /dev/null ||useradd zl$i

done

[root@localhost ~]#

写一个脚本

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

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

#!/bin/bash

For I in `seq 151 254`

do

ping 192.168.0.$I &>/tmp/zl && echo “192.168.0.$I is up.”||echo “192.168.0.$I is down”

done