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 脚本调试
- 使用 echo 方法 和 exit 方法相结合
- sh -[nvx] scripts.sh
-n
不会执行脚本,仅查询脚本语法是否有问题,并给出错误提示。
-v
在执行脚本时,先将脚本内容输出到屏幕上,然后执行脚本,如果有错误,也会给出错误提示。 输出一句代码下面执行一句代码。
-x
将执行的脚本内容及输出显示到屏幕上,这是对调试很有帮助的。 会将空格也进行输出。 - 使用 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
- 防火墙端口转口,将某个端口映射为另外一个端口。
#!/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