变量的分类
本地变量: 只对本地有效,对子shell无效 // /bin/bash 打开子shell
环境变量: 对本地和子shell都有效
export A=3
或
A
export A
export //查看当前系统环境变量
## exprot部分显示结果 declare -x DISPLAYE=“” //指定输出显示器 declare -x HISTSIZE="1000" //history能保存的命令条数 declare -x HOME="/root" //当前用户家目录 declare -x HOSTNAME="server45.example.com" //当前主机名称 declare -x LANG="zh_CN.gbk" //所使用的语言 declare -x LOGNAME="root" //登录用户的名称 declare -x OLDPWD="/tmp" //上一个路径 declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin" declare -x PWD="/tmp/scripts" //当前路径
printenv //类似export
env //显示当前环境变量
特殊变量:$?
ehco $? //上一个命令是否执行成功 0代表成功 1-255失败
[root@server45 ~]# llsss -bash: llsss: command not found [root@server45 ~]# echo $? 127
位置参数变量: 需要用户通过命令引用,很有用的变量
$1,$2,$3 超过10时建议加{} ${11}
算数运算:
$[] //echo “$[$A+$B]”
$(( )) //echo "(($A+$B))"
#!/bin/bash # echo "$1+$2 is $[$1+$2]" echo "$1-$2 is $[$1-$2]" echo "$1*$2 is $[$1*$2]" echo "$1/$2 is $[$1/$2]"
写一个脚本,完成以下功能:
1、传递两个整数给脚本,让脚本分别计算并显示这两个整数的和、差、积、商。
[root@server45 ~]# echo "Your Salary : \$1" Your Salary : $1
BASH的命令别名
alias
例如将cls设置为lear方便使用
alias cls=clear
unlias cls
alias cdnet='cd /etc/sysconfig/network' //有空格用''
全局变量:/etc/profile, /etc/profild.d/*, /etc/bashrc 对所有用户都作用
/etc/bashrc //可设置alias对所有用户有效
/etc/profild.d/* //将profile分成片便于管理
/etc/profild //设置全局有效变量,永久有效
export DFSF=dfsf //需注销才生效
source /etc/profile //重读profile,可立刻生效,不建议
局部变量: ~/.bash_profile, ~/.bashrc ~/.bash_logout 只对当前用户有效
profile类:
1.设置环境变量
2.运行用户登录时要执行的一些命令
bashrc类
1.设置别名
2.设定本地变量
-------------------------------------------------------------------------------------------------
shell分类:
1.交互式登录式shell
用户登录进去输入命令
过程:
/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> /etc/bashrc
2.非登录式shell
脚本执行过程中,系统自动运行,不需要用户登录输入命令
过程:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/×
——————————————————————————————————————————————————
输入/输出重定向 ,管道 输出流
I/O重定向分为:
标准输入 :/dev/stdin, 0, KEYBOARD,< //平常可以不输入
标准输出 :/dev/stdout, 1, MONITOR, > //命令正常执行 cat > /tmp/ls1.out
错误输出 :/dev/stderr, 2, MONITOR, 2> //命令错误执行 cat 2> /tmp/ls2.out
//lessss &> /tmp/ls3.out //&> 合并>和2>
例如
ls /var >> /tmp/var.out 2>> /tmp/var.err //正确的信息存在var.out,错误的在var.err
其他的重定向
> //覆盖输出重定向
>> //追加输出重定向
set -C //开启避面覆盖重定向
set +C //关闭
>| //强制覆盖
自定义输出重定向
exec 3> /tmp/myout.out //实现多次重定向到一个文件,避免多次打开关闭一个文件,提升脚本执行效率
>> //追加
< //读入
ls /var >&3
exec 3>&- //关闭文件
写一个脚本:
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 exec 3>> /tmp/mypasswd //打开 for N in 2 4 6 10 13 15 ; do LINE=`head -$N $FILE | tail -1` echo $LINE echo $LINE >&1 done exec 3>&- //关闭 unset FILE LINE
————————————————————————————————————————————————————————————————————————
管道 | : 把第一个命令的输出送到第二个命令处理
echo "123456" | passwd --stdin rehat //这个命令将123456交给passwd来处理,--stdin参数会使123456立刻生效成为用户redhat的密码
ls /etc | tee /tmp/ls.out | less //tee可以把输出流保存到指定文件 并交给下一个命令处理
多个命令的输出都需要保存至同一个文件
command >> a.out
command >> a.out
/dev/null null 指空文件,任何被放到Null的数据都被删除,在linux里是一个常用的命令,可以轻松去除输出结果,不过要小心使用
比如: ls /var/ttt &> /dev/null //无论结果如何,都输出到null里,不会显示结果
——————————————————————————————————————————————————
程序执行流
分类:
顺序执行
选择分支
循环执行 //这一次只学习for循环
for I in LIST ; do //LIST是这个循环的条件,也叫做列表,可以是字符,数字,表达式
statement1
statement2
done
列表分类:
简单列表: 1 2 3 4
复杂列表: This is TOM`s cat
命令 : `ls /var`
通配符 : for I in /var/*
例如:
for LINE in `cat /etc/passwd`: dao
而外说明
IFS=$'\n' //for 循环只是别换行符
写一个脚本:添加10个用户user1-10
#!/bin/bash # for I in 1 2 3 4 5 6 7 8 9 10 ;do //或者for I in `seq 1 10` usradd user$I echo user$I | passwd --stdin user$I done ## seq 1 10 //代表 1~10 ## 也可以使用{1..10}
文本处理类命令cut -d: -d""
//指定分隔符:或"" -f //指定第几段
[root@server45 scripts]# tail -1 /etc/passwd | cut -d: -f6 /home/dean
grep与正则表达式
grep: 全面搜索正则表达式并打印出来
grep,egrep,fgrep
grep [options] "PATTERN“ file... //grep的用法
-i //不区分大小写
-v //显示没有匹配到模式的行
-n //显示匹配的行在原文中所处的行号
-An //显示后n行
-Bn //显示前n行
-Cn //上下文,显示上线n行
--color //把匹配的高亮显示
模式
正则表达式,元字符 re
^ //锚定行首 ^love love必须在行首
$ //锚定行尾
. //用于匹配任意单个字符
* //root* *前的t可以出现0次或任意次
?
[] //匹配一组字符中任意一个
\
\< //词首定位符
\> //词尾定位符
x\(m)\ //x精确出现m次
x\(m,)\ //x至少出现m次
x\(m,n) //x至少出现m次,最多m次
\(...)\ //任意长度的任意字符
grep -E = egrep
+ 相当于\{1,\}
? 相当于\{0,1}\
| 或
’love|hate‘ e或h谁出现都行
grep练习
1、显示/proc/meminfo文件中以不区分大小的s开头的行;
grep -i s /proc/meninfo //使用-i 不区分大小写 2、显示/etc/passwd中以nologin结尾的行; grep nologin$ /etc/passwd //$符号锚定结尾 3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意字符的行; grep --color ^#[[:sapce:]]\{1,}\ /etc/inittab //^符号锚定开头,[[:space:]].*用来匹配多个连续空白字符 4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行; grep :[0-9]: /etc/inittab 5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行; grep ^[[:space:]]\{1,\}.*" /boot/grub/grub.conf grep -E --color "^[[:space:]]{1,}.*" /boot/grub/grub.conf //egrep解法,注意与grep区别{} 6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行; grep "^\([0-9]\).*\1" /etc/inittab //使用\(\) \1 来做前后匹配 注意使用“” .*用以匹配任意个连续字符 7、ifconfig命令可以显示当前主机的IP地址相关的信息等,如果使用grep等文本处理命令取出本机的各IP地址,要求不包括127.0.0.1; ifcofig | grep "inet addr" | grep -v '127.0.0.1' | cut -d: -f2 | cut -d "" f1 //grep与cut的混合使用 8、显示/etc/sysconfig/network-scripts/ifcfg-eth0文件中的包含了类似IP地址点分十进制数字格式的行; grep -E "([0-9]{1,3}\.){3}\.[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-eth0
grep "[0-9]\{1,3\}\."\{3\}\.[0-9]\{1,3\} /etc/sysconfig/network-scripts/ifcfg-eth0 //注意egrep和grep的区别
————————————————————————————————————————————————————————————————————————
短路操作符
&& //与运算,当你需要判断使用两条命令是,使用&&: 如果第一个运行结果错误,那么继续运行第二个命令,结果为第二个命令,
如果第一个命令正确,那么将不会在运行第二个命令
1 && ? = ?
0 && ? = 0
|| //或运算,使用|| : 如果第一个命令结果错误,那么结果直接为第一个命令,
如果第一个命令结果正确,那么结果为第二个命令
1 || ? = 1
0 || ? = ?
## 结合/dev/null的使用,将会发挥很重要的效果
例如 cat /tmp/aaa >> /tmp bbb || cat /tmp/aaa &>/dev/null
##这个命令,如果aaa不存在的话,将会直接将结果输出到/dev/null下,而不会占用系统资源输出错误信息
写一个脚本:
1、添加10个用户user1到user10,但要求只有用户不存在的情况下才能添加;
#!/bin/bash # for I in {1..10} ; do grep user$I /etc/passwd &> /dev/null || useradd user$I //如果用户存在,直接输出到/dev/null,负责增加用户user$I done unset I
编程语言:
脚本语言:bash,perl(语言学家),python(灵活,简洁),ruby,php
以源程序的方式存在,执行前不需要编译,而是靠一个解释器执行
维护简便
执行效率差
编译型语言:
编辑-->编译-->链接-->运行
脚本:命令的堆砌
#!/bin/bash //第一行标准 shebang
#
nano myscript.sh
chmod +x myscript.sh
./myscript.sh //执行脚本