LINUX的bash如何给shell脚本传参数

bash命令后边可以跟任意的参数,具体要如何操作?

执行“vi test.sh”创建一个新的shell脚本。

脚本test.sh的内容如下:

#!/bin/sh
name=$1
echo "the ${name} !"

给新建的test.sh的脚本赋可执行权限,命令为“chmod 755 test.sh”。执行可以看到结果.

如果想判断参数为空则中止执行,可以

if [ "$1" = "" ]; then
        echo -e "请提供参数."
        exit 1
fi

或:

if [ $# == 0 ];then
    echo "没有带参数";
else
       echo "带了$#个参数"
fi

或:

if [ "$1" ];then
    echo "带参数";
else
    echo "没有带参数 "
fi

上面的代码其实和使用if结构的-z参数是一样的,都是用于检测字符串是符不空值。因此也可以换成使用-z参数来判断。示例代码如下 :

if [ -z "$1" ];then
    echo "没有带参数";
else
    echo "带参数"
fi

详解:

“name=$1″中$1为系统提供的位置参数,$0代表程序的名称,[$1/$2/…]从1开始为传递的参数。

linux系统除了提供位置参数还提供内置参数,内置参数如下: 

$# ----传递给程序的总的参数数目  

$? ----上一个代码或者shell程序在shell中退出的情况,如果正常退出则返回0,反之为非0值。   

$* ----传递给程序的所有参数组成的字符串。   

$n ----表示第几个参数,$1 表示第一个参数,$2 表示第二个参数 ...   $0 ----当前程序的名称   

$@----以"参数1" "参数2" ... 形式保存所有参数   

$$ ----本程序的(进程ID号)PID   

$! ----上一个命令的PID

快速创建一个可读写的Samba Server的shell脚本

把下面的内容保存成一个shell 脚本,运行完就有了一个可读写的samba server

#!/bin/bash
yum install samba samba-common samba-winbind -y
mv /etc/samba/smb.conf /etc/samba/smb.conf.backup

echo "  [global]    " > /etc/samba/smb.conf
echo "          workgroup = PXESERVER   " >> /etc/samba/smb.conf
echo "          server string = Samba Server Version %v " >> /etc/samba/smb.conf
echo "          log file = /var/log/samba/log.%m    " >> /etc/samba/smb.conf
echo "          max log size = 50   " >> /etc/samba/smb.conf
echo "          idmap config * : backend = tdb  " >> /etc/samba/smb.conf
echo "          cups options = raw  " >> /etc/samba/smb.conf
echo "          netbios name = pxe  " >> /etc/samba/smb.conf
echo "          map to guest = bad user " >> /etc/samba/smb.conf
echo "          dns proxy = no  " >> /etc/samba/smb.conf
echo "          public = yes    " >> /etc/samba/smb.conf
echo "          kernel oplocks = no " >> /etc/samba/smb.conf
echo "          nt acl support = no " >> /etc/samba/smb.conf
echo "          security = user " >> /etc/samba/smb.conf
echo "          guest account = nobody  " >> /etc/samba/smb.conf
echo "  [upload]    " >> /etc/samba/smb.conf
echo "          comment = upload    " >> /etc/samba/smb.conf
echo "          path = /home/upload " >> /etc/samba/smb.conf
echo "          read only = no  " >> /etc/samba/smb.conf
echo "          browseable = yes    " >> /etc/samba/smb.conf
echo "          public = yes    " >> /etc/samba/smb.conf
echo "          printable = no  " >> /etc/samba/smb.conf
echo "          guest ok = yes  " >> /etc/samba/smb.conf
echo "          oplocks = no    " >> /etc/samba/smb.conf
echo "          level2 oplocks = no " >> /etc/samba/smb.conf
echo "          locking = no    " >> /etc/samba/smb.conf

mkdir -p /home/upload
chmod -R 0755 /home/upload
chown -R nobody:nobody /home/upload
systemctl restart smb
systemctl enable smb

CentOS系统的监控进程状态并自动重启的shell脚本

在CentOS系统中利用Crontab监控进程是否被结束并自动重启。

附加每天凌晨4点自动重启服务器。

1、编辑Crontab

crontab -e

2、按i进行编辑

*/1 * * * * /root/monitor.sh     # 每分钟运行一遍monitor.sh脚本
0 5 * * * /sbin/reboot           # 每天凌晨5点自动重启服务器
1
2
*/1 * * * * /root/monitor.sh     # 每分钟运行一遍monitor.sh脚本
0 5 * * * /sbin/reboot           # 每天凌晨5点自动重启服务器

3、root下创建monitor.sh脚本

#! /bin/sh 

host_dir=`echo ~`                         # 当前用户根目录  
proc_name="net_speeder"                   # 进程名  
file_name="/root/log/netspeed.log"        # 日志文件 
pid=0  

proc_num()                                # 计算进程数  
{  
    num=`ps -ef | grep $proc_name | grep -v grep | wc -l`  
    return $num  
}  

proc_id()                                 # 进程号  
{  
    pid=`ps -ef | grep $proc_name | grep -v grep | awk '{print $2}'`  
}  

proc_num  
number=$?  
if [ $number -eq 0 ]                      # 判断进程是否存在  
then   
    ~/net-speeder-master/net_speeder venet0 "tcp src port 443" >/dev/null 2>&1 &                         # 重启进程的命令
    proc_id                               # 获取新进程号 
    echo ${pid}, `date` >> $host_dir$file_name    # 将新进程号和重启时间记录
fi

4、赋予脚本执行权限

chmod 777 /root/monitor.sh

5、添加log文件夹及log文件并赋予权限

mkdir 777 /root/log
touch /root/log/netspeed.log create file
chmod 646 /root/log/netspeed.log

6、重启服务器以应用更改

7、重启后有可能出现crond进程没有运行的问题,需要在rc.local增加crond随系统启动

vi /etc/rc.local

键入

nohup /etc/init.d/crond restart

利用:wq命令保存。

8、设置每次重启后清除log文件

在步骤7中键入

nohup echo '' > /root/log/netspeed.log

9、需要删除文件夹或文件

rm -rf /root/log/netspeed.log

使用Shell统计分析Nginx网站日志自动屏蔽频繁访问的IP

近来总感觉网站被恶意访问,造成宽带和服务器拖慢,于是决定研究一下之前看到关于分析 Nginx 网站日志,获取频繁访问的 IP 进行自动屏蔽的 Shell 脚本。

一、工作原理

Nginx 配置中,可以通过 allow , deny ip 来进行权限屏蔽。因此,需要创建一个 blockip.conf ,将屏蔽的 IP 保存在里面,并加载至 Nginx 配置中。例子:

allow 1.1.1.1; 
allow 1.1.1.2;
deny all;

全站屏蔽:include blockip.conf; 放到 http {} 语句块。

单站屏蔽:include blockip.conf; 放到对应网站 server{} 语句块。

二、Shell 脚本

注意:相关参数需要自行配置。脚本示例的环境配置是根据 LNMP 安装包而定。

#!/bin/bash
nginxPath=/usr/local/nginx/
wwwPath=/home/wwwlogs/
tail -n50000 $wwwPath/access.log |awk '{print $1,$12}' |grep -i -v -E "google|yahoo|baidu|msnbot|FeedSky|sogou" |awk '{print $1}'|sort|uniq -c|sort -rn |awk '{if($1>1000) print "deny "$2 ";"}' >> $nginxPath/conf/blockip.conf
sort $nginxPath/conf/blockip.conf | uniq -c |awk '{print "deny "$3}' > $nginxPath/conf/blockip.conf
/etc/init.d/nginx reload

三、定时任务

把 Shell 脚本改变权限并添加到定时计划中。

# 比如 Shell 脚本名为 blockip.sh 所在目录为 /root/ 定时任务为每天晚上11点30分执行
30 23 * * * /root/blockip.sh