zoukankan      html  css  js  c++  java
  • 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学习笔记完结,相关的概要知识点已制成思维导图,详情请点击以下下载链接

    下载链接

  • 相关阅读:
    区间未出现的最小值(牛客)
    (大幂分解求和)A^X mod P(数的高次幂)
    刷题-力扣-面试题17.10. 主要元素
    刷题-力扣-503. 下一个更大元素 II
    刷题-力扣-232. 用栈实现队列
    刷题-力扣-1476. 子矩形查询
    刷题-力扣-338. 比特位计数
    刷题-力扣-304. 二维区域和检索
    刷题-力扣-303. 区域和检索
    刷题-力扣-896. 单调数列
  • 原文地址:https://www.cnblogs.com/codeplayer1999/p/12734996.html
Copyright © 2011-2022 走看看