1,使用source来执行脚本,相当于在一个shell下面执行脚本。互相可以可以调用。
bash执行脚本,开启了一个新的shell,或者说是开启了一个子shell。
2,不加引号 解析变量
单引号是所见即所得
双引号 解析变量
反引号是输出的命令
3,$0 获取当前执行的shell脚本名
$n 获取当前执行的shell脚本的第n个参数值
$# 获取当前执行的shell脚本后面接的参数总个数
$* 获取当前脚本所有传参的参数
$@ 获取当前脚本所有传参的参数
$? 获取上一个指令的状态返回值
$$ 获取当前执行的shell脚本的进程号PID
$! 获取上一个在后台工作的进程的进程号PID
4 ${oldboy} 返回变量$oldboy的内容
{#oldboy} 返回变量$oldboy内容的长度
${oldboy:offset:length} 在变量$oldboy中从位置offset之后开始提取到length结尾的字符串
${oldboy#word} 从变量${oldboy}开头开始删除最短匹配的Word字符串
${oldboy##word} 从变量${oldboy}开头开始删除最长匹配的Word字符串
${oldboy%word}从变量${oldboy}结尾开始删除最短匹配的Word字符串
${oldboy%%word} 从变量${oldboy}结尾开始删除最长匹配的Word字符串
${oldboy/pattern/string} 使用string代替第一个匹配的pattern
${oldboy//pattern/string} 使用string代替所有的匹配的pattern
${oldboy:-word} 如果oldboy内容不存在,则使用word来替换
考试题
5:通过脚本传参的方式,检查 Web 网站 URL 是否正常(要求主体使用函数)
. /etc/init.d/functions
check_url(){
wget -q -o /dev/null -T 2 --tries=1 --spider $1
if [ $? -eq 0 ]
then
action "$1 is ok" /bin/true
else
action "$1 is no" /bin/false
fi
}
usage(){
echo "Usage: $0 url"
}
main(){
if [ $# -ne 1 ]
then
usage
fi
check_url $1
}
main $*
考试题 6:开发 Nginx 服务(编译安装)启动停止脚本,并分别通过 chkconfig(CentOS6)
和 systemctl(CentOS7)实现开机自启动
. /etc/init.d/functions
usage(){
echo "Usage: $0 {start|stop|restart}"
}
start(){
/application/nginx/sbin/nginx &>/dev/null
if [ `netstat -lntup |grep nginx|wc -l` -eq 0 ]
then
action "nginx 开启失败" /bin/false
else
action "nginx 开启成功" /bin/true
fi
}
stop(){
/application/nginx/sbin/nginx -s stop &>/dev/null
if [ `netstat -lntup |grep nginx|wc -l` -eq 0 ]
then
action "nginx 关闭成功" /bin/true
else
action "nginx 关闭失败" /bin/false
fi
}
restart(){
/application/nginx/sbin/nginx -s stop &>/dev/null
/application/nginx/sbin/nginx &>/dev/null
if [ `netstat -lntup |grep nginx|wc -l` -eq 0 ]
then
action "nginx 重启失败" /bin/false
else
action "nginx 重启成功" /bin/true
fi
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
usage
;;
esac
[root@web01 /etc/systemd/system]# cat nginxd2.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/nginxd2 start
ExecReload=/etc/init.d/nginxd2 restart
ExecStop=/etc/init.d/nginxd2 stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
考试题 7:猜数字游戏。首先让系统随机生成一个数字,给这个数字定一个范围(1-60),
让用户输入猜的数字,对输入进行判断,如果不符合要求,就给予高或低的提示,猜对后则
给出猜对用的次数
random="$((RANDOM%60))"
count=0
while true
do
((count++))
read -p "请猜数字:" num
if [ $num -gt $random ]
then
echo "猜高了。"
elif [ $num -eq $random ]
then
echo "牛啊,猜对了,一共猜了${count}次。"
exit
else
echo "猜低了。"
fi
done
考试题 8:计算从 1 加到 100 之和(要求用 for 和 while,至少给出两种方法)
sum=0
for num in {1..100}
do
((sum+=num))
done
echo $sum
for ((i=1;i<=100;i++))
do
((sum1+=i))
done
echo $sum1
考试题 9: 利用 bash for 循环打印下面这句话中字母数不大于 6 的单词(某企业面试真
题)。I am oldboy teacher welcome to oldboy training class
a="I am oldboy teacher welcome to oldboy training class"
for word in $a
do
if [ `echo $word|wc -L` -le 6 ] ;then
echo $word
fi
done
考试题 10:使用 read 读入方式比较两个整数大小,要求对用户输入的内容严格判断是否为整数,是否输入了两个数字。
read -t 30 -p "请输入两个整数:" a b
expr $a + $b + 2 &>/dev/null
if [ $? -ne 0 ]
then
echo "请输入两个整数。"
exit
fi
[ -z "$b" ] && {
echo “请输入两个整数。”
exit
}
if [ $a -gt $b ]
then
echo "$a > $b"
elif [ $a -eq $b ]
then
echo "$a = $b"
else
echo "$a < $b"
fi
考试题 11:批量生成随机字符文件名案例
path=/oldboy
[ -d "$path" ] || mkdir -p "$path"
for n in `seq 10`
do
random=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 2-11`
touch $path/oldboy_${random}.html
done
考试题 12:批量改名特殊案例
path="/oldboy"
[ -d $path ] && cd $path
for n in `ls`
do
echo $n| awk -F "[_.]" '{print "mv",$0,"oldgirl_"$2".HTML"}'|bash
done
rename oldboy oldgirl *.html && rename .html .HTML *.html
13,批量创建 10 个系统帐号 oldboy01-oldboy10 并设置密码(密码为随机 8 位数)
. /etc/init.d/functions
user="oldboy"
passfile="/tmp/user.log"
for num in `seq -w 10`
do
pass="`echo "test$RANDOM"|md5sum|cut -c3-11`"
useradd $user$num & >/dev/null &&\
echo "$pass"|passwd --stdin $user$num & >/dev/null &&\
echo -e "user:$user$num\tpasswd:$pass">>$passfile
if [ $? -eq 0 ]
then
action "$user$num is ok" /bin/true
else
action "$user$num is fail" /bin/false
fi
done
echo -----------------------
cat $passfile && >$passfile
考试题 14:解决 DOS 攻击生产案例
file=$1
awk '{print $1}' $1|grep -v "^$"|sort|uniq -c >/tmp/tmp.log
exec </tmp/tmp.log
while read line
do
ip=`echo $line|awk '{print $2}'`
count=`echo $line|awk '{print $1}'`
if [ $count -ge 30 ] && [ `iptables -L -n|grep $ip|wc -l` -lt 1 ]
then
iptables -I INPUT -s $ip -j DROP
echo "$ip is droped" >>/tmp/droplits_$(date +%F).log
fi
done
执行方式 sh 14.sh access_2010-12-8.log
执行方式 sh 14.sh access_2010-12-8.log
考试题 15:菜单自动化软件部署经典案例
shu(){
cat <<EOF
1,install lamp
2,install lnmp
3,exit
EOF
read -p "请输入数字安装程序" sum
expr$sum+1 &>/dev/null
if[ $? -ne 0 ]
then
echo 请输入数字 1, 2,3
shu
elif[ ${#sum} -lt 1 ]
then
echo 你未输入数字
shu
elif[ ${#sum} -eq 1 ]
then
lamp
elif[ ${#sum} -eq 2 ]
then
lnmp
elif[ ${#sum} -eq 3 ]
then
tui
fi
}
lnmp(){
if [ -x /server/scripts/lnmp.sh ] && [ -f /server/scripts/lnmp.sh ]
then
. /server/scripts/lnmp.sh
echo "start install lnmp"
shu
else
echo "您的脚本有异常"
shu
fi
}
tui(){
exit 0
}
main(){
while true
do
shu
amp
lnmp
tui
done
}
main
考试题 16:批量检查多个网站地址是否正常
array=(http://blog.oldboyedu.com
http://www.baidu.com
http://oldboy.blog.51cto.com
http://10.0.0.7
)
Wait(){
echo -n "wait 10s
for((i=0;i<3;i++))
do
echo -n "."
sleep 1
done
echo
}
CheckUrl(){
wget -t 2 -T 5 --spider $1 &> /dev/null
if [ $? -eq 0 ];then
echo "check $1 is OK"
else
echo "check $1 is FAILED"
fi
return $?
}
main(){
Wait
for((i=0;i<${#array[*]};i++))
do
CheckUrl ${array[i]}
done
return $?
}
main $*
1、按单词出现频率降序排序(不低于 3 种方法)
2、按字母出现频率降序排序(不低于 3 种方法)
tr ",. " "\n" <17.txt |sort |uniq -c|sort -nr
tr ",. " "\n" <17.txt |awk '{S[$1]++}END{for(k in S) print S[k],k}'|sort -nr
awk -F"[,. ]+" '{for(i=1;i<=NF;i++) S[$i]++}END{for(k in S) print S[k],k}' 17.txt|sort -nr
egrep -o "[a-Z]+" 17.txt |sort |uniq -c|sort -nr
egrep -o "[a-Z]+" 17.txt |awk '{S[$1]++}END{for(k in S) print S[k],k}'|sort -nr
1、按单词出现频率降序排序(不低于 3 种方法)
vim 17.txt
the squid project provides a number of resources to assist users
design,implement and support squid installations. Please browse the
documentation and support sections for more infomation,by oldboy training.
arr=(the squid project provides a number of resources to assist usersdesign,implement and
support squ
id installations. Please browse the documentation and support sections for more infomation,by
oldboy
training)
echo ===============NO.1================
for i in ${arr[*]}
do
echo $i|sed 's#[^a-Z]##g'|grep -o '[^ ]' >>/tmp/1.txt
done
sort /tmp/1.txt|uniq -c|sort -nr
echo ===============NO.2================
tr ",. " "\n" <17.txt|grep -o '[^ ]'|sort|uniq -c|sort -nr
echo ===============NO.3================
tr "., " "\n" <17.txt|awk -F "" '{for(i=1;i<=NF;i++)S[$i]++}END{for(k in S)print S[k],k|"sort -nr"}'
考试题 19:已知:/etc/hosts 的内容为
192.168.1.11 oldboy11
192.168.1.21 oldboy21
192.168.1.31 oldboy31
请用 shell 脚本实现,怎么才能在输入 IP 后找到/etc/hosts 里对应的唯一的 hostname?
解答:
if [ $# -ne 1 ]
then
echo "Usage: $0 + IP"
exit 1
else
hostname=`awk -F "[ ]+" -vn=$1 '$1==n{print $2}' /etc/hosts`
if [ ${#hostname} -eq 0 ]
then
echo "not found $1 in /etc/hosts"
else
echo $hostname
fi
fi
考试题 20:老男孩交流群某人发问如下
上海@Danny(122504707)21:54:37
请教一个问题
cat oldboy.txt
192.168.1.1 /hello1/b.do?bb=4
192.168.1.2 /hello2/a.do?ha=3
192.168.1.3 /hello3/r.do?ha=4
如何显示成以下效果
192.168.1.1 b.do
192.168.1.2 a.do
192.168.1.3 r.do
方法1
array=(
"192.168.1.1 /hello1/b.do?bb=4"
"192.168.1.2 /hello2/a.do?ha=3"
"192.168.1.3 /hello3/r.do?ha=4"
)
for n in "${array[@]}"
do
echo $n|awk -F "[ /?]" '{print $1,$4}'
done
方法2
while read line
do
secho $line|awk -F "[ /?]" '{print $1,$4}'
done < 20.txt
方法3 直接
awk -F "[ /?]" '{print $1,$4}' 20.txt