• Linux学习笔记之Shell编程入门


    Shell编程入门

    8.1 Shell的编程过程

    • 内核是Linux系统的心脏,从开机自检就驻留在计算机的内存中,直到计算机关闭为止;而用户的应用程序存储在计算机的硬盘上,仅当需要时才被调入内存; 而Shell独立于内核,是连接内核和应用程序的桥梁,并由输入设备读取命令,再将其转为计算机可以理解的机械码,Linux内核才能执行该命令
      (可以理解为 Shell是一种应用程序,当用户登录 Linux系统时,Shell就会被调入内存去执行;Shell提供了用户与内核进行交互操作的一种接口,接收用户输入的命令,并把它送入内核去执行)

    • Shell不但可以与用户进行逐个命令交互执行,还可以通过脚本语言进行编程;通过对Shell进行编程,可使大量任务自动化,对系统管理、系统维护方面特别有用

    • Shell脚本的基本结构

      • Shell脚本通常都是以 .sh为后缀
      • 第一行要以 “#! /bin/bash” 开头,它代表的意思时,该文件使用的是bash语法
      • #表示注释,在前面讲过的,后面跟一些该脚本的相关注释内容以及作者和创建日期或者版本等
    • Shell脚本的运行

      • 赋予权限,直接运行
        # chmod +x first.sh
        # ./first.sh
      • 使用Shell程序执行
        # bash first.sh
      • Shell的调试执行
        # bash -x first.sh

    8.2 Shell的语法介绍

    • 使用变量:在Shell程序中所有变量保存的值都是字符串

      变量类型 说明
      环境变量 与Shell的执行环境相关的一些变量,如PATH、HOME等,用户可重新定义。(1)环境变量的创建:export,export ABCD=2;(2)环境变量的查看:使用echo命令查看单个环境变量,如echo $PATH;使用printenv查看所有环境变量;使用set查看所有本地定义的环境变量
      预定义变量 用户不能修改,只能引用的变量。由“$”+其他符号组成
      位置变量 在执行脚本时,传入到脚本中对应脚本位置的变量
      标准变量 也是环境变量,在bash环境建立时生成,可使用printenv命令查看
      自定义变量 变量名=变量值(变量名前不需加$,等号两边不能有空格)
    • 常用的预定义变量

      预定义变量 说明
      $# 传递到脚本或函数的参数数量
      $* 传递到脚本或函数的全部参数
      $? 前一个命令执行情况,返回0表示成功,其他值表示失败
      $$ 当前进程的ID(PID)
      $! 后台运行的最后一个进程的进程ID(PID)
      $0 当前脚本的名称
    • 输入/输出内部命令
      输出命令:echo
      输入命令:read


    8.3 调试Shell程序

    • 常见的一般错误
      输入错误:如输入了错误的关键字、成对的符号漏输入一部分等
      字符大小写错误:在Linux中,严格区分字符大小写。所有关键字都用小写字母表示,建议变量名使用大写字母组合来表示
      循环错误:由于Shell中的循环控制语句与一般高级程序设计语言不同,输入结构时容易出错

    • 调试跟踪
      -n选项:不执行脚本,仅检查脚本中的语法问题
      -v选项:将执行过程中的每个脚本命令(包括输入的内容)都原样输出到终端
      -x选项:在执行过的每个命令的行首添加“+”号显示在终端,并显示变量的值。使用该选项更方便跟踪程序的执行过程


    8.4 Shell程序设计实例

    • 增加用户账户(编写一个Shell程序addacount.sh,在系统中增加四个账户,同时设定他们的初始密码为123456,主组群为wl20)
    #! /bin/sh
    groupadd wl20
    for username in xlr cyx zh gjj
    do 
    	useradd -g wl20 $username
    	echo "123456" | passwd --stdin $username
    done
    
    • 统计子目录和文件数量(编写一个Shell程序count.sh,统计当前或指定目录中子目录以及文件的数量)
    #! /bin/sh
    #脚本名称 count.sh
    
    read -p "请输入路径(直接回车换行表示当前目录):" fpath
    if ["$fpath" = ""]
    then
    	fpath=$(pwd)
    fi
    #定义一个函数fun_directory
    
    directory(){
        echo "您输入的路径为:$fpath"
        let "filenum=0"
        let "dirnum=0"
    
    for dir in ${fpath}/*
    do
    	if [ -d "$dir" ]
    	then
    		let "dirnum+=1"
    	elif [ -f "$dir" ]
    		then
    			let "filenum+=1"
    	fi
    done
    
    echo "该目录下共有子目录$dirnum个"
    echo "该目录下共有文件$filenum个"
    }
    #调用函数
    directory
    
    • 编写Shell程序 cfkj.sh,打印出九九乘法表
    #! /bin/bash
    for((ROW=1;ROW<10;ROW++))
    do
    	for((COL=1;COL<=$ROW;COL++))
    		do
    			echo -ne "$ROW*$COL="`expr $ROW * $COL` " "
    		done
    	echo
    done
    

    本套 Linux学习笔记完结,相关的概要知识点已制成思维导图,详情请点击以下下载链接

    下载链接

  • 相关阅读:
    【校招面试 之 C/C++】第23题 C++ STL(五)之Set
    Cannot create an instance of OLE DB provider “OraOLEDB.Oracle” for linked server "xxxxxxx".
    Redhat Linux安装JDK 1.7
    ORA-10635: Invalid segment or tablespace type
    Symantec Backup Exec 2012 Agent for Linux 卸载
    Symantec Backup Exec 2012 Agent For Linux安装
    You must use the Role Management Tool to install or configure Microsoft .NET Framework 3.5 SP1
    YourSQLDba介绍
    PL/SQL重新编译包无反应
    MS SQL 监控数据/日志文件增长
  • 原文地址:https://www.cnblogs.com/codeplayer1999/p/12734996.html
Copyright © 2020-2023  润新知