`

几个例子掌握shell脚本

阅读更多

    传说一个俄罗斯程序员写了一堆脚本,会给老婆发加班短信、会在宿醉不醒时给自己请假、会自动根据邮件恢复客户的数据库、还可以一键远程煮咖啡,好神奇的样子(虽然我到现在也不知道哪里能买到能联网的咖啡机)。

    程序最大的意义就是代替人们做重复的工作。

    在我们日常的运维工作中,常常敲一些重复的命令,比如我们在调试程序时,每次都要重启应用,每次都要敲一堆重复命令,敲一次两次还可以,但是当到敲十几次、几十次就要抓狂了,这个时候一个脚本就很有必要了。再比如我们在服务器上部署一个java程序,由于内存溢出或内存泄漏等原因程序可能挂掉,所以我们就需要一个检查进程的脚本了,并且通过定时任务实现进程监控。

    下面我将列几个我之前写过的脚本:

  1. 应用启停脚本
    #!/bin/bash
    
    stopuwsgi()
    {
        echo "关闭uwsgi..."
        for pid in `ps -aux|grep uwsgi|grep ini|grep -v grep|awk '{print $2}'` ; do
            kill -9 ${pid}
        done
        sleep 3
        echo "已关闭!"
    }
    startuwsgi()
    {
        if [ `ps -aux|grep uwsgi|grep ini|grep -v grep|wc -l` -ne 0 ]; then
            echo 'ERR!进程已存在,未开启!'
            return
        fi
        echo '开启uwsgi...'
        cd /app/ds_website
        uwsgi --ini uwsgi.ini
        sleep 3
        echo "uwsgi进程数:`ps -aux|grep uwsgi|grep ini|grep -v grep|wc -l`"
        echo '已开启!'
    }
    restartuwsgi()
    {
        stopuwsgi
        startuwsgi
        echo '已重启!'
    }
    
    menu()
    {
        while [ "1" ]
        do
            clear
            echo "功能菜单:"
            echo "1、重启uwsgi"
            echo "2、启动uwsgi"
            echo "3、停止uwsgi"
            echo "0、退出"
            echo "select==>>"
            tput cup 5 10
            read choice
            case ${choice} in
            0) break;;
            1) echo "重启uwsgi(y/n)"
                read key
                if [ ${key} = 'y' -o ${key} = 'Y' ]; then
                    restartuwsgi
                fi
                echo '按任意键继续...'
                read key
                continue;;
            2) echo "启动uwsgi(y/n)"
                read key
                if [ ${key} = 'y' -o ${key} = 'Y' ]; then
                    startuwsgi
                fi
                echo '按任意键继续...'
                read key
                continue;;
            3) echo "停止uwsgi(y/n)"
                read key
                if [ ${key} = 'y' -o ${key} = 'Y' ]; then
                    stopuwsgi
                fi
                echo '按任意键继续...'
                read key
                continue;;
            esac
        done
    }
    
    if [ $1 = 'start' ]; then
        startuwsgi
    elif [ $1 = 'restart' ]; then
        restartuwsgi
    elif [ $1 = 'stop' ]; then
        stopuwsgi
    else
        menu
    fi
    
     说明:该脚本用于启停python Django 程序容器:uwsgi,由于uwsgi启动后会开启8个进程,如果手动重启需要ps找出所有进程的pid,然后逐个kill掉,然后再开启uwsgi,在调试程序时经常要启停应用,如果每次都逐一kill进程,简直是痛苦的一匹。

    该脚本支持菜单和参数两种方式使用,涉及常见的进程操作、菜单的实现、参数的实现,大家可以在写脚本时用作参考。

  2. 应用部署以及启停脚本
    #!/bin/bash
    
    setup(){
    	echo "部署spider"
    	cd /app
    	echo "删除原代码..."
    	rm -rf spider
    	echo "当前工作目录:`pwd`"
    	echo "开始clone项目..."
    	git clone https://gitee.com/dushen666/spider.git
    	cd spider
    	echo "当前工作目录:`pwd`"
    	echo "修改配置文件..."
    	sed -i "s/self.conn = MySQLdb.connect.*/self.conn = MySQLdb.connect(host='localhost', port=3306, user='root', passwd='pawd123--', db='movie-website1', charset='utf8')/" /app/spider/spider/pipelines.py
    	echo '应用部署完毕!'
    }
    
    startup(){
    	echo "开启spider"
    	cd ~/spider
    	nohup python /app/spider/quickstart.py &
    	echo "spider已开启,5秒后打开日志"
    	sleep 5
    	tail -f /app/spider/nohup.out
    }
    
    sstop(){
    	echo "结束spider"
    	if [ `ps -aux|grep python|grep quickstart|grep -v grep|wc -l` -eq '0' ]; then
    		echo "spider进程不存在,无需停止!"
    		return
    	fi
    	for pid in `ps -aux|grep python|grep quickstart|grep -v grep|awk '{print $2}'`;do
    		kill -9 $pid
    		echo "已杀死进程$pid"
    	done
    	if [ `ps -aux|grep tomcat|grep -v grep|wc -l` -eq '0' ]; then
    		echo "OK!成功停止服务!"
    		return
    	fi
    	echo "ERR!停止服务异常,需手动停止!"
    }
    
    ttest(){
    	if [ `ps -aux|grep python|grep quickstart|grep -v grep|wc -l` -eq '0' ]; then
    		echo "spider进程不存在,自动开启!"
    		cd ~/spider
    		nohup python /app/spider/quickstart.py &
    		echo "已开启spider"
    	fi
    }
    
    case $1 in
    	'setup' ) 
    		setup;;
    	'start' )
    		startup;;
    	'stop' )
    		sstop;;
    	'test' )
    		ttest;;
    	* )
    		echo "Usage:`basename $0` [options] filename";;
    esac
    
    
     说明:如何将开发好的代码快速部署到服务器上,最常见的部署代码方式就是将程序编译好的增量包FTP放到服务器上,然后解压覆盖,再重启服务。本脚本利用github实现了程序的快速部署,大致流程是这样:删掉服务器上原有的代码->使用git clone将github上的代码克隆到本地->修改配置文件->重启服务。本脚本只适合使用github或码云管理的项目,在想要发布程序时,只需要执行一下脚本,所有的事情就自动做了。

    该脚本涉及sed修改配置文件、git clone等知识,可用作参考。

  3. 应用巡检以及启停脚本
    #! /bin/bash
    
    ##################################################################
    ##			作者:	杜神				##
    ##			日期:	2018-01-19			##
    ##			功能:	DS管理工具集			##
    ##			version:	1.0			##
    ##################################################################
    
    
    APP_PORT1=8080
    APP_PORT2=8443
    REDIS_PORT1=6666
    REDIS_PASSWD='pawd123--'
    LOG_NAME=`date +%Y%m%d`.log
    LOG_PATH=/app/logs/script/
    TOMCAT_HOME=~/environment/tomcat8
    MAILS=/app/conf/mail.lst
    FLAG=/app/conf/err
    
    set -i
    source ~/.bashrc
    #应用服务状态检测
    app_check()
    {
    	echo "应用服务状态检测……"|tee -a $LOG_PATH$LOG_NAME
    	state='0' #0正常	1异常
    	if [ `ps -aux|grep tomcat|grep -v grep|wc -l` -eq '1' ]; then
    		echo "tomcat进程正常"|tee -a $LOG_PATH$LOG_NAME
    	else
    		echo "tomcat进程异常"|tee -a $LOG_PATH$LOG_NAME
    		state='1'
    	fi
    	
    	if [ `netstat -an|grep 0.0.0.0:$APP_PORT1|grep LISTEN|wc -l` -eq '1' ]; then
    		echo "端口$APP_PORT1状态正常"|tee -a $LOG_PATH$LOG_NAME
    	else
    		echo "端口$APP_PORT1异常"|tee -a $LOG_PATH$LOG_NAME
    		state='1'
    	fi
    
    	if [ `netstat -an|grep 0.0.0.0:$APP_PORT2|grep LISTEN|wc -l` -eq '1' ]; then
    		echo "端口$APP_PORT2状态正常"|tee -a $LOG_PATH$LOG_NAME
    	else
    		echo "端口$APP_PORT2异常"|tee -a $LOG_PATH$LOG_NAME
    		state='1'
    	fi
    	
    	if [ $state -eq '0' ]; then
    		echo "OK!应用服务状态检测正常"|tee -a $LOG_PATH$LOG_NAME
    	else
    		echo "ERR!应用服务状态存在异常"|tee -a $LOG_PATH$LOG_NAME
    	fi
    	
    	return $state
    }
    
    #环境检查
    environment_check()
    {
    	echo "环境检查……"|tee -a $LOG_PATH$LOG_NAME
    	state='0' #0正常	1异常
    	echo "检查redis状态……"|tee -a $LOG_PATH$LOG_NAME
    	echo "1. redis进程"|tee -a $LOG_PATH$LOG_NAME
    	if [ `ps -aux|grep redis|grep -v grep|wc -l` -ne '0' ]; then
    		echo "redis进程存在`ps -aux|grep redis|grep -v grep|wc -l`个:"|tee -a $LOG_PATH$LOG_NAME
    		echo `ps -aux|grep redis|grep -v grep`|tee -a $LOG_PATH$LOG_NAME
    	else 
    		echo "redis进程异常"|tee -a $LOG_PATH$LOG_NAME
    		state='1'
    	fi
    	echo "2. redis端口"|tee -a $LOG_PATH$LOG_NAME
    	if [ `netstat -an| grep $REDIS_PORT1|grep LISTEN|wc -l` -ne '0' ]; then
    		echo "redis端口存在`netstat -an| grep $REDIS_PORT1|grep LISTEN|wc -l`个:"|tee -a $LOG_PATH$LOG_NAME
    		echo `netstat -an| grep $REDIS_PORT1|grep LISTEN`|tee -a $LOG_PATH$LOG_NAME
    		echo "连接数:`netstat -an| grep $REDIS_PORT1|grep ESTABLISHED|wc -l`"|tee -a $LOG_PATH$LOG_NAME
    	else 
    		echo "redis端口异常"|tee -a $LOG_PATH$LOG_NAME
    		state='1'
    	fi
    	echo "3. redis测试"|tee -a $LOG_PATH$LOG_NAME
    	
    	if [ `/servers/redis-2.8.19/src/redis-cli  -p $REDIS_PORT1 -a $REDIS_PASSWD "ping"` = "PONG" ]; then
    		echo "redis测试正常"|tee -a $LOG_PATH$LOG_NAME
    	else
    		echo "redis测试异常"|tee -a $LOG_PATH$LOG_NAME
    		state='1'
    	fi
     
    	echo "java版本:"|tee -a $LOG_PATH$LOG_NAME
    	echo "`java -version`"|tee -a $LOG_PATH$LOG_NAME
    	echo "tomcat版本:"|tee -a $LOG_PATH$LOG_NAME
    	echo "`$TOMCAT_HOME/bin/version.sh`" | grep -v "Using"|tee -a $LOG_PATH$LOG_NAME
     
    	if [ $state -eq '0' ]; then
    		echo "OK!环境检查正常"|tee -a $LOG_PATH$LOG_NAME
    	else
    		echo "ERR!环境检查存在异常"|tee -a $LOG_PATH$LOG_NAME
    	fi
    	
    	return $state
    }
    
    #健康检查
    health_check()
    {
    	echo "健康检查……"|tee -a $LOG_PATH$LOG_NAME
    	environment_check
    	a=$?
    	app_check
    	b=$?
    	if [ $a -eq "0" -a $b -eq "0" ]; then
    		echo "OK!健康检查正常"|tee -a $LOG_PATH$LOG_NAME
    		return '0'
    	fi
    	echo "ERR!健康检查存在异常"|tee -a $LOG_PATH$LOG_NAME
    	return '1'
    }
    
    #启动服务
    app_start()
    {
    	echo "启动服务……"|tee -a $LOG_PATH$LOG_NAME
    	echo "检查当前登录用户……"|tee -a $LOG_PATH$LOG_NAME
    	if [ `whoami` != "app" ]; then
    		echo "ERR!当前登录用户为'`whoami`',请使用应用管理员用户登录!"|tee -a $LOG_PATH$LOG_NAME
    		return
    	fi
    	echo "当前用户:`whoami`"|tee -a $LOG_PATH$LOG_NAME
            if [ `ps -aux|grep tomcat|grep -v grep|wc -l` -ne '0' ]; then
                    echo "ERR!tomcat进程已存在,未启动服务!"|tee -a $LOG_PATH$LOG_NAME
    	return
            fi 
    	environment_check
    	a=$?
    	if [ $a -eq '1' ]; then
    		echo "ERR!环境检查不通过,未启动服务!"|tee -a $LOG_PATH$LOG_NAME
    		return
    	fi
    	echo "打开tomcat……"|tee -a $LOG_PATH$LOG_NAME
    	echo `$TOMCAT_HOME/bin/startup.sh`|tee -a $LOG_PATH$LOG_NAME
    	echo "OK!服务已启动"|tee -a $LOG_PATH$LOG_NAME
    	echo "tomcat 启动完成,是否打开日志(y/n)?"
    	read key
    	if [ $key = "y" -o $key = "Y" ]; then
    		echo "打开日志……"|tee -a $LOG_PATH$LOG_NAME
    		tail -f $TOMCAT_HOME/logs/catalina.out
    	fi
    
    }
    
    #停止服务
    app_stop()
    {
    	echo "停止服务……"
    	if [ `ps -aux|grep tomcat|grep -v grep|wc -l` -eq '0' ]; then
    		echo "tomcat进程不存在,无需停止!"|tee -a $LOG_PATH$LOG_NAME
    		return
    	fi
    #	echo `$TOMCAT_HOME/bin/shutdown.sh`|tee -a $LOG_PATH$LOG_NAME
    #	sleep 8
    #	if [ `ps -aux|grep tomcat|grep -v grep|wc -l` -eq '0' ]; then
    #		echo "成功停止服务!"|tee -a $LOG_PATH$LOG_NAME
    #		return
    #	fi
    	for pid in `ps -aux|grep tomcat|grep -v grep|awk '{print $2}'`;do
    		kill -9 $pid
    		echo "已杀死进程$pid"|tee -a $LOG_PATH$LOG_NAME
    	done
    	if [ `ps -aux|grep tomcat|grep -v grep|wc -l` -eq '0' ]; then
    		echo "OK!成功停止服务!"|tee -a $LOG_PATH$LOG_NAME
    		return
    	fi
    	echo "ERR!停止服务异常,需手动停止!"|tee -a $LOG_PATH$LOG_NAME
    }
    
    #主菜单
    menu()  
    {       
    	while [ "1" ]
    	do      
    		clear
    		echo "功能菜单:"
    		echo "1. 健康检查"
    		echo "2. 应用服务状态检测"
    		echo "3. 环境检测"
    		echo "4. 启动服务"
    		echo "5. 停止服务"
    		echo "0. 退出"
    		echo "select==>>"
    		tput cup 7 10
    		tput cnorm 
    		read choice
    		case $choice in
    		0) clear
    			break;;
    		1) echo "开始健康检查(y/n)?"
    			read key
    			if [ $key = "y" -o $key = "Y" ]; then
    				echo "+++++++++++++++++++++++++++健康检查-time:`date '+%Y-%m-%d %H:%M:%S'`+++++++++++++++++++++++++++"|tee -a $LOG_PATH$LOG_NAME
    				health_check
    			fi
    			echo "按任意键继续……"
    			read key
    			continue;;
    		2) echo "开始应用服务状态检测(y/n)?"
    			read key
    			if [ $key = "y" -o $key = "Y" ]; then
    				echo "+++++++++++++++++++++++应用服务状态检测-time:`date '+%Y-%m-%d %H:%M:%S'`+++++++++++++++++++++++"|tee -a $LOG_PATH$LOG_NAME
    				app_check
    			fi
    			echo "按任意键继续……"
    			read key
    			continue;;
    		3) echo "开始环境检测(y/n)?"
    			read key
    			if [ $key = "y" -o $key = "Y" ]; then
    				echo "+++++++++++++++++++++++++++环境检测-time:`date '+%Y-%m-%d %H:%M:%S'`+++++++++++++++++++++++++++"|tee -a $LOG_PATH$LOG_NAME
    				environment_check
    			fi
    			echo "按任意键继续……"
    			read key
    			continue;;
    		4) echo "启动服务(y/n)?"
    			read key
    			if [ $key = "y" -o $key = "Y" ]; then
    				echo "+++++++++++++++++++++++++++启动服务-time:`date '+%Y-%m-%d %H:%M:%S'`+++++++++++++++++++++++++++"|tee -a $LOG_PATH$LOG_NAME
    				app_start
    			fi
    			echo "按任意键继续……"
    			read key
    			continue;;
    		5) echo "停止服务(y/n)?"
    			read key
    			if [ $key = "y" -o $key = "Y" ]; then
    				echo "+++++++++++++++++++++++++++停止服务-time:`date '+%Y-%m-%d %H:%M:%S'`+++++++++++++++++++++++++++"|tee -a $LOG_PATH$LOG_NAME
    				app_stop
    			fi
    			echo "按任意键继续……"
    			read key
    			continue;;
    		esac    
    	done    
    }       
    
    while getopts 'dm' opt;
    do
    	case $opt in
    		d ) 
    			echo "日常周期巡检------>>>>-time:`date '+%Y-%m-%d %H:%M:%S'`"|tee -a $LOG_PATH$LOG_NAME
    			health_check >/app/tmp/daily.log
    			k=$?
    			if [ $k -eq '1' -a ! -f $FLAG ]; then
    				touch $FLAG
    				echo -e '\n\n\n' >> /app/tmp/daily.log
    				ps -aux|awk '{if($3>20) print $1,$2,$3,$4,$9,$10,$11}' >> /app/tmp/daily.log
    				echo -e '\n\n\n' >> /app/tmp/daily.log
    				tail -n 20 $TOMCAT_HOME/logs/catalina.out >> /app/tmp/daily.log
    				for mail in `cat $MAILS` ;do
    					mail -s "DS服务器周期巡检报告 `date '+%Y-%m-%d %H:%M:%S'`" "$mail" < /app/tmp/daily.log
    					echo "已发送通知邮件:$mail"|tee -a $LOG_PATH$LOG_NAME
    				done
    				app_start
    			fi
    			echo "OK!日常周期巡检完成------>>>>-time:`date '+%Y-%m-%d %H:%M:%S'`"|tee -a $LOG_PATH$LOG_NAME;;
    		m )
    			menu;;
    		* )
    			echo "Usage:`basename $0` [options] filename";;
    	esac
    done
    
    
     说明:该脚本是我为一个java程序写的综合脚本。包含应用的启停,配置crontab定时任务后可实现进程、端口等的巡检,并实现邮件告警并生成巡检日志。

    该脚本涉及options的实现(类似:ps -ef中的-ef)、记录日志、发送邮件、端口和进程的检测,可作为参考。

  4. 应用部署脚本
    #!/bin/sh
    
    
    cd /app
    echo "删除原代码..."
    rm -rf ds_website
    echo "当前工作目录:`pwd`"
    rm -rf Video-website
    echo "开始clone项目..."
    git clone https://gitee.com/dushen666/Video-website.git
    echo "拷贝覆盖项目..."
    cp -Rf Video-website ds_website
    cd ds_website
    echo "当前工作目录:`pwd`"
    echo "修改配置文件..."
    sed -i 's/^ALLOWED_HOSTS.*/ALLOWED_HOSTS = ["111.89.11.51","www.dushen6.cn",]/g' ./ds_website/settings.py
    sed -i 's/^DEBUG.*/DEBUG = False/g' ./ds_website/settings.py
    sed -i 's/^configfile.*/configfile = "\/app\/ds_website\/conf\/global.conf"/g' ./ds_website/settings.py
    
    sed -i 's/configfile = .*/configfile = "\/app\/ds_website\/conf\/global.conf"/' ./website1/cloudfiles/downloader.py
    
    sed -i 's/^PASSWORD.*/PASSWORD:pawd123--/g' ./conf/global.conf
    sed -i 's/^NAME.*/NAME:movie-website1/g' ./conf/global.conf
    
    echo "修改表结构..."
    python manage.py migrate   # 创建表结构
    
    sh /app/sbin/website1.sh restart
    
    echo '应用部署完毕!'
     说明:该脚本与(2)类似,同样是使用git clone克隆脚本到本地,使用sed修改配置文件,之后使用了Django自带的manage.py修改了表结构,最后调用了(1)脚本重启应用。
0
0
分享到:
评论

相关推荐

    Shell脚本编程以及几个Shell脚本例子

    接下来,我们来看几个Shell脚本的例子: 1. **欢迎消息脚本**:这个脚本会在用户登录时显示一个欢迎消息。 ```bash #!/bin/bash echo "欢迎,$(whoami)!今天是$(date)。" ``` 这个脚本使用`whoami`命令获取...

    一个批量域名解析的Shell脚本例子

    标题中的“一个批量域名解析的Shell脚本例子”是指通过Shell脚本来实现对大量域名进行DNS解析的功能。在IT行业中,这种操作常用于网络监控、安全分析或数据收集等场景。下面将详细介绍这个主题。 首先,`...

    shell脚本如何获取随机数random

    掌握在shell脚本中生成随机数的技巧对于IT专业人员来说是非常有用的。文章中提到的生成随机数的方法可以分为以下几点: 首先,可以使用C语言中的srand和rand函数来生成随机数。srand函数用于设置rand函数生成随机数...

    linux下shell脚本实现数据的导出

    在这个例子中,文件被保存在`/home/oracle/exp/`目录下,名为`exp.dmp`。 在Linux环境中,运行此脚本需要确保`oracle`用户有执行`exp`命令的权限,以及拥有写入指定文件路径的权限。 接下来,我们看看Java代码部分...

    Shell脚本例子集合

    这里我们探讨几个基本的Shell脚本例子,包括用户交互、参数处理、文件解压缩以及进度条模拟。 1. 用户交互脚本: 在`show_var.sh`这个例子中,脚本通过`while`循环不断请求用户输入数字,直到用户输入"end"为止。`...

    shell脚本编程100例.doc

    在本文中,我们将深入探讨几个关键的Shell脚本知识点,包括基本语法、变量、条件判断、循环、进程控制以及与系统交互。 1. **Hello World脚本**: 这是最简单的Shell脚本示例,`#!/bin/bash`是shebang,指明解释器...

    Shell脚本编程详解

    在这个主题中,我们将深入探讨Shell脚本编程的几个关键方面。 首先,理解`Shell命令行的运行`至关重要。在Shell命令行,你可以输入一条或多条命令,用分号(;)分隔。比如,`ls a* -l; free; df`这条命令会先列出...

    shell脚本读文件方法和例子

    在开始之前,我们先了解几个基本的概念: - **Shell脚本**:是一种用Shell命令编写的程序。 - **文件读取**:指的是从文件中获取数据的过程。 - **循环结构**:Shell脚本中的循环结构(如`while`、`for`等)常用于...

    Shell脚本专家指南

    根据提供的信息,《Shell脚本专家指南》是一本深入讲解Shell脚本编程的书籍,适合中级到高级的Shell程序员以及需要解决日常问题的系统管理员阅读。本书不仅提供了实用的脚本和技巧,还深入探讨了Shell脚本编程的核心...

    shell脚本编写例子

    在"shell脚本编写例子"这个主题中,我们将深入探讨如何编写和使用简单的shell脚本来提升日常操作效率。 首先,让我们了解什么是shell。Shell是操作系统提供的一种交互式界面,它接收用户输入的命令并执行。而shell...

    shell脚本100例.docx

    以上是《shell脚本100例》中几个典型的例子及其核心知识点。这些脚本不仅帮助新手快速掌握Shell脚本的基础知识,也为有经验的开发者提供了实用的模板和技巧。通过实践这些示例,用户可以更好地理解如何编写高效、...

    Linux shell脚本编写基础

    Linux shell脚本编写基础 Linux系统作为自由软件领域的...掌握这些,你就可以开始编写简单的shell脚本,以实现特定的任务。随着进一步的学习和实践,你将能够处理更复杂的自动化任务,编写出更高效、更安全的脚本。

    几个shell编程的小例子

    在给定的“几个shell编程的小例子”中,我们可以看到四个不同的脚本示例,分别涉及了不同的编程概念。以下是这些知识点的详细说明: 1. **一百内的素数**:这个例子展示了如何在Shell中实现一个简单的素数检测算法...

    Logcat及adb shell命令的bat脚本实现例子

    二是编写一个shell脚本(如`script.sh`)并将其推送到设备上,然后通过`adb shell sh script.sh`执行。如果在`bat`脚本中遇到进入`shell`后无法执行后续命令的问题,可能是因为没有正确处理命令的执行顺序或权限。...

    shell脚本shell脚本shell脚本

    创建一个基本的Shell脚本需要以下几步: 1. **脚本头部**:在脚本文件的开头,通常会添加一个声明行告诉系统该文件是一个shell脚本。例如: ```bash #!/bin/bash ``` 这行被称为“shebang”,它告诉系统使用...

    shell脚本传参、嵌入式命令

    调试shell脚本通常包括以下几个步骤: 1. **启用扩展**:在脚本开头添加`set -x`,这会让shell打印出执行的每一行命令。 2. **错误检查**:使用`if`语句和`errexit`选项(`set -e`)来检查命令是否成功执行,如果...

    实验4 SHELL脚本的编写(一).pdf

    创建和执行shell脚本通常包括以下几个步骤: 1. 在脚本的开头添加"#!/bin/sh",这是告诉系统使用哪个shell解释器来执行脚本。 2. 将脚本文件设置为可执行,使用`chmod +x scriptname`命令。 3. 可以通过`. script...

    一段天气小脚本shell

    在“天气”、“脚本”和“shell”这些标签中,我们可以推测这个脚本可能涉及到以下几个知识点: 1. **Shell基础知识**:包括Shell变量、条件语句(if-else)、循环结构(for、while)、函数定义等。这些都是编写...

Global site tag (gtag.js) - Google Analytics