shell 库

101 阅读1分钟

shell 库

  • 主要是日常用shell写脚本常用的语法

关于分割符

query_im_id()
{
id=$1
res=$(curl -s --location --request GET "x:x/x/${id}")
echo ${res}
}

OLD_IFS=$IFS
IFS='|'
for user in `cat im_user_list|awk '{print $0}'`
do
#echo ${user}
IFS=${OLD_IFS}
id=$(echo $user|awk '{print $1}')
username=$(echo $user|awk '{print $2}')
echo "get user: ${username} and id:${id} location"
query_im_id ${id}

done


[root@xxx7 sh]# cat im_user_list 
oa13927xxx username|


关于数组

#!/bin/sh
# auth: gaohengda
checkExistdbname(){
grep -i "alter.*table" 11.sql|awk -F' ' '{print $3}'|grep '\.'|| echo 'alter table not dbname'
}


declare -A missingDbName=(["alter"]="alter.*table" ["delete"]="delete" ["insert"]="insert.*into" ["update"]="update" ["create"]="create.*table")
declare -A reminder=(["alter"]="alter" ["delete"]="delete" ["insert"]="insert into" ["update"]="update" ["create"]="create table" ["drop"]="drop database" ["procedure"]="create procedure")
declare -A illegalsql=(["drop"]="drop.*database" ["procedure"]="create.*procedure")
declare -A missingDbNameCol=(["alter"]=3 ["delete"]=3 ["insert"]=3 ["update"]=2 ["create"]=3)


dir=$1


for file in `ls $dir/*.sql`
do
  echo "start check dbname of sqlfile ${file}:"
  for key in ${!missingDbName[@]}
  do
 #    echo "${key} = ${missingDbName[$key]}"
      grep  -i "\<${missingDbName[$key]}\>" ${file}|awk -v col=${missingDbNameCol[$key]} -F' ' '{print $col}'|grep -v '\.' && echo "It was missing DB NAME in :${reminder[$key]} sql on sql file:${file}"
  done
done

for file in `ls $dir/*.sql`
do
  echo "start check illegal sql of sqlfile ${file}:"
  for key in ${!illegalsql[@]}
  do
#     echo "${key} = ${illegalsql[$key]}"
     grep -i "\<${illegalsql[$key]}\>" ${file} && echo "It was cotainer illegal sql: ${reminder[$key]} on sql file:${file}"
  done
done

关于post的引号

post_data(){
#curl -H "Content-Type: application/json" -X POST -d '{"user_id":"123","coin":100}'
  vpost_url=$1
  vservice=$2
  vnamespace=$3
  vbadpod=$4
  vstatus=$5
if [ ! -z "${vpost_url}" -a ! -z "${vservice}" -a ! -z "${vnamespace}" -a ! -z "${vbadpod}" -a ! -z "${vstatus}" ];then
  for pervbadpod in ${vbadpod}
  do
    curl -H "Content-Type: application/json" -X POST -d '{"service":"'"${vservice}"'","namespace":"'"${vnamespace}"'","badpod":"'"${pervbadpod}"'","status":"'"${vstatus}"'"}' ${vpost_url} -H ${verify_key}
    current_time=$(/bin/date '+%F %T')
    echo  "Time:${current_time},"service":"${vservice}","namespace":"${vnamespace}","badpod":"${vbadpod}","status":"${vstatus}""|tee -a $log
  done
else
   echo "miss the parameter"
fi

}

关于awk 过滤条件

get_bad_pod(){
echo 'get bad podname:'
bad_podname=$(kubectl get pod -n ${namespace}|grep -v 'READY'|awk -v servicename=${service} '{split($2,a,"/");if($1~ servicename"-[A-Za-z0-9]*-[A-Za-z0-9]*$" && a[1]!=a[2]||$3 !~/Running/) print $1}')
#bad_podname=$(kubectl get pod -n ${namespace}|awk -v servicename=${service} '{if($1~ servicename"-[A-Za-z0-9]*-[A-Za-z0-9]*$" && $3 !~/Running/) {print $1}}')
}
 

关于echo 颜色显示

cecho(){
str="$1"
echo -e "\033[31m ${str}\033[0m" 
}

关于数值运算

none200=$(cat xx_check_117.log |grep 2021-11-$d|awk -F '|' '{print $1" "$4}'|grep -v '200 OK'|grep "2021-11-$dT"|wc -l)
total=$(cat xx_check_117.log |grep 2021-11-$d|wc -l)
rait=$(echo "scale=5;${none200} / ${total}"|bc)

关于时间

current_time=$(/bin/date '+%Y%m%d%H%M%S')

关于 exec,source ./xx.sh 是否fork

#!/bin/sh
echo $$
echo 'i am main process'
echo mypid is :$$

echo 'run sub process by  shell'
/root/t1.sh shell

echo 'run sub process by source'

. /root/t1.sh source

echo 'run sub process by exec'
exec /root/t1.sh exec

关于函数返回值和函数体的echo输出

function check(){
n=$1
if [ ! -z "${n}" -a ${n} -gt 10 ];then
echo "enter 100"
return 100
else
echo 'enter less than 10'
return 200
fi
}

check 15
res=$?
echo ${res}

r2=$(check 8)
#check 8
res=$?
echo ${res}


几个点
1、函数返回值只靠执行完函数$?来获取
2、函数返回值只能是数值型
3、函数返回如果有赋值给变量,则echo输出被屏蔽

比如,如上输出结果为:
[root@xx_6_78 ~]# ./shell_return.sh 
enter 100
100
200


因为调用r2=$(check 8),所以没有输出enter less than 10