【BASH】回顾与知识点梳理(二十)

【BASH】回顾与知识点梳理 二十

    • [二十. 十六至十九章知识点总结及练习](#二十. 十六至十九章知识点总结及练习)
      • [20.1 总结](#20.1 总结)
      • [20.2 练习](#20.2 练习)

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

二十. 十六至十九章知识点总结及练习

20.1 总结

  • shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的
  • shell script 用在系统管理上面是很好的一项工具,但是用在处理大量数值运算上, 就不够好了,因为 Shell scripts 的速度较慢,且使用的 CPU 资源较多,造成主机资源的分配不良。
  • 在 Shell script 的文件中,指令的执行是从上而下、从左而右的分析与执行;
  • shell script 的执行,至少需要有 r 的权限,若需要直接指令下达,则需要拥有 r 与 x 的权限;(用sh shell.sh执行脚本,脚本至少要有r权限,而如果通过绝对路径或相对路径直接执行脚本,则脚本至少要有rx权限)
  • 良好的程序撰写习惯中,第一行要宣告 shell (#!/bin/bash) ,第二行以后则宣告程序用途、版本、作者等
  • 对谈式脚本可用 read 指令达成;
  • 要建立每次执行脚本都有不同结果的数据,可使用 date 指令利用日期达成(date --date="20230810" +%s);
  • script 的执行若以 source 来执行时,代表在父程序的 bash 内执行之意!
  • 若需要进行判断式,可使用 test 或中括号 ( [] ) 来处理;
  • 在 script 内,$0, $1, $2..., $@ 是有特殊意义的!
  • 条件判断式可使用 if...then 来判断,若是固定变量内容的情况下,可使用 case $var in ... esac 来处理
  • 循环主要分为不定循环 (while, until) 以及固定循环 (for) ,配合 do, done 来达成所需任务!
  • 我们可使用 sh -x script.sh 来进行程序的 debug

20.2 练习

  • 请建立一支 script ,当你执行该 script 的时候,该 script 可以显示: 1. 你目前的身份 (用 whoami ) 2. 你目前所在的目录 (用 pwd)
bash 复制代码
[root@node-135 bin]# cat ww.sh
#!/bin/bash
# Program:
# report whoami and pwd
# History:
# 2023/08/10 yurq First Release

PATH=$PATH:~/bin
export PATH

whoami
pwd
  • 请自行建立一支程序,该程序可以用来计算『你还有几天可以过生日』啊?
bash 复制代码
#!/bin/bash
read -p "Pleas input your birthday (MMDD, ex> 0709): " bir
now=`date +%m%d`
if [ "$bir" == "$now" ]; then
	echo "Happy Birthday to you!!!"
elif [ "$bir" -gt "$now" ]; then
	year=`date +%Y`
	total_d=$(($((`date --date="$year$bir" +%s`-`date +%s`))/60/60/24))
	echo "Your birthday will be $total_d later"
else
	year=$((`date +%Y`+1))
	total_d=$(($((`date --date="$year$bir" +%s`-`date +%s`))/60/60/24))
	echo "Your birthday will be $total_d later"
fi
  • 让用户输入一个数字,程序可以由 1+2+3... 一直累加到用户输入的数字为止。
bash 复制代码
#!/bin/bash
read -p "Please input an integer number: " number
i=0
s=0
while [ "$i" != "$number" ]
do
	i=$(($i+1))
	s=$(($s+$i))
done
echo "the result of '1+2+3+...$number' is ==> $s"
  • 撰写一支程序,他的作用是:
    • 1.) 先查看一下 /root/test/logical 这个名称是否存在;
    • 2.) 若不存在,则建立一个文件,使用 touch 来建立,建立完成后离开;
    • 3.) 如果存在的话,判断该名称是否为文件,若为文件则将之删除后建立一个目录,文件名为 logical ,之后离开;
    • 4.) 如果存在的话,而且该名称为目录,则移除此目录!
bash 复制代码
[root@node-135 bin]# cat logical.sh
#!/bin/bash
# Program:
# check /root/test/logical
# History:
# 2023/08/10 yurq First Release

PATH=$PATH:~/bin
export PATH

logical="/root/test/logical"

if [ ! -e $logical ];then
        if [ ! -d `dirname $logical` ];then
                mkdir -p `dirname $logical`
                echo "mkdir /root/test/"
        fi

        touch $logical && echo "touch logical"
        exit 0
elif [ -f $logical ];then
        rm -rf $logical
        echo "logical is file,remove it"
        mkdir -p $logical

        echo "logical is dir,make it"
        exit 0
elif [ -d $logical ];then
        rm -rf $logical

        echo "logical is dir,remove it"
        exit 0
else
        echo "$logical maybe error"
        ls -l $logical

fi
  • 我们知道 /etc/passwd 里面以 : 来分隔,第一栏为账号名称。请写一只程序,可以将 /etc/passwd 的第一栏取出,而且每一栏都以一行字符串『The 1 account is "root" 』来显示,那个 1 表示行数。
bash 复制代码
[root@node-135 bin]# cat echouser.sh
#!/bin/bash
# Program:
# echo user number
# History:
# 2023/08/10 yurq First Release

PATH=$PATH:~/bin
export PATH


userlist=`cut -d":" -f 1 /etc/passwd`
num=1
for i in ${userlist};do
        echo "The $num account is \"$i\""
        num=$(($num+1))
done

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

相关推荐
无尽的大道8 分钟前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
爱吃生蚝的于勒11 分钟前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法
binishuaio20 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE22 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻26 分钟前
WPF中的依赖属性
开发语言·wpf
洋24035 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙37 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点38 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
熊的猫1 小时前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
NoneCoder1 小时前
Java企业级开发系列(1)
java·开发语言·spring·团队开发·开发