Linux常用功能脚本集合

1、判断输入的字符串是否为数字判别方法

#! /bin/sh
expr $1 + 1 >/dev/null 2>&1
[ $? -eq 0 ] && echo int || echo chars

从一个长串的单句子中找出来长度小于6的词
for n in I am stone linux welcome to our training
do
   if [ `expr length $n` -le 6 ]
      then
         echo $n
   fi
done

2、使用脚本打印杨辉三角

#!/bin/sh
if (test -z $1) #判断传参的长度是不是0
   then
     read -p "Input Max Line" MAX
else
   MAX=$i
fi
i=0
while [ $i -le $MAX ] #i进行行控制
do
   j=1
   while [ $j -le $i ] #j进行列控制
     do
       f=$[i-1] #f=i-1是$[]计算方法
       g=$[j-1]
       if [ $j -eq $i ] || [ $j -eq 1 ] ;then
          declare SUM_${i}_$j=1 #声明变量头尾都是1
       else
          declare A=$[SUM_${f}_$j] #取上一行的j列变量
          declare B=$[SUM_${f}_$g] #取得上一列的j-1变量
          declare SUM_${i}_${j}=`expr $A + $B` #声明并计算当前变量的值
       fi
       echo -en $[SUM_${i}_$j]" " #输出当前变量
       let j++
     done   #一行结束
     echo
     let i++
done

3、命令行控制台输出颜色字体

#!/bin/sh
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
RES='\E[0m'
echo -e "$RED_COLOR oldboy $RES"
echo -e "$YELLOW_COLOR oldgirl $RES"
\E[ 标识变量的开始
\E[0m:标识关闭掉所有的属性

4、case 案例实验

#!/bin/sh
RED_COLOR='\E[1;31m'
GREEN_COLOR='\E[1;32m'
YELLOW_COLOR='\E[1;33m'
BLUE_COLOR='\E[1;34m'
RES='\E[0m'
function useage(){
  echo "USAGE $0 {1|2|3|4}"
  exit 1
}
function menu(){
  cat <<END
    1.apple
    2.pear
    3.banana
END
}
function chose(){
   read -p "pls input your choice:" fruit
   case "$fruit" in
      1)
      echo -e "${RED_COLOR}apple${RES}"
      ;;
      2)
      echo -e "${GREEN_COLOR}pear${RES}"
      ;;
      3)
      echo -e "${YELLOW_COLOR}banana${RES}";
      ;;
      *)
      useage
      esac
}
function main(){
   menu
   chose
}
main

5、shell 脚本中判断网站是否通

#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 1 ];then
    echo $"usage $0 url"
    exit 1
fi
while true
do
   if [ `curl -o /dev/null --connect-timeout 5 -s -w "%{http_code}" $1|egrep -w "200|301|302"|wc -l` -ne 1 ];then
        action "$1 is error." /bin/false
   else
      action "$1 is ok" /bin/true
   fi
   sleep 10
done

例子中使用到了 curl 方法。

6、99 乘法表

#!/bin/sh
COLOR='\E[47;30m'
RES='\E[0m'
for num1 in `seq 9`
do
  for num2 in `seq 9`
  do
    if [ $num1 -ge $num2 ]
       then
         if((($num1*$num2)>9))
            then
              echo -en "${COLOR}${num1}*${num2}=$((num1*num2))$RES "
            else
              echo -en "${COLOR}${num1}*${num2}=$((num1*num2))$RES  "
         fi
    fi
  done
echo " "
done

使用shell操作数据创建库
#!/bin/sh
PATH="/usr/local/mysql/bin:$PATH"
MYUSER=root
MYPASS=we_pass
SOCKET=/tmp/mysql.sock
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
for dbname in oldboy oldgirl xiaoting bingbing
do
   #不登陆数据库创建数据库的命令为mysql -uroot -pwe_pass -S /tem/mysql.sock -e "create database"
   $MYCMD -e "create database $dbname"
done

注意上面的$PATH 是个全局的环境变量。

7、使用 shell 进行 mysql 备份数据库

#!/bin/sh
PATH="/usr/local/mysql/bin:$PATH"
DBPATH=/server/backup
MYUSER=root
MYPASS=we_pass
SOCKET=/tmp/mysql.sock
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
[ ! -d "$DBPATH" ] && mkdir -p $DBPATH
for dbname in `$MYCMD -e "show databases;"|sed '1,2d'|egrep -v "mysql|schema"`
do
   echo $dbname
   $MYDUMP $dbname|gzip >$DBPATH/${dbname}_$(date +%F).sql.gz
done

注意上面中备份数据库的命令为 mysqldump -uroot -pwepass -S /tmp/mysql.sock 数据库名|gzip>/server/backup/数据库名$(date +%F).sql.gz

8、使用 shell 命令 mysql 插入数据

#!/bin/sh
PATH="/usr/local/mysql/bin:$PATH"
DBPATH=/server/backup
MYUSER=root
MYPASS=we_pass
SOCKET=/tmp/mysql.sock
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
[ ! -d "$DBPATH" ] && mkdir -p $DBPATH
for dbname in oldboy oldgirl xiaoting bingbing
do
  $MYCMD -e "use $dbname;create table  test(id int,name varchar(16));insert into test values(1,'testdata');"
done

9、使用 shell 命令 mysql 查询数据

for dbname in oldboy oldgirl xiaoting bingbing
do
  echo =========${dbname}.test============
  $MYCMD -e "use $dbname;select * from ${dbname}.test;"
done

10、使用 shell 命令 mysql 分库分表备份

#!/bin/sh
PATH="/usr/local/mysql/bin:$PATH"
DBPATH=/server/backup
MYUSER=root
MYPASS=we_pass
SOCKET=/tmp/mysql.sock
MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET"
MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET"
[ ! -d "$DBPATH" ] && mkdir -p $DBPATH
for dbname in `$MYCMD -e "show databases;"|sed '1,2d'|egrep -v "mysql|schema"`
do
   mkdir $DBPATH/${dbname}_$(date +%F) -p #<===创建对应目录
   for table in `$MYCMD -e "show tables from $dbname;"|sed '1d'` #<==遍历表名
   do
      #<==按照表进行备份
      $MYDUMP $dbname $table|gzip >$DBPATH/${dbname}_$(date +%F)/${dbname}_${table}.sql.gz
   done
done

UUID码全程是通用唯一识别码(Universally Unique Identifier,UUID),它是一个软件构建的标准,UUID 的目的是让分布式系统中的所有元素都能唯一辨别信息,而不需要通过中央控制端
来辨别信息的指定,如此以来,每个人都可以创建不与其他人冲突的 UUID。在这样的情况下,就不需要考虑数据库创建时的名称重复问题了,他让网络中任何一台计算机所生成的 UUID 码
都是互联网整个服务器网络中唯一的编码,他的原信息会加入硬件,时间,机器当前运行信息等。

11、使用 shell select 完成菜单选择。

select 和 for 还是有很大的区别的,select 会一直等待选择,主要弄来进行 shell 下菜单选择

#!/bin/bash
PS3="Please select a num from menu:"
select name in oldboy oldgirl tingting
do
   echo -e "I guess you selected the menu is:\n $REPLY) $name"
done

$PS3 用来修改每次输入时的前面提示信息
$REPLY用来获得数据的编号
这两个都是系统变量
shell 脚本中数组定义:array=([1]=one [2]=two [3]=three) 或者 array=(1 2 3)。
echo ${array[*]} 命令进行查看全部
echo ${#array[*]}命令进行查看数组长度
unset $array[1] 删除下标为 1 的数组元素

12、使用 shell 完成文件夹下文件列表

#!/bin/bash
ARR=($(ls /stone/))
for ((i=0; i<${#ARR[*]}; i++))
do
  echo "This is NO.$i,filename is${ARR[$i]}"
done

使用 shell 方法获得目标网页的请求头
curl -I -s --connect-timeout 10 http://codingstone.com|head -1|awk '{print $2}'
使用 shell 方法获得目标网页的返回状态
curl -I -s --connect-timeout 10 http://codingstone.com|head -1|cut -d " " -f 3

13、shell 脚本调试

  1. 使用 echo 方法 和 exit 方法相结合
  2. sh -[nvx] scripts.sh
    -n 不会执行脚本,仅查询脚本语法是否有问题,并给出错误提示。
    -v 在执行脚本时,先将脚本内容输出到屏幕上,然后执行脚本,如果有错误,也会给出错误提示。 输出一句代码下面执行一句代码。
    -x 将执行的脚本内容及输出显示到屏幕上,这是对调试很有帮助的。 会将空格也进行输出。
  3. 使用 set 命令进行调试。

14、脚本检查 FILE_NAME 中所列的日志文件,检查其修改时间,如果修改时间与当前的时间 小于 66S 则删除.lock 文件,确保服务再次被调度。

#!/bin/bash
checkLog(){
  FILE_NAME=('target_four' 'line_four' 'grade_four' 'activitypage_four');
  #获取文件做后修改时间戳
  for((i=0; i<${#FILE_NAME[@]};i++)) do
    LAST_MODIFY_TIMESTAMP=`stat -c %Y  ${FILE_NAME[i]}.log`;
    CUR_SEC=`date '+%s'`;
    #echo ${LAST_MODIFY_TIMESTAMP} - ${CUR_SEC} ;
    RES=`expr $CUR_SEC - $LAST_MODIFY_TIMESTAMP`;
    if [ $RES -gt 66 ]
    then
      echo ${FILE_NAME[i]}---timeout--${RES}---$(date "+%Y-%m-%d %H:%M:%S")
      file="${FILE_NAME[i]}.lock"
      rm -f ${file}
    else
      echo ${FILE_NAME[i]}---ok--${RES}---$(date "+%Y-%m-%d %H:%M:%S");
    fi
  done;
}

while :
do
  checkLog
  sleep 10
  echo "**************\r\n";
done
  1. 防火墙端口转口,将某个端口映射为另外一个端口。
#!/bin/sh

if [ "$1"x = "add"x ]; then
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8020
    iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8020
    echo "add 80 redirect 8020 done"
elif [ "$1"x = "del"x ]; then
    iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8020
    iptables -t nat -D OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8020
    echo "del 80 redirect 8020 done"
else
    echo "invaild input"
fi
关于我
loading