变量的类型
1、本地变量: 只对当前的小程序或当前的shell有效
2、环境变量: 对当前shell、子shell和其他的程序都有效 用export创建并导出环境变量 如:export A=3 创建了一个环境变量A,使用export直接显示系统中导出的所有环境变量。env 在一个指定的环境下运行某个命令。 需要记住的环境变量:
PS1:设定用户提示符格式
HISTSIZE:设定命令历史的个数
HOME:家目录
PATH:外部文件查找可执行文件的路径
LOGNAME:登录的用户名
3、特殊变量: bash内置的变量
4、位置变量:可以直接向脚本传递参数,并且能够在脚本中运用 如:$1、$2、$3、....
使用$[]将运算的表达式括起来便可执行运算。
小试牛刀:
1、 编写一个脚本,完成一下功能;
一次性输出两个数的+、-、*、/两个数随机输入。
#!/bin/bash
#
echo $[$1+$2] $[$1*$2] ...
2、显示出Yuour Salary $5000
echo `Yuour Salary $5000`
echo “Yuour Salary /$5000“ 用/避免转移
命令别名
alias 建立命令别名 如:alias cdnet=`cd /etc/sysconfig/network-scripts`当后面有空格的时候使用``,没有的空格的话则不需要
unalias 取消命令别名:
使用命令建立的命令别名只能在当前shell下生效,重启或更换shell将失效。
全局有效的目录:/etc/profile,/etc/profile.d/*,/etc/bashrc
局部有效的目录:~/.bash_profile,~/.bashrc,~/.bash_logout
profile类:
设置环境变量
运行用户登录时要执行的一些命令
bashrc类:
设置别名
设置本地变量
source 或 . +文件名 重读文件,让设置的变量可以立即使用,不必等到重新登陆后才有效
shell的分类:
交互式登录式shell:当以一个用户登录到系统后以命令的方式运行的shell
运行次序:/etc/profile-->/etc/profile.d/*-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
非登陆式shell:当运行一个脚本时系统自动的运行的shell
运行次序:~/.bashrc-->/etc/bashrc-->/etc/profile.d/*
输入/输出重定向
标准输入:对应位置/dev/stdin,描述符为 0
标准输出:/dev/stdout,描述符为 1
错误输出:/dev/stderr,描述符为 2
输入的重定向: 用 < 表示
输出的重定向: 用 > 表示覆盖输出重定向,在使用set -C功能时,可以使用>|进行覆盖 ,使用用>>表示追加输出重定向(追加方式),使用set -C 避免实现覆盖重定向 使用set +C 取消这个功能。
错误输出重定向:用 2>表示覆盖错误输出重定向,用2>>表示追加错误输出重定向(追加方式)
合并错误输出和标准输出的输出流:用 &> 表示
自定义输出重定向
exec 3>> /tmp/myout.out 将输入到/tmp/myout.out的内容用自定义的符号3来代表这个路径
ls /etc >&3 将ls /etc 内容写入3
exec 3>&- 撤销自定义的符号3
sort 排序
-t 逆向排序
管道 |
可以连接多个命令,一直将前一个命令的执行结果当作下一个命令的输入内容。
tee 把产生的数据分成两份,一份自己保存,一份通过管道送给后面的命令 ls /etc |tee >log.ls | less
程序执行流
顺序执行:
选择分支:
循环执行:for I in LIST ;do 创建10个账户名字为user1-user10,并将密码设置为相应用户名
for I in {1..10};do
useradd user$I
echo user$I | passwd --stdin user$I
done
练习:
1、pin从192.168.0.151 -192.168.0.254 每个ip ping 一次
#!/bin/bash
for I in {151..254}; do
ping -c 1 192.168.0.$I
done
2、从1累加至100
#!/bin/bash
let SUM=0
for I in {1..100}; do
SUM=$[$SUM+$I]
done
echo "The sum is :$SUM"
3、写一个脚本
(1)、切换工作目录/var
(2)、依次向/var目录中的每个文件或子目录问好,(提示:for I in /var/*)如:Hello,log
(3)、统计/var目录下共有多少个文件,并显示出来:
let SUM=0
for I in /var/*;do
SUM=$[$SUM+1]
done
echo "$SUM file"
4、写一个脚本:
(1)、设定变量值为/etc/passwd
(2)、使用循环读取文件/etc/passwd的第2,4,10,13,15行,并显示其内容:(提示:LINE=`head -2 /etc/passwd | tail -l`可以读取第二行)
(3)把这些文件保存至/tmp/mypasswd文件中
exec 3 >>/tmp/mypasswd
FILE='/etc/bash'
for I in 2 4 6 10 13 15; do
LINE=`head -$I $FILE | tail -l`
echo $LINE
echo $LINE >$3
done
for循环总结
for VAR in LIST ; do
statement;
statement;
...
done
LIST的形式有:
简单列表:
复制列表: This is tom's cat .此LIST列表中含有',系统将误读,将其写成/'s,则可还给'应有的意义。
IFS=$'\n' 设定为只识别换行符。
文本处理命令
cut
-d 指定分隔符 空格用" "表示
-f 取第几段 tail -l /etc/passwd | cut -d: -f1,7 使用cut以:为分隔符取这个文件的第1、7段
grep [options] PATTERN file 全面搜索正则表达式并将匹配的内容显示出来 如:grep 'root' /etc/passwd 过滤出这个文件中含有'root'的行
-i 不区分大小写
-v 和默认的字符相反。
-n 显示所匹配的行在原文中所处的行号
-An 同时显示出匹配行之后的n行
-Bn 之前的n行
-Cn 前后n行
--color 把匹配的字符本身高亮显示出来
正则表达式:一堆的元字符用来表示字符本身以外的意思
1、基本正则表达式:.* 连着使用表示任意长度的任意字符。
2、扩展正则表达式:grep -E=egrep 功能多余基本正则表达式,但对有些基本正则表达式的元字符不认识。
附图2011-07-20 16-56-27 答案:
1、grep --color "^[sS]" /pro/meminfo
2、grep --color "nologin$" /etc/passwd
3、grep --color "^#[[:space:]\(1,\)].*" /etc/inittab
4、grep --color ":[0-9]:" /etc/inittab
5、grep --color "[[:space:]]\(1,\).*" /boot/grub/grub.conf
6、grep --color "^\([0-9]\).*\1$" /etc/
7、ifconfig | grep --color "inet addr" | grep -v '127.0.0.1' | cut -d: -f2 | cut -d" " -f1
8、grep --color "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\." /etc/sysconfig/network-spcripts/ifcfg-eth0
grep -E --color "([0-9]\{1,3\}\.){3}[0-9]\{1,3}" /etc/sysconfig/network-spcripts/ifcfg-eth0
$?:上个命令执行状态的结果 echo $? 查看上一个命令执行状态的结果。
0:表示执行成功
1-255:表示执行失败,不同的数代表不同的失败原因。
command && command 前面的命令执行成功的话才执行后一个命令
command || command 前面的命令执行失败的话才执行后一个命令