egrep及bash编程之条件判断

REGEXP:REGular EXPression
grep: 根据模式搜索文本,并将符合模式的文本行显示出来。
Pattern: 模式,文本字符和正则表达式的元字符组合而成匹配条件
正则表达式:
Basic REGEXP:基本
Extended REGEXP:扩展
基本正则表达式:
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符

   [abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]
   字符集合:[:digit:]数字, [:lower:]小写字母, [:upper:]大写字母, [:punct:]标点符号, [:space:]空白字符, [:alpha:]所有字母, [:alnum:]所有数字字母

次数匹配:(贪婪模式)
: 任意长度的任意字符
.
: 任意长度的任意字符
\?: 匹配其前面的字符1次或0次
{m,n}:至少m次,至多n次;
{1,}:匹配其面前的字符至少1次
{0,3}:匹配其前面的字符至多3次
锚定:
^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
^$: 空白行
\<, \b:锚定词首,其后面的任意字符必须作为单词首部出现
\>, \b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
\<root\>或\broot\b:在整个文件每一行找root单词,必须作为整个单词出现
分组:
():把内容分组
(ab)*:把ab当成整体,ab可以出现任意次
后向引用
\1, \2, \3, ...:引用第[1-3]个左括号以及与之对应的右括号所包括的所有内容
grep:使用基本正则表达式定义的模式来过滤文本的命令;
-i,--ignore-case: 忽略大小写
-v: 显示没有被模式匹配到的行
-o: 只显示被模式匹配到的字符串
--color[=WHEN],--colour[=WHEN]: 显示颜色
-E: 使用扩展正则表达式
-A #: 当某一行被grep指定的模式所匹配到以后,不但显示这一行,还会显示匹配到这一行后的多少行,#代表数值
-B #: 当某一行被grep指定的模式所匹配到以后,不但显示这一行,还会显示匹配到这一行前的多少行,#代表数值
-C #: 当某一行被grep指定的模式所匹配到以后,不但显示这一行,还会显示匹配到这一行前行后的多少行,#代表数值
扩展正则表达式:
字符匹配:
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符

   [abc], [a-m], [a-z], [A-Z], [0-9], [a-zA-Z], [0-9a-zA-Z]
   字符集合:[:digit:]数字, [:lower:]小写字母, [:upper:]大写字母, [:punct:]标点符号, [:space:]空白字符, [:alpha:]所有字母, [:alnum:]所有数字字母

次数匹配:(贪婪模式)
: 任意长度的任意字符
.
: 任意长度的任意字符
?: 0或1次,不需要加\反斜线
+: 匹配其前面的字符至少1次,类似于{1,}
{m,n}: 至少m次,至多n次;不需要加\反斜线
{1,}:匹配其面前的字符至少1次
{0,3}:匹配其前面的字符至多3次
位置锚定:
^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
\<, \b: 锚定词首,其后面的任意字符必须作为单词首部出现
\>, \b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现
\<root\>或\broot\b:在整个文件每一行找root单词,必须作为整个单词出现
分组:
():把内容分组,不需要加\反斜杠
(ab)*:把ab当成整体,ab可以出现任意次
后向引用
\1, \2, \3, ...:引用第[1-3]个左括号以及与之对应的右括号所包括的所有内容
或者:
|: or
a|b: a或者b
C|cat: 匹配 C或cat
(C|c)at: 匹配Cat或者cat
grep -E = egrep:扩展正则表达式
'\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|[25[0-5])\>': 匹配0-255之间的数,或者之间必须加()小括号,不然锚定行首只能秒定[0-9],锚定行尾只能锚定[0-5]
找出/boot/grub/grub.conf文件中1-255之间的数字;
\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>
.:转义,使用元字符本身的意义
ifconfig | egrep '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>':匹配ifconfig中的ip地址
ifconfig | egrep --color '(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>.){3}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>':缩减匹配ifconifg中的ip地址
IPv4地址划分:
5类:A B C D E
A:1-127
B:128-191
C:192-223
\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[01][0-9]|22[0-3])\>(.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>){2}.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>:匹配A、B、C类地址
grep, egrep
fgrep: fast快速搜索,不支持正则表达式

[root@Smoke ~]# cat /proc/cpuinfo(查看cpu信息)
processor        : 0
vendor_id        : GenuineIntel
cpu family        : 6
model                : 58
model name        : Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
stepping        : 9
cpu MHz                : 2494.429
cache size        : 3072 KB
fpu                : yes
fpu_exception        : yes
cpuid level        : 13
wp                : yes
flags                : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc up arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb xsaveopt pln pts dts fsgsbase smep
bogomips        : 4988.85
clflush size        : 64
cache_alignment        : 64
address sizes        : 40 bits physical, 48 bits virtual
power management:
[root@Smoke ~]# grep -A 2 '^model name' /proc/cpuinfo(查找cpuinfo文件中model name出现在行首的行,-A在匹配到的行后再显示两行)
model name        : Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
stepping        : 9
cpu MHz                : 2494.429
[root@Smoke ~]# grep -B 2 '^model name' /proc/cpuinfo(查找cpuinfo文件中model name出现在行首的行,-B在匹配到的行前再显示两行)
cpu family        : 6
model                : 58
model name        : Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
[root@Smoke ~]# grep -C 2 '^model name' /proc/cpuinfo(查找cpuinfo文件中model name出现在行首的行,-C在匹配到的行前和行后各显示两行)
cpu family        : 6
model                : 58
model name        : Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz
stepping        : 9
cpu MHz                : 2494.429
[root@Smoke ~]# nano test6.txt(编辑test6.txt文件)
cat
Cat
C
China
[root@Smoke ~]# grep  -E  'C|cat' test6.txt(查找test6.txt匹配C或者cat)
cat
Cat
C
China
[root@Smoke ~]# grep -E '(C|c)at' test6.txt(查找test6.txt匹配Cat或者cat)
cat
Cat
[root@Smoke ~]# grep -E '^[[:space:]]+' /boot/grub/grub.conf(查找grub.conf文件中匹配行首至少1个空白字符)
       root (hd0,0)
       kernel /vmlinuz-2.6.32-431.11.2.el6.x86_64 ro root=UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
       initrd /initramfs-2.6.32-431.11.2.el6.x86_64.img
       root (hd0,0)
       kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
       initrd /initramfs-2.6.32-431.el6.x86_64.img
[root@Smoke ~]# egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|[25[0-5])\>' /boot/grub/grub.conf(查找grub.conf文件中1-255之间的数,或者之间必须加()小括号,不然锚定行首只能秒定[0-9],锚定行尾只能锚定[0-5])
\#          root (hd0,0)
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
title CentOS (2.6.32-431.11.2.el6.x86_64)
       root (hd0,0)
       kernel /vmlinuz-2.6.32-431.11.2.el6.x86_64 ro root=UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
       initrd /initramfs-2.6.32-431.11.2.el6.x86_64.img
title CentOS (2.6.32-431.el6.x86_64)
       root (hd0,0)
       kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
       initrd /initramfs-2.6.32-431.el6.x86_64.img
[root@Smoke ~]# ifconfig | egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|[25[0-5])\>'(查找ifconfig中1-255之间的数,或者之间必须加()小括号,不然锚定行首只能秒定[0-9],锚定行尾只能锚定[0-5])  
eth0      Link encap:Ethernet  HWaddr 00:50:56:3A:91:69  
         inet addr:172.16.100.1  Bcast:172.16.100.255  Mask:255.255.255.0
         inet6 addr: fe80::250:56ff:fe3a:9169/64 Scope:Link
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:85387 errors:0 dropped:0 overruns:0 frame:0
         TX packets:67182 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:1000
         RX bytes:7550172 (7.2 MiB)  TX bytes:15220270 (14.5 MiB)
[root@Smoke ~]# ifconfig | egrep -o '\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|[25[0-5])\>\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|[25[0-5])\>\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|[25[0-5])\>\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|[25[0-5])\>'(匹配ifconfig中的ip地址 )
172.16.100.1
192.168.142.136
127.0.0.1
[root@Smoke ~]# ifconfig | egrep -o '(\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|[25[0-5])\>\.){3}\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|[25[0-5])\>'(匹配ifconfig中的ip地址)
172.16.100.1
192.168.142.136
127.0.0.1

shell编程:
编译器,解释器
编程语言:机器语言、汇编语言、高级语言
静态语言:编译型语言
强类型(变量)
事先转换成可执行格式
C、C++、JAVA、C#
动态语言:解释型语言, on the fly
弱类型
边解释边执行
PHP、SHELL、python、perl
面向过程:把编程着眼点主要在于问题解决过程本身Shell, C
面向对象: 把整个要实现的项目抽象成一个一个对象,并且定义对象之间的动作来完成的,面向对象编程风格更适合于开发大型应用程序JAVA, Python, perl, C++
变量:内存空间,命名
内存:编址的存储单元,内存中每一个字节都有一个全局唯一地址能找到它
进程:一个程序在执行起来以后叫做进程,进程的数据和指令位于内存当中
变量类型:事先确定数据的存储格式和长度
字符
数值
整型
浮点型: 11.23, 1.12310^1, 0.112310^2
2013/10/10, 64bit
99999: 24bit,
真、假
逻辑:1+1>2
逻辑运算:与、或、非、异或
1: 真
0: 假
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
1 & 1 = 1
或:
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
1 | 1 = 1
非:
! 真 = 假
! 假 = 真
异或:
操作符相同则为0(假);不同则为1(真)
1 异或 1 = 0
0 异或 0 = 0
1 异或 0 = 1
0 异或 1 = 1
短路逻辑运算:
与运算:只要有一个为假,结果一定为假
或运算:只要有一个为真,结果一定为真
shell: 弱类型编程语言
强:变量在使用前,必须事先声明,甚至还需要初始化;数值为0,字符串为空是系统默认初始化值,也可以给一个初始值
弱:变量用时声明,甚至不区分类型;不区分类型一般都为字符串
隐式转换
显示转换
变量赋值:VAR_NAME(变量名)=VALUE(值)
bash变量类型:
环境变量
本地变量(局部变量)
位置变量
特殊变量(系统变量): bash内置的,用来保存某些特殊数据的变量
变量是进程的变量,一旦进程结束,变量没有了
引用变量:${VARNAME},花括号可以省略,不至于引起变量混淆的,没有表示变量名字符的可以不加花括号,否则就需要加花括号
本地变量:
set VARNAME=VALUE: 作用域为整个bash进程,set可以省略;
局部变量:
local VARNAME=VALUE:作用域为当前代码段;
环境变量:作用域为当前shell进程及其子进程;
export VARNAME=VALUE
VARNAME=VALUE
export VARNAME
"导出"
脚本在执行时会启动一个子shell进程:所以当前shell环境变量对子shell都是有效的
命令行中启动的脚本会集成当前shell环境变量;
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量;
位置变量:引用脚本参数
$1, $2, ...
特殊变量:保存某些特殊数据
$?: 上一个命令的执行状态返回值;
程序执行,可能有两类返回值:
程序执行结果
程序状态返回代码(0-255)
0: 正确执行
1-255:错误执行,1,2,127系统预留,其他用户可以自己定义;
输出重定向:

:输出覆盖重定向

:输出追加重定向
2>:错误输出重定向
2>>:错误输出追加重定向
&>:输出和错误输出重定向
/dev/null:软件设备,bit bucket,数据黑洞
撤消变量:
unset VARNAME(变量名)
查看当shell中变量:
set:包括环境变量和本地变量
查看当前shell中的环境变量:
printenv
env
export
特殊变量和位置变量是没办法查看的;
对于字符串类型的变量来讲,要改变其值,可以在其后面附加新内容;
ANIMALS=$ANIMALS
export PATH=$PATH:VALUE
对shell来讲默认所有的变量值都是字符串类型,所以默认不能做算术运算;
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
shebang: 魔数
#!/bin/bash(解释器路径)
# 注释行,不执行

[root@Smoke ~]# NAME=Jerry(声明变量叫NAME,值是Jerry)
[root@Smoke ~]# echo $NAME(显示NAME变量值)
Jerry
[root@Smoke ~]# bash(打开子shell)
[root@Smoke ~]# echo $NAME
注意:不同的shell是两个进程,所以在父shell声明的变量,子shell中是得不到的
[root@Smoke ~]# ANIMAL=pig(声明变量叫ANIMAL,值为pig)
[root@Smoke ~]# echo "There are some $ANIMALs."(显示字符变量ANIMAL加s,不能正常显示)
There are some .
[root@Smoke ~]# echo "There are some ${ANIMAL}s."(显示字符变量Animal加s,使用花括号正常显示)
There are some pigs.
[root@Smoke ~]# echo 'There are some ${ANIMAL}s.'(使用单引号,所有字符串原样不动显示出来,单引号叫强引用不做变量替换)
There are some ${ANIMAL}s.
注意:单引号叫强引用,不做变量替换,双引号叫弱引用,可以做变量替换
[root@Smoke ~]# pstree
init─┬─NetworkManager─┬─dhclient
│                └─{NetworkManager}
├─abrtd
├─acpid
├─atd
├─auditd───{auditd}
├─automount───4*[{automount}]
├─bluetoothd
├─certmonger
├─console-kit-dae───63*[{console-kit-da}]
├─crond
├─cupsd
├─dbus-daemon
├─hald─┬─hald-runner─┬─hald-addon-acpi
│      │             ├─hald-addon-inpu
│      │             └─hald-addon-rfki
│      └─{hald}
├─login───bash
├─master─┬─pickup
│        └─qmgr
├─5*[mingetty]
├─modem-manager
├─mysqld_safe───mysqld───9*[{mysqld}]
├─nrpe
├─rpc.idmapd
├─rpc.mountd
├─rpc.rquotad
├─rpc.statd
├─rpcbind
├─rsyslogd───3*[{rsyslogd}]
├─sshd───sshd───bash───pstree
├─tpvmlp───tpvmlp
├─udevd───2*[udevd]
├─vmtoolsd───{vmtoolsd}
├─vmware-vmblock-───3*[{vmware-vmblock}]
├─wpa_supplicant
└─xinetd
[root@Smoke ~]# export NAME(导出变量NAME)
[root@Smoke ~]# echo $NAME(显示变量NAME值)
Jerry
[root@Smoke ~]# bash(进入子shell)
[root@Smoke ~]# echo $NAME(显示变量NAME值)
Jerry
[root@Smoke ~]# bash(进入子shell)
[root@Smoke ~]# echo $NAME(显示变量NAME值)
Jerry
[root@Smoke ~]# ls /var/(显示/var目录文件及子目录)
account  crash  db     ftp      games  lib    lock  mail  opt       run    tmp  yp
cache    cvs    empty  ftproot  gdm    local  log   nis   preserve  spool  www
[root@Smoke ~]# echo $?(显示上一个命令的执行状态返回值)
0
[root@Smoke ~]# ls /varr(错误参数)
ls: cannot access /varr: No such file or directory
[root@Smoke ~]# echo $?$?(显示上一个命令的执行状态返回值)
2
[root@Smoke ~]# lss /var(错误命令)
bash: lss: command not found
[root@Smoke ~]# echo $?$?(显示上一个命令的执行状态返回值)
127
[root@Smoke ~]# id student(显示student用户信息)
uid=512(student) gid=512(student) groups=512(student)
[root@Smoke ~]# echo $?(显示上一个命令的执行状态返回值)
0
[root@Smoke ~]# id student &&gt; /dev/null(将id的执行结果输出到/dev/null黑洞)
[root@Smoke ~]# echo $?(显示上一个命令的执行状态返回值)
0
[root@Smoke ~]# echo $NAME(显示变量NAME的值)
Jerry
[root@Smoke ~]# unset NAME(撤销变量NAME)
[root@Smoke ~]# echo $NAME(显示变量NAME的值,没有了)
[root@Smoke ~]# set(查看变量)
ANIMAL=pig
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=118
CVS_RSH=ssh
DIRSTACK=()
DISPLAY=localhost:10.0
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=Smoke
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=en_US.UTF-8
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=14
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=44653
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='&gt; '
PS4='+ '
PWD=/root
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
QTLIB=/usr/lib64/qt-3.3/lib
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_CLIENT='172.16.100.254 11812 22'
SSH_CONNECTION='172.16.100.254 11812 172.16.100.1 22'
SSH_TTY=/dev/pts/0
TERM=xterm
UID=0
USER=root
_=LANG
colors=/etc/DIR_COLORS
__udisks ()
{
local IFS='
';
local cur="${COMP_WORDS[COMP_CWORD]}";
if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--show-info" ]; then
COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
else
if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--inhibit-polling" ]; then
COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
else
if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--mount" ]; then
COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
else
if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--unmount" ]; then
COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
else
if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--detach" ]; then
COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
else
if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--ata-smart-refresh" ]; then
COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
else
if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--ata-smart-simulate" ]; then
_filedir || return 0;
else
if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--set-spindown" ]; then
COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
else
if [ "${COMP_WORDS[$(($COMP_CWORD - 1))]}" = "--poll-for-media" ]; then
COMPREPLY=($(compgen -W "$(udisks --enumerate-device-files)" -- $cur));
else
COMPREPLY=($(IFS=: compgen -W "--dump:--inhibit-polling:--inhibit-all-polling:--enumerate:--enumerate-device-files:--monitor:--monitor-detail:--show-info:--help:--mount:--mount-fstype:--mount-options:--unmount:--unmount-options:--detach:--detach-options:--ata-smart-refresh:--ata-smart-wakeup:--ata-smart-simulate:--set-spindown:--set-spindown-all:--spindown-timeout:--poll-for-media" -- $cur));
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi;
fi
}
[root@Smoke ~]# ANIMALS=pig(声明变量ANIMALS值为pig)
[root@Smoke ~]# ANIMALS=$ANIMALS:goat(为变量ANIMALS冒号隔开附加值goat)
[root@Smoke ~]# echo $ANIMALS(显示变量ANIMALS值)
pig:goat
[root@Smoke ~]# ANIMALS=$ANIMALS:sheep(为变量ANIMALS冒号隔开附加值sleep,冒号不会做变量名不用使用{}花括号)
[root@Smoke ~]# echo $ANIMALS(显示变量ANIMALS值)
pig:goat:sheep
[root@Smoke ~]# echo $PATH(显示环境变量PATH值)
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@Smoke ~]# export PATH=$PATH:/usr/local/apache/bin(为PATH变量后面补充新路径)
[root@Smoke ~]# echo $PATH(显示环境变量PATH值)
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin
[root@Smoke ~]# export PATH=/usr/local/mysql/bin:$PATH(为PATH变量前面补充新路径)
[root@Smoke ~]# echo $PATH(显示环境变量PATH值)
/usr/local/mysql/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin
[root@Smoke ~]# A=2
[root@Smoke ~]# B=3
[root@Smoke ~]# C=$A+$B
[root@Smoke ~]# echo $C
2+3
[root@Smoke ~]# file /bin/ls(查看ls文件格式)
/bin/ls: ELF(可以执行可链接的文件格式) 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
[root@Smoke ~]# nano first.sh(编辑first.sh文件)
cat /etc/fstab
ls /var
[root@Smoke ~]# file first.sh(查看first.sh文件格式)
first.sh: ASCII text(ASCII无法执行)
[root@Smoke ~]# which bash(查看bash命令路径)
/bin/bash
[root@Smoke ~]# nano first.sh(编辑first.sh文件)
#!/bin/bash
\#
cat /etc/fstab
ls /var
[root@Smoke ~]# ls -l first.sh(查看first.sh文件权限)
-rw-r--r-- 1 root root 37 Jun 13 21:41 first.sh
[root@Smoke ~]# chmod +x first.sh(让first.sh文件有执行权限)
[root@Smoke ~]# ls -l first.sh(查看first.sh文件权限)
-rwxr-xr-x 1 root root 37 Jun 13 21:41 first.sh
[root@Smoke ~]# first.sh(直接使用firsh.sh执行,无法执行)
-bash: first.sh: command not found
注意:当我们在命令提示符下写的命令没有给路径的话,到$PATH环境变量找,环境变量中没有/root,所以这个命令不能找到
[root@Smoke ~]# echo $PATH(显示PATH环境变量路径)
/usr/local/mysql/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin
[root@Smoke ~]# pwd(查看当前脚本路径)
/root
解决方法:第一把当前/root路径加到$PATH环境变量里面来,第二直接指定路径;
[root@Smoke ~]# ./first.sh(当前路径下执行first.sh脚本)
UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 /                       ext4    defaults        1 1
UUID=67344573-c4c0-4b5f-beae-e6837a9712f7 /boot                   ext4    defaults        1 2
UUID=fb6d8ea4-ed81-4024-bcbc-7bc44f431282 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
account  cache        crash  cvs  db        empty  ftp  ftproot  games  gdm  lib  local  lock  log        mail  nis  opt        preserve  run  spool  tmp  www        yp
[root@Smoke ~]# nano first.sh(编辑first.sh文件,注释调ls /var命令)
#!/bin/bash
\#
cat /etc/fstab
\# ls /var
[root@Smoke ~]# ./first.sh(当前目录执行first.sh脚本,只执行cat /etc/fstab命令)
UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 /                       ext4    defaults        1 1
UUID=67344573-c4c0-4b5f-beae-e6837a9712f7 /boot                   ext4    defaults        1 2
UUID=fb6d8ea4-ed81-4024-bcbc-7bc44f431282 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
[root@Smoke ~]# chmod -x first.sh(去掉first.sh文件执行权限)
[root@Smoke ~]# ls -l first.sh(查看first.sh文件权限)
-rw-r--r-- 1 root root 39 Jun 13 21:52 first.sh
[root@Smoke ~]# bash first.sh(明确指定使用bash解释器执行first.sh脚本)
UUID=9f66aadb-2e9a-49d5-9748-ceceea2d41f0 /                       ext4    defaults        1 1
UUID=67344573-c4c0-4b5f-beae-e6837a9712f7 /boot                   ext4    defaults        1 2
UUID=fb6d8ea4-ed81-4024-bcbc-7bc44f431282 swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

练习:写一个脚本,完成以下任务
1、添加5个用户, user1,..., user5
2、每个用户的密码同用户名,而且要求,添加密码完成后不显示passwd命令的执行结果信息;
3、每个用户添加完成后,都要显示用户某某已经成功添加;
useradd user1
echo "user1" | passwd --stdin user1 &> /dev/null
echo "Add user1 successfully."

[root@Smoke ~]# vim smoke.sh
#!/bin/bash
\#
useradd user1
echo "user1" | passwd --stdin user1 &&gt; /dev/null
echo "Add user1 successfully."
useradd user2
echo "user1" | passwd --stdin user2 &&gt; /dev/null
echo "Add user2 successfully."
useradd user3
echo "user1" | passwd --stdin user3 &&gt; /dev/null
echo "Add user3 successfully."
useradd user4
echo "user1" | passwd --stdin user4 &&gt; /dev/null
echo "Add user4 successfully."
useradd user5
echo "user1" | passwd --stdin user5 &&gt; /dev/null
echo "Add user5 successfully."
[root@Smoke ~]# bash smoke.sh
Add user1 successfully.
Add user2 successfully.
Add user3 successfully.
Add user4 successfully.
Add user5 successfully.

练习:写一个脚本完成以下任务
1、使用一个变量保存一个用户名;
3、删除此变量中的用户,且一并删除其家目录;
3、显示"用户删除完成"类的信息;

[root@Smoke ~]# vim smoke2.sh
#!/bin/bash
\#
USERNAME=user5
userdel -r $USERNAME
echo "Delete $USERNAME OK"
[root@Smoke ~]# bash smoke2.sh
Delete user5 OK

条件判断:
如果用户不存在
添加用户,给密码并显示添加成功;
否则
显示如果已经没在,没有添加;
bash中如何实现条件判断?
条件测试类型:
整数测试
字符测试
文件测试
条件测试的表达式:

   [[ expression ]]: 两个中括号是bash的关键字
   test expression

整数比较:
-eq: 测试两个整数是否相等;比如 $A -eq $B
-ne: 测试两个整数是否不等;不等,为真;相等,为假;
-gt: 测试一个数是否大于另一个数;大于,为真;否则,为假;
-lt: 测试一个数是否小于另一个数;小于,为真;否则,为假;
-ge: 大于或等于
-le:小于或等于
命令的间逻辑关系:
逻辑与: &&
第一个条件为假时,第二条件不用再判断,最终结果已经有;
第一个条件为真时,第二条件必须得判断;
逻辑或: ||
第一个条件为真时,第二条件不用再判断,最终结果已经有;
第一个条件为假时,第二条件必须得判断;
逻辑非: !
如果条件为真时,结果为假
如果条件为假时,结果为真
如果用户user6不存在,就添加用户user6
! id user6 && useradd user6
id user6 || useradd user6
如果/etc/inittab文件的行数大于100,就显示好大的文件;
[ wc -l /etc/inittab | cut -d' ' -f1 -gt 100 ] && echo "Large file."
变量名称:
1、只能包含字母、数字和下划线,并且不能数字开头;
2、不应该跟系统中已有的环境变量重名;
3、最好做到见名知义;
如果用户存在,就显示用户已存在;否则,就添加此用户;
id user1 && echo "user1 exists." || useradd user1
如果用户不存在,就添加;否则,显示其已经存在;
! id user1 && useradd user1 || echo "user1 exists."
如果用户不存在,添加并且给密码;否则,显示其已经存在;
! id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists."

[root@Smoke ~]# A=3(变量A赋值为3)
[root@Smoke ~]# B=6(变量B赋值为6)
[root@Smoke ~]# [ $A -eq $B ](测试$A等于$B)
[root@Smoke ~]# echo $?(显示上一个命令执行状态返回值,为1表示为假)
1
[root@Smoke ~]# B=3(变量B赋值为3)
[root@Smoke ~]# [ $A -eq $B ](测试$A等于$B)
[root@Smoke ~]# echo $?(显示上一个命令执行状态返回值,为0表示为真)
0
[root@Smoke ~]# id user1 &> /dev/null && echo "Hello,student."(如果user1存在前面为真,就执行后面,如果user1不存在前面为假,后面就不执行)
Hello,student.
[root@Smoke ~]# id student2 &> /dev/null && echo "Hello,student."(如果student2存在前面为真,就执行后面,如果student2不存在前面为假,就不执行后面)
[root@Smoke ~]# useradd student2(添加用户student2)
[root@Smoke ~]# id student2 &> /dev/null && echo "Hello,student."(如果student2存在前面为真,就执行后面,如果student2不存在前面为假,就不执行后面)
Hello,student.
[root@Smoke ~]# nano second.sh(编辑second.sh文件)
#!/bin/bash
\#
LINES=`wc -l /etc/inittab`
echo $LINES
[root@Smoke ~]# chmod +x second.sh(向文件second.sh添加执行权限)
[root@Smoke ~]# ./second.sh(当前目录执行second.sh文件)
26 /etc/inittab
[root@Smoke ~]# nano second.sh(编辑second.sh文件)
#!/bin/bash
\#
LINES=`wc -l /etc/inittab`
echo $LINES
FINLINES=`echo $LINES |        cut -d'        ' -f1`
echo $FINLINES
[root@Smoke ~]# ./second.sh(当前目录执行second.sh文件)
26 /etc/inittab
26
[root@Smoke ~]# nano second.sh(编辑second.sh文件)
#!/bin/bash
\#
LINES=`wc -l /etc/inittab`
#echo $LINES
FINLINES=`echo $LINES | cut -d' ' -f1`
#echo $FINLINES
[ $FINLINES -gt        100 ] &&        echo "/etc/inittab is a        big file."(如果$FINLINES变量取值大于100就显示为大文件)
[root@Smoke ~]# ./second.sh(当前目录执行second.sh脚本)
[root@Smoke ~]# nano second.sh(编辑second.sh文件)
#!/bin/bash
\#
LINES=`wc -l /etc/inittab`
#echo $LINES
FINLINES=`echo $LINES | cut -d' ' -f1`
#echo $FINLINES
[ $FINLINES -gt 100 ] && echo "/etc/inittab is a big file." || echo "/etc/inittab is a small file."(如果$FINLINES变量取值大于100就显示为大文件,如果小于100前面都为假就显示为小文件)
[root@Smoke ~]# ./second.sh(当前目录执行second.sh文件)
/etc/inittab is a small file.

练习,写一个脚本,完成以下要求:
1、添加3个用户user1, user2, user3;但要先判断用户是否存在,不存在而后再添加;
2、添加完成后,显示一共添加了几个用户;当然,不能包括因为事先存在而没有添加的;
3、最后显示当前系统上共有多少个用户;

[root@Smoke ~]# nano adduser2.sh(编辑adduser2.sh文件)
#!/bin/bash
\#
! id user1 &> /dev/null && useradd user1 && echo "user1" | passwd --stdin user1 &> /dev/null || echo "user1 exists." (判断user1是否存在,如果存在为假,就显示用户存在,如果用户不存在为真,就添加用户并且添加密码)
! id user1 &> /dev/null && useradd user2 && echo "user2" | passwd --stdin user2 &> /dev/null || echo "user2 exists."
! id user1 &> /dev/null && useradd user3 && echo "user3" | passwd --stdin user3 &> /dev/null || echo "user3 exists."
USERS=`wc -l /etc/passwd | cut -d' ' -f1`(统计passwd文件中行数,并通过空格隔开取第一行)
echo "$USERS users."
[root@Smoke ~]# chmod +x adduser2.sh(给adduser2.sh执行权限)
[root@Smoke ~]# ./adduser2.sh(当前目录执行adduser2.sh文件)
user1 exists.
user2 exists.
user3 exists.
55 users.

练习,写一个脚本,完成以下要求:
给定一个用户:
1、如果其UID为0,就显示此为管理员;
2、否则,就显示其为普通用户;

[root@Smoke ~]# nano third.sh(编辑third.sh文件)
#!/bin/bash
\#
NAME=user1
USERID=`id -u $NAME`  
[ $USERID -eq 0        ] && echo " Admin" || echo "common user."(如果USERID等于0就显示是Admin,否则就显示普通用户)
[root@Smoke ~]# chmod +x third.sh(给shird.sh执行权限)
[root@Smoke ~]# ./third.sh(当前目录执行third.sh文件)
common user.
[root@Smoke ~]# nano third.sh(编辑third.sh文件)
#!/bin/bash
\#
NAME=root
USERID=`id -u $NAME`
[ $USERID -eq 0 ] && echo " Admin" || echo "common user."
[root@Smoke ~]# ./third.sh(当前目录执行third.sh文件)
Admin

条件判断,控制结构:
单分支if语句:
if 判断条件;then(如果判断条件为真就执行下面语句)
statement1(执行第一条语句)
statement2(执行第二条语句)
...
fi
双分支if语句:
if 判断条件;then(如果判断条件为真就执行下面语句)
statement1(执行第一条语句)
statement2(执行第二条语句)
...
else(否则)
statement3(执行第三条语句)
statement4(执行第四条语句)
...
fi(if反过来写)
注意:fi必须在一行,判断条件后面必须有;分号,分号后面必须写成then,then可以单独成一行,如果then和if成一行分号不能少,不写同一行可以少,判断条件,可以是整数测试比较,也可以是某个命令执行状态返回值等等,只要是布尔型返回结果就行,为真或者为假,在linux当中0为真,其他数值一律为假。
如果 UID为0;那么
显示为管理员
否则
显示为普通用户

NAME=user16
USERID=id -u $NAME(用命令的执行结果;判断用户id是否等于0)
if [ $USERID -eq 0 ]; then
echo "Admin"
else
echo "common user."
fi
NAME=user16
if [ id -u $NAME -eq 0 ]; then
echo "Admin"
else
echo "common user."
fi
if id $NAME; then(命令状态结果;判断用户是否存在)
注意:使用命令执行结果需要用反引号``引起来;如果用命令的状态返回值结果,直接引用就可以了;

[root@Smoke ~]# nano usertest.sh(编辑usertest.sh文件)
#!/bin/bash
#
NAME=user1
if id $NAME &> /dev/null;then(如果user1用户存在就显示存在)
       echo "$NAME exists."
fi
[root@Smoke ~]# chmod +x usertest.sh(给usertest.sh文件添加执行权限)
[root@Smoke ~]# ./usertest.sh(当前目录执行usertest.sh文件)
user1 exists.
[root@Smoke ~]# nano usertest.sh(编辑usertest.sh文件)
#!/bin/bash
#
NAME=user17
if id $NAME &> /dev/null;then(如果user17存在就显示存在,否则显示不存在)
       echo "$NAME exists."
else
       echo "$NAME not        exists."
fi
[root@Smoke ~]# ./usertest.sh(当前目录执行usertest.sh文件)
user17 not exists.
[root@Smoke ~]# nano usertest.sh(编辑usertest.sh文件)
#!/bin/bash
#
NAME=user17
if id $NAME &> /dev/null;then(如果user17用户存在就显示存在,否则,就添加用户,并添加密码,显示用户添加成功)
       echo "$NAME exists."
else
       useradd        $NAME &> /dev/null  
       echo $NAME | passwd --stdin $NAME &> /dev/null
       echo "Add $NAME        finished."
fi
[root@Smoke ~]# ./usertest.sh(当前目录执行usertest.sh文件)
Add user17 finished.
[root@Smoke ~]# id user17(查看user17用户信息)
uid=5004(user17) gid=5004(user17) groups=5004(user17)
[root@Smoke ~]# ./usertest.sh(当前目录执行usertest.sh文件)
user18 exists.

练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
如果有,就显示有多少个这类用户;否则,就显示没有这类用户;
grep "bash$" /etc/passwd &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ]; then

if grep "bash$" /etc/passwd &> /dev/null; then

提示:"引用"一个命令的执行结果,要使用命令引用;比如: RESAULTS=wc -l /etc/passwd | cut -d: -f1
使用一个命令的执行状态结果,要直接执行此命令,一定不能引用;比如: if id user1一句中的id命令就一定不能加引号;
如果想把一个命令的执行结果赋值给某变量,要使用命令引用,比如USERID=id -u user1;
如果想把一个命令的执行状态结果保存下来,并作为命令执行成功与否的判断条件,则需要先执行此命令,而后引用其状态结果,如
id -u user1
RETVAL=$?
此句绝对不可以写为RETVAL=id -u user1

[root@Smoke ~]# nano bash.sh(编辑bash.sh文件)
#!/bin/bash
\#
grep '\<bash$' /etc/passwd &> /dev/null
RETVAL=$?(取上面命令状态返回值)
if [ $RETVAL -eq 0 ];then(判断状态返回值是否等于0;等于0就执行显示shell为bash的用户有多少行;否则显示没有这类用户)
       grep '\<bash$' /etc/passwd | wc        -l
else
       echo 'No such user.'
fi
[root@Smoke ~]# chmod +x bash.sh(给bash.sh文件执行权限)
[root@Smoke ~]# ./bash.sh(当前目录执行bash.sh文件)
19
[root@Smoke ~]# nano bash.sh(编辑bash.sh文件)
#!/bin/bash
\#
grep '\<bash$' /etc/passwd &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ];then(判断状态返回值是否等于0,等于0就执行显示shell为bash的用户有多少个;否则显示没有这类用户)
       USERS=`grep '\<bash$' /etc/passwd | wc -l`
       echo "The shells of  $USERS users is bash."
else
           echo 'No such user.'
fi
[root@Smoke ~]# ./bash.sh(当前目录执行bash.sh文件)
The shells of  19 users is bash.

练习:写一个脚本
判断当前系统上是否有用户的默认shell为bash;
如果有,就显示其中一个的用户名;否则,就显示没有这类用户;

[root@Smoke ~]# nano bash2.sh(编辑bash2.sh文件)
#!/bin/bash
\#
grep '\<bash$' /etc/passwd &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ];then(判断状态返回值是否等于0,等于0就执行取其中一个shell为bash用户的用户名,否则显示没有这类用户)
       AUSERS=`grep '\<bash$' /etc/passwd | cut -d: -f1 | head -n 1`
       echo "$AUSERS is one of such users."
else
           echo 'No such user.'
fi
[root@Smoke ~]# ./bash2.sh(当前目录执行bash2.sh)
root is one of such users.

练习:写一个脚本
给定一个文件,比如/etc/inittab
判断这个文件中是否有空白行;
如果有,则显示其空白行数;否则,显示没有空白行。
#!/bin/bash
A=grep '^$' /etc/inittab | wc -l
if [ $A -gt 0 ]; then
echo "$A"
else
echo "meiyoukongbaihang"
fi
#!/bin/bash
FILE=/etc/inittab
if [ ! -e $FILE ]; then
echo "No $FILE."
exit 8
fi
if grep "^$" $FILE &> /dev/null; then
echo "Total blank lines: grep "^$" $FILE | wc -l."
else
echo "No blank line."
fi

[root@Smoke ~]# nano bash3.sh(编辑bash3.sh文件)
#!/bin/bash
\#
FILE=/etc/inittab
grep [[:space:]] $FILE &> /dev/null
RETVAL=$?
if [ $RETVAL -eq 0 ];then(判断状态返回值是否等于0,等于0就执行显示空白行有多少行,否则就显示没有空白行)
       LINE=`grep [[:space:]] $FILE | wc -l`
       echo "Space have $LINE line."
else
           echo "No Space line."
fi
[root@Smoke ~]# chmod +x bash3.sh(给bash3.sh执行权限)
[root@Smoke ~]# ./bash3.sh(当前目录执行bash3.sh文件)
Space have 18 line.

练习:写一个脚本
给定一个用户,判断其UID与GID是否一样
如果一样,就显示此用户为"good guy";否则,就显示此用户为"bad guy"。
#!/bin/bash
USERNAME=user1
USERID=id -u $USERNAME
GROUPID=id -g $USERNAME
if [ $USERID -eq $GROUPID ]; then(判断USERID是否等于GROUPID,如果等于就显示Good guy,否则就显示Bad guy)
echo "Good guy."
else
echo "Bad guy."
fi
[root@Smoke ~]# nano smoke6.sh(编辑smoke6.sh文件)
#!/bin/bash
#
NAME=user1
USERID=id -u $NAME
GROUPID=id -g $NAME
if [ $USERID -eq $GROUPID ];then
echo "Good guy."
else
echo "Bad guy."
fi

[root@Smoke ~]# bash smoke6.sh(使用bash解释器执行smoke6.sh)
Good guy.

进一步要求:不使用id命令获得其id号;
#!/bin/bash
#
USERNAME=user1
if ! grep "^$USERNAME\>" /etc/passwd &> /dev/null; then
echo "No such user: $USERNAME."
exit 1
fi
USERID=grep "^$USERNAME\&gt;" /etc/passwd | cut -d: -f3
GROUPID=grep "^$USERNAME\&gt;" /etc/passwd | cut -d: -f4
if [ $USERID -eq $GROUPID ]; then
echo "Good guy."
else
echo "Bad guy."
fi

[root@Smoke ~]# nano smoke7.sh(编辑smoke7.sh文件)
#!/bin/bash
\#
NAME=user1
USERID=`grep "^$NAME\>" /etc/passwd | cut -d: -f3`
GROUPID=`grep "^$NAME\>" /etc/passwd | cut -d: -f4`
if [ $USERID -eq $GROUPID ];then
       echo "Good guy."
else
           echo "Bad guy."
fi
[root@Smoke ~]# bash smoke7.sh(使用bash解释器执行smoke7.sh文件)
Good guy.

练习:写一个脚本
给定一个用户,获取其密码警告期限;
而后判断用户密码使用期限是否已经小于警告期限;
提示:计算方法,最长使用期限减去已经使用的天数即为剩余使用期限;

如果小于,则显示"Warning";否则,就显示"OK"。
圆整:丢弃小数点后的所有内容
#!/bin/bash
W=grep "student" /etc/shadow | cut -d: -f6
S=date +%s
T=expr $S/86400
L=grep "^student" /etc/shadow | cut -d: -f5
N=grep "^student" /etc/shadow | cut -d: -f3
SY=$[$L-$[$T-$N]]
if [ $SY -lt $W ]; then
echo 'Warning'
else
echo 'OK'
fi

[root@Smoke ~]# vim smoke8.sh
#!/bin/bash
\#
JINGGAO=`grep '^root\>' /etc/shadow | cut -d: -f6`
GAIMI=`grep '^root\>' /etc/shadow | cut -d: -f3`
ZUICHANG=`grep '^root\>' /etc/shadow | cut -d: -f5`
JTSJC=`date +%s`
JTTS=`expr $JTSJC / 86400`
SHIYONG=`expr $JTTS - $GAIMI`
SHENGYU=`expr $ZUICHANG - $SHIYONG`
if [ $SHENGYU -lt $JINGGAO ];then
       echo "Warning"
else
       echo "OK"
fi
[root@Smoke ~]# bash smoke8.sh
OK

练习:写一个脚本
判定命令历史中历史命令的总条目是否大于1000;如果大于,则显示"Some command will gone."$HISTORY"OK"。
#!/bin/bash
HISTORY=cat /root/.bash_history | wc -l
if [ $HISTORY -gt 1000 ];then
echo "Some command will good"
else
echo "OK"
fi

[root@Smoke ~]# nano test8.sh(编辑test8.sh文件)
#!/bin/bash
HISTORY=`history | wc -l`
if [ $HISTORY -gt 1000 ];then(判断history命令历史是否大于1000,大于则显示Some command will gone,否则显示OK)
       echo "Some command will gone."
else
           echo "OK"
fi
[root@Smoke ~]# bash test8.sh(使用bash解释器执行test8.sh)
OK

shell中如何进行算术运算:
A=3
B=6
1、let 算术运算表达式
let C=$A+$B
2、$[算术运算表达式]
C=$[$A+$B]
3、$((算术运算表达式))
C=$(($A+$B))
4、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
C=expr $A + $B

[root@Smoke ~]# A=3(给变量A赋值为3)
[root@Smoke ~]# B=6(给变量B赋值为6)
[root@Smoke ~]# C=$A+$B(计算$A+$B)
[root@Smoke ~]# echo $C(显示$C变量,是变量值相加,没有计算结果)
3+6
[root@Smoke ~]# let C=$A+$B(计算$A+$B)
[root@Smoke ~]# echo $C(显示变量$C值)
9
[root@Smoke ~]# D=$[$A+$B](计算$A+$B)
[root@Smoke ~]# echo $D(显示变量$D值)
9
[root@Smoke ~]# E=$(($A+$B))(计算$A+$B)
[root@Smoke ~]# echo $E(显示变量$E值)
9
[root@Smoke ~]# F=`expr $A + $B`(计算$A+$B)
[root@Smoke ~]# echo $F(显示变量$F值)
9
上一篇:mysql-为大量网站使用NoSQL和关系数据存储


下一篇:Pytorch 自定义数据加载器