20道shell编程面试题-中

企业实战题7:开发mysql多实例启动脚本

#!/bin/bash
# chkconfig: 2345 64 36
# description: A very fast and reliable SQL database engine
basedir='/usr/local/mysql'
bindir='/usr/local/mysql/bin'
pidfile='/data/mysql/data/mysql.pid'
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
judge(){
  RETVAL=$?
  if [ $RETVAL -eq 0 ];then
    action "$1 mysql" /bin/true
  else
    action "$1 mysql" /bin/false
  fi
  return $RETVAL
}
# start函数中注意:输出到空以及后台运行
start(){
  if [ ! -f $pidfile ];then
    $bindir/mysqld_safe --defaults-file=$basedir/my.cnf &>/dev/null &
    judge start
  else
    action "MySQL is running" /bin/true
  fi
}
stop(){
  if [ -f $pidfile ];then
    $bindir/mysqladmin -uroot -poldboy123456  shutdown &>/dev/null
    judge stop
  else
    action "MySQL is not running" /bin/false
  fi
}
stop2(){
  if [ -f $pidfile ];then
    mysqld_pid=`cat "$pidfile"`
    # 判断mysql pid对应的进程是否存在
    if (kill -0 $mysqld_pid 2>/dev/null);then
      echo $"Shutting down MySQL"
      kill $mysqld_pid
      judge stop
    else
      action "MySQL is not running" /bin/false
    fi
  else
    action "MySQL is not running" /bin/false
  fi
}
case "$1" in
  start)
    start
    ;;
  stop)
    stop2
    ;;
  restart)
    stop2
    sleep 2
    start
    ;;
  *)
    echo "USAGE:$0 {start|stop|restart}"
    exit $RETVAL
esac

注意事项:

1)Starting MySQL........

ERROR! The server quit without updating PID file (/data/mysql/data/mysql.pid)

是因为配置文件有错误,之前我把账号密码写在了里面,导致无法启动,去掉那两行即可

2)觉得把账号密码写在脚本比较暴露的话,可以用函数stop2,也可以将其写在文件中

cat hehe.conf
[client]
port = 3306
socket = /usr/local/mysql/var/mysql.sock
user=root
password=oldboy123456

/usr/local/mysql/bin/mysqladmin --defaults-file=/server/scripts/hehe.conf shutdown

企业实战题8:如何实现对MySQL数据库进行分库备份,请用脚本实现

#!/bin/bash
BAKPATH=/server/backup
MYUSER=root
MYPASS=oldboy123456
SOCKET=/usr/local/mysql/var/mysql.sock
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET -x -B -F -R"
[ ! -d $BAKPATH ] && mkdir -p $BAKPATH
DBLIST=`$MYCMD -e 'show databases;'|sed 1d|egrep -v 'schema|test'`
for dbname in $DBLIST
do
  $MYDUMP $dbname|gzip > /server/backup/${dbname}_$(date +%F).sql.gz
done

注意事项:

最近把MySQL从5.5升到5.6以后,mysqldump不好用了,提示:

Warning: Using a password on the command line interface can be insecure

# 把账号密码写到配置文件中
vim /usr/local/mysql/my.cnf
[mysqldump]
user=root
password=oldboy123456
# 如何使用(不指定文件会报错):
mysqldump --defaults-extra-file=/usr/local/mysql/my.cnf mysql > hehe.sql

企业实战题9:如何实现对MySQL数据库进行分库加分表备份,请用脚本实现

#!/bin/bash
BAKPATH=/server/backup
MYUSER=root
MYPASS=oldboy123456
SOCKET=/usr/local/mysql/var/mysql.sock
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET -x -F -R"
[ ! -d $BAKPATH ] && mkdir -p $BAKPATH
DBLIST=`$MYCMD -e 'show databases;'|sed 1d|egrep -v 'schema|test'`
for dbname in $DBLIST
do
  mkdir -p $BAKPATH/$dbname
  TLIST=`$MYCMD -e 'show tables from $dbname;'|sed 1d`
  for tname in $TLIST
  do
    $MYDUMP $dbname $tname|gzip > $BAKPATH/$dbname/${tname}_$(date +%F).sql.gz
  done
done

企业面试题10:请用至少两种方法实现!

for循环打印下面这句话中字母数不大于6的单词

I am oldboy teacher welcome to oldboy training class.

#!/bin/bash
for word in I am oldboy teacher welcome to oldboy training class.
do
  if [ ${#word} -le 6 ];then
    echo -e "$word \t ${#word}"
  fi
done

#!/bin/bash
array=(I am oldboy teacher welcome to oldboy training class.)
for word in ${array[*]}
do
  if [ ${#word} -le 6 ];then
    echo -e "$word \t ${#word}"
  fi
done

echo "I am oldboy teacher welcome to oldboy training class." \
|tr " " "\n"|awk '{if(length($1)<=6) print $1}'

企业面试题11:

开发shell脚本分别实现以脚本传参以及read读入的方式比较2个整数大小,以read读入的方式对变量是否为数字、并且传参个数做判断.

#!/bin/bash
read -p "Pls input two number: " ARG1 ARG2
echo $ARG1
echo $ARG2
if [ ${#ARG1} = 0 -o ${#ARG2} = 0 ];then
  echo "number is not allowed empty"
  exit 1
fi
expr $ARG1 + 1 >/dev/null 2>&1
RETVAL1=$?
expr $ARG2 + 1 >/dev/null 2>&1
RETVAL2=$?
if [ $RETVAL1 -ne 0 -o $RETVAL2 -ne 0 ];then
  echo "number must be int"
  exit 2
fi
if [ $ARG1 -lt $ARG2 ];then
  echo "$ARG1 < $ARG2"
  exit
elif [ $ARG1 -eq $ARG2 ];then
  echo "$ARG1 = $ARG2"
  exit
else
  echo "$ARG1 > $ARG2"
  exit
fi

企业面试题12:打印选择菜单,一键安装Web服务

#!/bin/bash
menu(){
cat<<EOF
    1.[install lamp]
    2.[install lnmp]
    3.[exit]
    echo "pls input num: "
EOF
}
menu
read num
lamp="/server/scripts/install_lamp.sh"
lnmp="/server/scripts/install_lnmp.sh"

[ $num -eq 1 ] && {
    [ -x "$lamp" ] || { echo "$lamp can't be exec";exit 1; }
    echo "start installing lamp"
    $lamp
    exit 0 
}
[ $num -eq 2 ] && {
    [ -x "$lnmp" ] || { echo "$lnmp can't be exec";exit 1; }
    echo "start installing lnmp"
    $b
    exit 0 
}
[ $num -eq 3 ] && {
    echo "you choice quit!"
    exit 0
}
echo "input error";exit 1

猜你喜欢

转载自www.cnblogs.com/fawaikuangtu123/p/10905160.html
今日推荐