shell脚本的研究笔记(变量定义、变量种类、变量操作)

《shell脚本的研究笔记(变量定义、变量种类、变量操作)》

通过等号(=)为变量分配值,等号两边不能有空格

# file = "/root/01.txt"  //错误
# file="/root/01.txt"  //正确

在对变量赋于字符串值时,建议使用引号将其包裹。如果字符串中存在空格,请一定要使用单引号或双引号将整个内容包裹。注意:单引号里的内容原封不动的输出,双引号里有变量的调用则会调用变量

# Var1="$Var"
# Var1='Var is empty'
# Var1="Var is empty $array"

如果需要增加变量的值,那么可以进行变量值的叠加。不够变量需要用双引号包含”$变量名”或${变量名}

# echo ${VAR1}db.log
# echo "$VAR1"db.log
# echo $VAR1db.log    //如果直接写有可能会输出错误内容
《shell脚本的研究笔记(变量定义、变量种类、变量操作)》

写入多行文字到某文件

echo "aaa" >> /home/kevingo/example.txt 

cat>/lib/systemd/system/nginx.service<<EOF
....
EOF

多行注释详解

<<EOF
.....
EOF

对shell命令结果进行行数统计

wc -l
grep -c
# cat xxx.txt | wc -l
# netstat  -tupln  |grep 9501 |wc -l
# ps aux |grep 'sersync2'|grep -v 'grep'|wc -l

截取pid

# nslookup ns.time50.com 8.8.8.8 | tail -2 | head -1
# cut -f 2,4 student.txt
free -h | head -2 | tail -1 | awk '{printf $4}' | grep 'M'
tail -2 //截取最后2行
head -1 //截取最前2行

cut [选项] 文件名
-f 列号:提取第几列
d 分隔符:按照指定分隔符分割列
awk 一次读入一整行,默认以tab键或者空格为分隔符将一行分为多个字段,表示为$1、$2、$3...其中$0表示文件名

//pid
pid=$(netstat -anp|grep 3306|awk '{printf $7}'|cut -d/ -f1)

pid=$(echo "$p_command_str" | awk '{printf $2}'|cut -d/ -f1)

//获取文件大小
file_size=`du -sh ${cache_file} |awk '{print $1}' | cut -f 1 -d "G"`

//awk例子用法
# netstat -anp|grep 3306|awk '{printf $7}'
23693/php-fpm:17418/php-fpm:23696/php-fpm:23738/php-fpm:17465/php-fpm:17464/php-fpm:17419/php-fpm:17463/php-fpm:6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld6389/mysqld

#字符串截取
${string:position:length}
status=123.456.789M
# echo "${status:0:-1}"
//123.456.789

判断句

//中括号两则必要有空格
[ "$A" = "$B"  ]        	         ##如果相等,字符串比较,等号之间必须有空格
[ "$A"="$B"  ]        	         ##如果相等,数字比较,等号之间不能有空格
[ "$A" -eq "$B" ]      	                 ##如果相等,数字比较,等号之间不能有空格
[ "$A" == "$B" ]        	         ##如果相等,字符比较
[ "$A" != "$B" ]        	         ##如果不相等
[ "$A" -ne "$B" ]       	         ##如果不相等
[ "$A" -le "$B" ]       	         ##如果小于等于
[ "$A" -lt "$B" ]                        ##如果小于
[ "$A" -ge "$B " ]                       ##如果大于等于 数字比较(整数),
[ "$A" -gt "$B" ]                        ##如果大于 数字比较(整数),
[ "$A" -ne "$B" -a "$A" -gt "$B" ]       ##A 不等于 B 并且 A 大于B
[ "$A" -ne "$B" -o "$A" -gt "$B" ]       ##A不等于B 或者  A大于B
[ -z "$A" ]                              ##如果为空
[ -n "$A" ]                              ##如果不为空

if [ ! -d "/data/" ];then      #如果文件夹不存在
if [ ! -f "/data" ];then      #如果文件不存在

//或比较
if [[ `is_not_ipaddr $ip` -eq 1 || `is_not_ipaddr $dns_ip` -eq 1 ]];then
    echo "获取IP地址失败!"
fi

小数比较

小数的判断方法,博主试了网上很多的方法,他们都是无脑抄的吗? 说什么awk, expr 的人都是垃圾,这些方法都是有bug的!!只能比较第一位数字,坑爹!! ,压根就没有测试过 , 亲测只有下面的方法有效:

#!/bin/bash
#检查某个文件夹的大小,如果超过指定大小则清空
cache_file=/www/cache
file_size=`du -sh ${cache_file} |awk '{print $1}' | cut -f 1 -d "G"`
#echo ${file_size} ;
maxsize=30 
if [ $(echo "$file_size < $maxsize"|bc) -eq 1 ]; then
    echo "$file_size 小于 $maxsize"
else
    echo "$file_size 大于 $maxsize"
fi



#设置默认内存大小,如果小于这个3G内存,则清缓存
max_size_g=4
size_g=$(free -h | head -2 | tail -1 | awk '{printf $4}' | grep 'G')
if [ -n "$size_g" ];then
  memory_size="${size_g:0:-1}"
  if [ $(echo "$memory_size < $max_size_g"|bc) -eq 1 ]; then
    echo "内存大小: $memory_size 小于 $max_size_g , 准备进行清理..."
    sync; echo 3 > /proc/sys/vm/drop_caches
    echo "清理后的内存大小为: $(free -h | head -2 | tail -1 | awk '{printf $4}') "
  else
    echo "$memory_size G大于 $max_size_g G"
  fi
fi
点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注