1.
Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。
如何创建新shell脚本?
1. 创建包含bash命令的文本文件。文件的第一行应为:
#!/bin/bash
2. 使文件可执行(使用chmod +x scripts)
3. 将文件放置在用户的$PATH的目录中
~/bin – 用于用户的私有程序
/usr/local/bin – 本地开发、系统上的其他人使用的脚本
/usr/local/sbin - 本地开发、由root使用的脚本
直接运行脚本和使用source命令运行脚本是不同的!
脚本调试模式:
#!/bin/bash -x
#bash -x scripts
#!/bin/bash
引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。
""(双引号)弱引用
将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\ 和 ! 字符除外。换言之,变量扩展和命令扩展在双引号内仍起作用。
#!/bin/bash
echo #hello world#
./hello.sh
bash -x hello.sh(查看脚本的内容输入)
+ echo## + 表示执行的优先级
加双引号后:
[root@localhost mnt]# vim hello.sh
[root@localhost mnt]# ./hello.sh
#hello world#
'' ##强引用 (单引将字符串放置在单引号内,保留字符串中所有字符的文字值,同时禁用所有扩展
[root@localhost mnt]# vim hello.sh
#!/bin/bash
echo "$HOME"
[root@localhost mnt]# ./hello.sh
/root
[root@localhost mnt]# bash -x hello.sh
+ echo /root
/root
[root@localhost mnt]# vim hello.sh
#!/bin/bash
echo '$HOME'
[root@localhost mnt]# ./hello.sh
$HOME
[root@localhost mnt]# bash -x hello.sh
+ echo '$HOME'
$HOME
\ 转义字符 它保留了下一个字符的文字值,也叫做“逃逸字符”,目的在于使后接的字符回复原来作为单纯字符的用途。
echo Make \$\$\$ Fast\!
ls untitled\ folder
Shell计算命令:
用$[]表示数学运算。
# echo $[1+2]
# a=1; echo $[$[$a+1]*2]
用expr表示数学运算。
# echo `expr 1 + 2`
用let指示数学运算。
# let A=1+2
# echo $A
用(())表示数学运算。bash内建功能,效率高。
#!/bin/bash
for ((i=1;i<10;i++))
do
((j+=i))
done
echo $j
循环与计算结合:
#!/bin/bash
for ((i=1;i<=100;i++))
do
((j+=i))
#j=`expr $j + $i`
#let j+=i
#j=$[j+=i]
done
echo $j
#######用户创建的脚本######
1.vim /mnt/userfile
user1
user2
user3
2.vim /mnt/passwordfile
user1westos
user2westos
user3westos
3.vim /mnt/create_user.sh
#!/bin/bash
MAXLINE=`wc -l /mnt/userfile | cut -d " " -f 1`
for NUM in $(seq 1 $MAXLINE)
do
USERNAME=`sed -n ${NUM}p /mnt/userfile`
PASSWORD=`sed -n ${NUM}p /mnt/passwordfile`
useradd $USERNAME
echo $PASSWORD | passwd --stdin $USERNAME
done
4.chmod +x /mnt/create_user.sh
5../create_user.sh
[root@dns-server mnt]# ./user_create.sh
Changing password for user user1.
passwd: all authentication tokens updated successfully.
Changing password for user user2.
passwd: all authentication tokens updated successfully.
Changing password for user user3.
passwd: all authentication tokens updated successfully.
#####计时脚本########
1.
vim /mnt/time.sh
#!/bin/bash
for ((i=1;i<=10;i++))
do
echo -n $i
#echo -ne '\r \r'
sleep 1
done
sh /mnt/time.sh
[root@dns-server mnt]# sh time.sh
12345678910
2.
vim /mnt/daotime.sh
#!/bin/bash
for ((i=10;i>=0;i--))
do
echo -n $i
#echo -ne ' \r'
sleep 1
done
sh /mnt/daotime.sh
[root@dns-server mnt]# sh time.sh
109876543210
3.1分10秒倒计时脚本
vim /mnt/time.sh
#!/bin/bash
MIN=1
for ((SEC=10;SEC>=0;SEC--))
do
echo -n " $MIN:$SEC "
echo -ne "\r \r"
sleep 1
while
[ "$SEC" = "0" -a "$MIN" -gt "0" ]
do
echo -n " $MIN:$SEC "
echo -ne "\r \r"
SEC=60
((MIN--))
done
done
sh /mnt/time.sh
##########test条件判断
test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式
为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语
法,使用方括号"[]"将表达式括起来,这样更易于阅读。
非零或零长度字符串运算符:test -{n|z} STRING
字符串比较运算符:=、!=
数字比较运算符:-eq(等于)、-ne(不等于)、-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)
文件状态运算符:test -{b|c|e|f|d|r|w|x|s|L} FILE/DIRECTORY
二进制文件运算符:-ef、-nt、-ot
逻辑运算符:-o、-a、!、&&、||
###########if语句##########
if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then
之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之
间的命令列表(反向平写if,标记if块的结束)。
1.
vim /mnt/ping.sh
#!/bin/bash
if
[ -n "$*" ]
then
ping -c1 -w1 $* &> /dev/null
if
[ "$?" = "0" ]
then
echo $* is up
else
echo $* is down
fi
else
echo "ERROR : please give me a ipaddress"
fi
sh ping.sh
2.
vim /mnt/test.sh
#!/bin/bash
read -p "please input (Y/N): " yn
if
[ "$yn" == "Y" -o "$yn" == "y" ]
then
echo "OK,continue"
elif
[ "$yn" == "N" -o "$yn" == "n" ]
then
echo "interrupt!"
else
echo "please again input"
fi
[root@dns-server mnt]# sh test.sh
please input (Y/N): y
OK,continue
[root@dns-server mnt]# sh test.sh
please input (Y/N): n
interrupt!
###################case语句##############
case语句 :它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪
部分代码。
vim /mnt/cases.sh
#!/bin/bash
case $1 in
westos)
echo linux
;;
linux)
echo westos
;;
*)
echo error
esac
[root@dns-server mnt]# sh cases.sh
error
[root@dns-server mnt]# sh cases.sh westos
linux
[root@dns-server mnt]# sh cases.sh linux
westos
###############expect语句###############
在shell中利用expect实现自动应答脚本。
1.
[root@dns-server mnt]# vim answes.exp
[root@dns-server mnt]# chmod +x answes.exp
[root@dns-server mnt]# /mnt/answes.exp
spawn /mnt/ask
what is your name?
zcc
how old are you?
22
girl\boy?
boy
或者
#!/usr/bin/expect
spawn /mnt/ask
expect {
"name" { send "zcc\r"; exp_continue }
"old" { send "22\r"; exp_continue }
"girl" {send "boy\r"; exp_continue }
expect eof
}
2.
#!/usr/bin/expect
set NAME [ lindex $argv 0 ]
set AGE [ lindex $argv 1 ]
set SEX [ lindex $argv 2 ]
spawn /mnt/ask
expect {
"name" { send "$NAME\r"; exp_continue }
"how old are you" { send "$AGE\r"; exp_continue }
"girl" {send "$SEX\r"; exp_continue }
expect eof
}
[root@dns-server mnt]# /mnt/answes.exp zcc 22 boy
spawn /mnt/ask
what is your name?
zcc
how old are you?
22
girl\boy?
boy
#!/usr/bin/expect
这一行告诉操作系统脚本里的代码使用那一个shell来执行。
set timeout 10
设置后面所有的expect命令的等待响应的超时时间,单位为秒。
spawn talk
spawn是expect的内部命令,作用是给后面的shell指令加个壳,用来传递交互指令。
expect "who"
判断上次输出结果里是否包含“who”的字符串,如果有则立即返回,否则等待超时时间后返回。
send "westos\n"
执行交互动作,相当于手工输入"westos"。
expect eof
作用是在输出中搜索文件结束符,如果没有这一行,脚本会立即退出,得不到正确结果。
interact
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。否则退出登录。
$argv 参数数组
expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第
一个,第二个,第三个....参数。
#############alias############
使用别名
alias命令可以用来自定义属于自己的系统命令,写入~/.bashrc 文件永久生效。
查看别名:
# alias
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
...
设置别名:
# alias mycom='echo hello;hostname'
# mycomm
hello
server0.example.com
删除别名: unalias mycomm
##############花生壳(ddns)##########
[root@apache named]# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST westos
Kwestos.+157+35167
[root@apache mnt]# cat Kwestos.+157+35167.key
westos. IN KEY 512 3 157 0cjbgjTKpkgqxfMf2lgDJg==
[root@apache etc]# vim westos.key
key "westos" {
algorithm hmac-md5;
secret "0cjbgjTKpkgqxfMf2lgDJg==";
};
[root@apache etc]# vim /etc/named.conf
include "/etc/westos.key";
[root@apache etc]# vim /etc/named.rfc1912.zones
zone "westoslinux.com" IN {
type master;
file "westoslinux.com.zone";
allow-update { key westos; };
allow-transfer { 172.25.254.247; };
};
[root@apache named]# vim /etc/dhcp/dhcpd.conf
option domain-name "westoslinux.com";
option domain-name-servers 172.25.254.147;
default-lease-time 600;
max-lease-time 7200;
# Use this to enble / disable dynamic dns updates globally.
ddns-update-style interim;
key westos {
algorithm hmac-md5;
secret 0cjbgjTKpkgqxfMf2lgDJg==;
};
zone westoslinux.com. {
primary 127.0.0.1;
key westos;
}