Shell 编程基础,实战:编写curl小工具,发送post请求,合并数据库两张表

  • 脚本的执行方式
  1. bash hello.sh
  2. sh hello.sh
  3. ./hello.sh 必须有可执行权限 chmod +x hello.sh
  4. source hello.sh
  • 声明变量
name=hello //=两边不能有空格
echo $name //或 echo ${name}

数据类型

字符串

字符串的声明可以使用 单引号或双引号,或不使用引号,例如:
name="cheng"
name='cheng'
name=cheng
full_name="jack $name" //这里一定要使用双引号,否则$name无法识别为变量
full_name='jack '$name'' //这样也是可以的,建议使用上面的
# 使用
echo $name
-- 输出字符串的长度使用#
echo ${
    
    #full_name}

-- 截取字符串长度
echo ${full_name:2:6}  -->ck che

数组

arr=('hello' 'world')  、、中间要以空格隔开
echo ${arr[0]} --hello
echo ${arr[@]} --hello world 取出所有的元素
echo ${
    
    #arr[@]} --2 数组长度2

运算符

a=10
b=20
方式一:
echo `expr $a + $b` --30
方式二:
echo $(($a + $b)) --30
方式三:
echo $[a + b] --30

加减乘除取余(+-*/%)使用上述三种方式均可,注意中间运算符两边必须要有空格

逻辑比较

运算符 说明 语法
== 比较两个数是否相等 [$a == $b] ,相等返回true
!= 比较两个数是否不相等 [$a != $b] ,不等返回true
-eq 比较两个数字是否相等 [$a -eq $b] ,相等返回true
-ne 比较两个数字是否不相等 [$a -ne $b] ,不相等返回true
-gt 比较两个数字大小,数学符号:> [$a -gt $b] ,a大于b等返回true
-lt 比较两个数字大小,数学符号:< [$a -lt $b] ,a小于b等返回true
-ge 比较两个数字大于等于,数学符号:>= [$a -gt $b] ,a大于等于b等返回true
-le 比较两个数字大于等于,数学符号:<= [$a -lt $b] ,a小于等于b等返回true
-o 或|| 或运算,相当于OR 比较两个两表达式是否相等 [$a -lt $b -o 100 < 200 ] ,有一个表达式满足返回true
-a 或&& 且运算,相等于and [$a -lt $b -a 100 < 200 ] ,两个表达式都满足返回true

字符串比较

[ $name ] --不为空返回true
[ -z $name ] --字符串长度为0,返回true
[ -n $name ] --字符串长度不为0,返回true
[ $name ] --不为空返回true
[ $a = $b ] --两个字符串是否相等,相等返回true

例如:

#/bin/bash
a=10
b=10
if [ $a = $b ]
then
   echo 'a等于b'
fi

#############
c=1
d=2
if [ $c -lt $d ]
then
   echo 'c小于d'
fi


文件判断

  • -r :可读
  • -w :可写
  • -x :可执行
  • -f : 是普通文件
  • -d : 是文件目录
  • -s :文件不为空
  • -e:文件存在
    例如:
file=/usr/local/hello.sh
if [ -r $file ]
then 
	echo '文件可读'
fi

常见语法(if,case,while,函数)

if

if [ ]
then
	#do something 
else
   #do something 
if

case

#/bin/bash
echo '请输入一个数字'
read num
case $num in
   1) echo '您输入了一个1'
   ;;
  2) echo '您输入了一个2'
   ;;
   *) echo '您输入的非1,非2的数字='$num''
esac

while

#/bin/bash
int=0
while(($int <= 10))
do
 echo "数字int=$int"
 let "int++" #let 不需要加$
done

//死循环
while true
do
   do something
done


# while 与if结合使用,获取用户有效输入
echo '请输入url'
while true
do

read -e url
if [ $url ]
    then
        break
    else
        echo 'url输入有误,请重新输入'
fi
done

function

#/bin/bash

function addfun(){
    
    
   echo '请输入第一额数'
   read a
   echo '请输入第二个数字'
   read b
   return $(($a + $b))
}

addfun #调用函数
echo "两个数字之和是:$?" # 函数的返回值可以通过$?获取

实战:编写一个curl工具类,用于测试post,发送json参数请求

实现功能:

  1. 可以输入请求参数
  2. 可以输入请求地址
  3. 执行后记录到日志文件
#!/bin/bash

# curl 工具类,实现post请求
cmd=$1
date=`date +'%F %H:%M:%S.%N'`

log_dir=log
log_file=$log_dir/curl-`date +%F`.log


echo '请输入请求参数request body'
read -e  req_param

# read -e :可以退格
echo '请输入url'
while true
do

read -e url
if [ $url ] 
    then
	break
    else 
        echo 'url输入有误,请重新输入'
fi
done

echo "正在请求url:$url ..."

result=
if [ $cmd == 'GET' ] 
then
   result=`curl -X GET  "${req_param}" $url `
else
   result=`curl -X POST -d '${req_param}' $url`
   cmd='POST'
fi
echo $result

# 判断文件是否存在,不存在创建
if [ ! -e $log_dir ]
then 
   mkdir -p $log_dir
fi

echo $log_file
echo "$date request-type:$cmd,  request-body:$req_param request-url:$url , result:$result" >> $log_file

测试

chmod +x curl.sh
./curl.sh GET

实战二:

写一个shell脚本实现不同的数据库的两张表每天汇总到一张表中

#!/bin/bash

#编写复制数据库脚本

username=root
password=root
host=192.168.1.13

delete_sql="truncate table new.user_new;"

springmvc_user_sql="insert into new.user_new(id,
  name,
  age,
  sex,
  parent_name,
  parent_id
)
select * from springmvc.user;"

new_user_sql="
insert into new.user_new(
  id,
  name,
  age,
  sex,
  parent_name,
  parent_id
)
select * from new.user;"

mysql -u$username -p$password -h$host -e "$delete_sql";

echo '清除原数据成功'

mysql -u$username -p$password -h$host -e "${springmvc_user_sql}";


echo '导入数据spring_mvc.user完成'


mysql -u$username -p$password -h$host -e "$new_user_sql";

echo '导入数据new.user 完成'


exit

猜你喜欢

转载自blog.csdn.net/weixin_48470176/article/details/120397858