`

几个例子掌握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脚本编程语法,几个Shell脚本例子,Linux登录退出脚本 适合人群:适合Linux新手学习 能学到什么:shell脚本编程的语法,以及规范

    Shell脚本专家指南

    24.4 几个值的匹配域 24.5 确定域的数目 24.6 确定最后一个域 24.7 确定倒数第二个域 24.8 给awk传送变量 24.9 在一定条件下使用给awk传送的变量 24.10 显示域的范围(主要方法) 24.11 显示域的范围(备选方法) 24.12 ...

    几个shell编程的小例子

    shell编程小例子,一个是一百内的素数,一个是求和,一个是比较大小,还有一个是。。。

    shell编程指南,shell脚本,本书共分五部分全。grep家族,sed,AWK,正则表达式,tr用法

    Linux与unix shell编程指南.rar 第一部分 shell 第1章 文件安全与权限 1 第2章 使用find和xargs 14 ...第27章 几个脚本例子 306 第28章 运行级别脚本 318 第29章 cgi脚本 325 附录 常用shell命令 350

    shell脚本详解

    总过28章节,分别是: 第1章_文件安全与权限; 第2章_使用find和xargs; 第3章_后台执行命令; 第4章_文件名置换; 第5章_shell输入与输出;...第6章_命令执行顺序;...第27章_几个脚本例子; 第28章_运行级别脚本;

    在Shell命令行处理JSON数据的方法

    让我们通过几个例子来说明 jq 的功能: 一、输出格式化,漂亮的打印效果 如果我们用文本编辑器打开 JSON,有时候可能看起来会一团糟,但是通过 jq 的 .(点)过滤器就可以立马让 JSON 的格式规整起来。 1.用文本编辑...

    8个实用的Shell脚本分享

    几个Shell脚本的例子,觉得还不错。 【例子:001】判断输入为数字,字符或其他 代码如下: #!/bin/bash  read -p “Enter a number or string here:” input    case $input in   [0-9]) echo -e “Good job, ...

    绝版经典 LINUX与UNIX SHELL编程指南 PDF 高清版 [16.3M]

    shell是一种完整的编程语言,易学易用;shell脚本可以使烦人的手工作业自动化,使你的工作变得简单、轻松!本书通过各种实用的系统管理小技巧和趣味...第二七章 几个脚本例子 第二八章 运行级别脚本 第二九章 CGI脚本

    101个shell脚本 猜数字游戏代码

    原本书上这个例子是教调试脚本的,它故意给出的脚本中有几个错误,教我们认识系统提示的错误,并修改运行。但比较难写出来,所以把修改好了的脚本放上来,这个脚本比较有趣味的 #!/bin/sh # hilow -- A simple ...

    UNIX命令及SHELL编程

    这是一套完整的Unix培训教材,包括Unix常用命令及SHELL编程...27_高级shell编程技巧-几个脚本例子.PDF 28_高级shell编程技巧-运行级别脚本.PDF 29_cgi脚本.PDF 30_附录常用shell命令.PDF awk教程.doc shell教程.doc

    shell编程 linux

    001文件安全与权限.pdf 002使用find和xargs.pdf 003后台执行命令.pdf 004文件名置换.pdf ... 027几个脚本例子.pdf 028运行级别脚本.pdf 029cgi 脚本.pdf cmd.exe cmd.exe.lnk 常用shell命令030.pdf

    Shell自学pdf.zip

    经曲的SHELL自学PDF书籍。 第01章文件安全与权限.PDF 第02 章使用find 和xargs.PDF 第03 章后台执行命令.PDF ...第27 章几个脚本例子.PDF 第28 章运行级别脚本.PDF 第29 章cgi 脚本.PDF 附录常用shell 命令.PDF

    Linux Shell编程3/3

    Linux Shell编程经典著作: 第一部分SHELL |_文件安全与权限 |_..._…… 第五部分高级shell编程技巧 |_深入讨论|_shell工具 |_几个脚本例子 |_运行级别脚本 |_cgi脚本 附录常用shell命令

    Unix shell 基础知识普及

    1. 文件安全与权限 2. find 和 xargs 3. 后台执行命令 4. 文件名置换 5. SHELL 输入与输出 6. 命令执行顺序 7. 正则表达式介绍 文本过滤 ...27. 几个脚本例子 28. 运行级别脚本 29. CGI 脚本 30. 常用 SHELL 命令

    shell 编程指南pdf

    3.4.2 一次提交几个作业 29 3.5 小结 30 第4章 文件名置换 31 4.1 使用* 31 4.2 使用? 32 4.3 使用[...]和[!...] 32 4.4 小结 33 第5章 shell输入与输出 34 5.1 echo 34 5.2 read 35 5.3 cat 37 5.4 管道 38 5.5 ...

    LINUX与UNIX SHELL编程指南

    网上此书的目录很乱,而且一本书分割为好多文件。我详细整理了目录,并且合并为一个PDF文件。希望对大家有帮助。呵呵,这真的是一本好书《LINUX与UNIX...第二七章 几个脚本例子 第二八章 运行级别脚本 第二九章 CGI脚本

    shell命令精品教程

    基础s h e l l编程 16、shell脚本介绍 17、条件测试 18、控制流结构 19、shell 函数 20、向脚本传递参数 21、创建屏幕输出 22、创建屏幕输入 23、调试脚本 24、...

    shell脚本中$符号的命令使用汇总

    今天是远程办公的第4天,渐渐的找到了一点在家办公的节奏了,改了几个shell脚本,在改动过程中,发现还有一些知识点需要巩固,这里写出来,加深下印象。  关于$符号,大家肯定都不陌生,在shell脚本中,$的作用还是...

Global site tag (gtag.js) - Google Analytics