变量的分类:
本地变量:只对当前用户的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
其他查看环境变量的方法:printevn和evn;
变量的引用:
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 –v“root”意为查询不包含root的内容)
-n显示匹配行所在的行号
--color 将匹配字符高亮显示
ba
样式
/^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个用户zl1到zl10,但要求只有用户不存在的情况下才能进行添加。
分析:
||当命令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.151到192.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