linux中的变量
变量的分类:
本地变量:只对当前用户的shell有用
声明方法:变量名(大写)= “xxxxx” 或 ’ xxxxx’
环境变量:对当前用户写的shell和子shell都有效
声明方法:export 变量名(大写)= “xxxxx” 或 ’ xxxxx’
查看环境变量:
[root@www.linuxidc.com tmp]# export
DISPLAY:定义是哪个主机,第几个屏幕显示
HISTSIZE:定义history中存取历史记录的条数
HOME:当前用户的家目录
PATH:执行外部命令(非当前shell自带的命令)就在PATH显示的路径中查找
USER:当前用户名
SHELL:当前使用的shell
其他查看环境变量的方法:printevn和evn
变量的引用:
eg:
[root@www.linuxidc.com ~]#DIR=’/tmp/script’ 定义变量
[root@www.linuxidc.com ~]#cd $DIR 通过$对变量进行引用
[root@www.linuxidc.com ~]#mkdir $DIR
[root@www.linuxidc.com ~]#unset DIR 释放变量
查看变量内容:
将字符输出到显示器使用echo命令
[root@www.linuxidc.com ~]# echo 字符信息
要查看变量中的字符,需要使用 $变量
[root@www.linuxidc.com ~]# echo $变量 即将变量内字符输出
特殊变量:$?
$?中的值是上一条命令执行的结果(成功:0,失败1~255)
[root@www.linuxidc.com ~]#cd
[root@www.linuxidc.com ~]# echo $?
0
[root@www.linuxidc.com ~]# cdd
-bash: cdd: command not found
[root@www.linuxidc.com ~]# echo $?
127
位置变量:$1,$2,$3…
作用:将从输入内容导入脚本
eg:
脚本:
#!/bin/bash
echo $1
echo $2
echo $3
执行脚本:
[root@www.linuxidc.com ~]#脚本名 字符1 字符2 字符3
执行结果:
字符1 字符2 字符3
算术运算:
linux中默认所有变量都是字符,所以要执行算术运算需加[ ]或$(( ))。
eg:
脚本内容:
#!/bin/bash
echo $[$1+$2]
执行脚本:
[root@www.linuxidc.com ~]#/sum.h 4 5
9
alias别名的查看与创建:
[root@www.linuxidc.com ~]#alias 直接输入alias显示当前环境中的别名
[root@www.linuxidc.com ~]# alias cdnet=”cd /etc/sysconfig/networking” 给命令创建别名
[root@www.linuxidc.com ~]# cdnet 输入别名后实现与输入命令相同的作用
[root@www.linuxidc.com networking]#
[root@www.linuxidc.com ~]#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:
通过修改配置文件实现用户登录进系统时候,屏幕显示字符串“Hello,you 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@www.linuxidc.com ~]#ls > /tmp/ls.out #将输出结果从监视器重定向到指定目录下的文档
[root@www.linuxidc.com ~]#lss 2> /tmp/lserr.out #lss为错误命令,重定向错误提示信息到指定文件
[root@www.linuxidc.com ~]#ls &> /tmp/ignore.out
[root@www.linuxidc.com ~]#lss &> /tmp/ignore.out #不论命令正确与否输出结果都重定向到指定文件
>>:用法与>相同,>>为向目的文件中追加新信息,而>则是直接覆盖。
注意:&>>是不存在的,若要实现类似的功能,则要遵循特定的指令格式:
[root@www.linuxidc.com ~]#ls >> /tmp/ignore.out 2>> /tmp/ignore.err
#即正确输出重定向到前文件,错误输出重定向到后文件
自定义输出重定向:
exec 3~9> 文件 #定义n为自定义的重定向文件
命令输出 >&3 #输出到自定义重定向文件中
自定义重定向输出符:>&
eg:
[root@www.linuxidc.com ~]#exec 3> /tmp/ide.out #声明自定义重定向为/tmp/ide.out
[root@www.linuxidc.com ~]#ls >&3 #将输出结果送入自定义重定向文件
作用:在频繁使用重定向输出时,文件会频繁的进行打开关闭,自定义重定向后自定义文件一直处于打开状态,直到撤销。
[root@www.linuxidc.com ~]#exec 3>&- #输出给 – 表明撤销
管道
管道由分页符 | 实现,格式为 命令1|命令2|命令3,实现的作用为 将命令1的执行结果送至命令2的参数,执行完成命令2后再将结果送至命令3处供命令3执行,即前一命令的输出作为后一命令的输入。使用管道也可直接向文件导入输出流,即实现输出重定向。
eg:
[root@www.linuxidc.com ~]# echo “123456” | passwd hu –stdin
Changing password for user hu.
passwd: all authentication tokens updated successfully.
管道分流的实现 tee
命令1的执行结果同时给命令2和命令3
[root@www.linuxidc.com ~]# ls /etc |tee /tmp/lss.out |less
注意:管道向文件导入输出流数据。
管道和输出重定向本质都是改变输出的方向。
全局搜索正则表达式
[root@www.linuxidc.com ~]# grep 选项 样式 文件目录或文本内容
-i 不区分大小写
-v 与默认动作相反(grep –v “root” 意为查询不包含root的内容)
-n 显示匹配行所在的行号
–color 将匹配字符高亮显示
样式
650) this.width=650;” border=0>
其中“\<” “\>” “\{ , \}” “\( \) \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文本中以一个数字开头并以一个与开头数字相同的数字结尾的行;
7、ifconfig命令可以显示当前主机的IP地址相关的信息等,如果使用grep等文件处理命令取出本机的各IP地址,要求不包括127.0.0.1;
8、显示/etc/sysconfig/network-scripts/ifcfg-eth0文件中的包含了类似IP地址点分十进制数字格式的行;
1.[root@www.linuxidc.com tmp]# grep –color ^[sS] /proc/meminfo
SwapCached: 0 kB
SwapTotal: 522104 kB
SwapFree: 522104 kB
Slab: 34588 kB
2.[root@www.linuxidc.com tmp]# grep –color “nologin$” /etc/passwd
3.[root@www.linuxidc.com tmp]# grep –color ^\#” “*.* /etc/inittab
4.[root@www.linuxidc.com tmp]# grep –color :[0-9]: /etc/inittab
[root@www.linuxidc.com tmp]# grep –color “:[[:digit:]]:” /etc/inittab
5. [root@www.linuxidc.com tmp]# grep “^[[:space:]]\{1,\}” /boot/grub/grub.conf
6. [root@www.linuxidc.com tmp]# grep –color “^\([[:digit:]]\).*\1$” /etc/inittab
7. [root@www.linuxidc.com tmp]# ifconfig | grep “inet add” | grep -v “127.0.0.1”| cut -d”:” -f2 | cut -d” ” -f1
8.[root@www.linuxidc.com 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@www.linuxidc.com ~]# cut 选项 文档
-d 定义分隔符(由定义分隔符将文本分成若干的段)
-f num 定义截取第几段(-f1,2,3,5可同时截取多个段)
ping命令:
[root@www.linuxidc.com ~]# 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的第2,4,6,10,13,15行,并显示其内容;(提示: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个用户user1到user10,但要求只有用户不存在的情况下才能添加;
#!/bin/bash
for I in `seq 1 10`;do
grep “user$I” /etc/passwd &> /dev/null || useradd user$I
done
写一个脚本:
通过ping命令测试192.168.0.151到192.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