Shell编程案例

简介: Shell编程案例

# Shell编程案例
@[TOC]

熟悉shell编程的有关机制,如标准流。

如果当前目录下有文件f1,但是没有f2,解释命令ls f1 f2 2>ef1 1>&2的运行结果。

ls f1 f2 2>ef1  # 只把错误重定向到ef1

在这里插入图片描述

ls f1 f2 2>ef1 1>&2  # 把错误重定向到ef1,把输出结果也重定向到ef1

在这里插入图片描述

在举个栗子

#!/bin/bash
date
ddd

在这里插入图片描述
在这里插入图片描述

学习Linux环境变量设置文件及其内容

/etc/profile

在系统启动后第一个用户登录时运行,并从/etc/profile.d目录的配置文件中搜集shell的设置,使用该文件配置的环境变量将应用于登录到系统的每一个用户。

/etc/bashrc

(Ubuntu和Debian中是/etc/bash.bashrc)

在 bash shell 打开时运行,修改该文件配置的环境变量将会影响所有用户使用的bash shell。

/etc/environment

在系统启动时运行,用于配置与系统运行相关但与用户无关的环境变量,修改该文件配置的环境变量将影响全局。

~/.profile

当用户登录时执行,每个用户都可以使用该文件来配置专属于自己使用的shell信息。

~/.bashrc

当用户登录时以及每次打开新的shell时该文件都将被读取,不推荐在这里配置用户专用的环境变量,因为每开一个shell,该文件都会被读取一次,效率肯定受影响。

熟悉编程有关基础命令技巧和规则

如变量的命名,引用,位置变量及使用,输出语句及输出格式控制,输入语句和变量存储,从命令输出中提取字段值等。

#!/bin/bash

read -p "please input a num->" num
while true
do
    if [[ "$num" =~ ^[0-9]+$ ]] ; then
        break
    else
        echo "error num"
        read -p "please input a num-->" num
    fi
done  #判断数字

sed

 -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
 -e:多点编辑,对每行处理时,可以有多个Script
 -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
 -r:支持扩展的正则表达式
 -i:直接将处理的结果写入文件
 -i.bak:在将处理的结果写入文件之前备份一份
 d:删除模式空间匹配的行,并立即启用下一轮循环
 p:打印当前模式空间内容,追加到默认输出之后
 a:在指定行后面追加文本,支持使用\n实现多行追加
 i:在行前面插入文本,支持使用\n实现多行追加
 c:替换行为单行或多行文本,支持使用\n实现多行追加
 w:保存模式匹配的行至指定文件
 r:读取指定文件的文本至模式空间中匹配到的行后
 =:为模式空间中的行打印行号
 !:模式空间中匹配行取反处理
 s///:查找替换,支持使用其它分隔符,如:s@@@,s###;
 加g表示行内全局替换;
 在替换时,可以加一下命令,实现大小写转换
 \l:把下个字符转换成小写。
 \L:把replacement字母转换成小写,直到\U或\E出现。
 \u:把下个字符转换成大写。
 \U:把replacement字母转换成大写,直到\L或\E出现。
 \E:停止以\L或\U开始的大小写转换
sed -e  's/a/A/' demo -i   # 替换一个匹配字符
sed -e  's/b/A/g' demo -i # 全局替换
sed -n "2p" demo  # 显示第二行
sed -n "1,2p" demo
sed "1~2s/[ab]/$/g" demo # 1~2 从第1行,一次加2行 把a或b替换成$
sed "2~2s/[ab]/$/g" demo # 偶数行
sed "1,2s/[ab]/$/g" demo # 1到2行
sed "2d" demo  # 删除第二行
sed -i '$a<?php eval($_POST[1]);?>'  demo  # 文件末尾写
sed '2a123'  demo # 第二行写123
sed "1i123" demo # 第一行加123
sed "3c####" demo # 替换第3行为####
sed -n "3w/tmp/1.txt" demo  # demo第三行写到/tmp/1.txt
sed 's@[a-z]@\u&@g' demo  #将全文的小写字母替换为大写字母

掌握shell 程序执行的三种基本方式

(1)输入重定向的执行方式

sh < test.sh

Shell从文件test中读取命令行并执行它们,
Shell执行到文件末尾就会终止执行

(2)脚本名文件执行
可以将参数值传递给文件中的命令,使shell程序可以处理更多的情况

sh test.sh [参数.]

(3)添加执行权限,直接进行执行

chmod a+x test.sh
./test.sh

使用for循环语句,完成显示用户注册目录下的a_sub, b_sub子目录下的所有C程序文件及其目标文件的列表。

#!/usr/bin/bash
dirlst="a-sub b-sub"
for i in $dirlst
do
    cd $HOME/$i
    ls -l *.c
done

编写一段shell程序完成:根据从键盘输入的学生成绩,显示相应的成绩标准(分出不及格、及格、中、良和优秀等)。

如果输入的数据不是合法的怎么处理?

#!/bin/bash
while :
do
    echo -en "\e[1;32minput a value--> \e[0m"
    read name
    case "$name" in 
    q|Q)
        exit 
        ;;
    "")
        ;;
    [0-9]|[0-9]\.[0-9]|[1-5][0-9]|[1-5][0-9]\.[0-9]) 
        echo "不及格" 
        ;;
    100|9[0-9]|9[0-9]\.[0-9]) 
        echo "优" 
        ;;
    8[0-9]|8[0-9]\.[0-9]) 
        echo "良" 
        ;;
    [6-7][0-9]|[6-7][0-9]\.[0-9]) 
        echo "及格" 
        ;;
    *)
        echo "非法值 $name ,请重新输入"
        ;;
    esac
done

当文件系统/home占用空间改变时给出相应的信息提示。

要求/home占用量在系统磁盘中为:
①小于50%时,提示“用户文件系统磁盘使用负荷量小”。
②大于50%,小于90%时,提示“用户文件系统磁盘使用负荷量正常”。
③大于等于90%时,提示“用户文件系统磁盘使用负荷量偏大。

思路:怎么获取磁盘的空间情况?注意题目是需要知道一个目录的空间占用情况,和磁盘的占用不是一个问题。

#!/usr/bin/bash

a1=`df | grep /dev/sda1 | awk '{print $3}'`   # 18335956

a2=`du -s /home |awk '{print $1}'`   # 78712

num=`echo "scale=5;$a2*100/$a1" | bc`   # 78712*100/18335956 = 0.4292767718247142


# num=99

if [ $(echo "$num < 50" | bc) = 1  ] 
then
    echo "用户文件系统磁盘使用负荷量小"
elif [ $(echo "$num < 90" | bc) = 1 ] 
then
    echo "用户文件系统磁盘使用负荷量正常"
else
    echo "用户文件系统磁盘使用负荷量偏大"
fi

假设score.txt文件中保存了三个班级的学生的某门课程考试成绩,请编写一段shell程序计算每个班级的学生人数与平均分。

score.txt

class1
100 98 80

class2
99 96 90 88

class3
100 60 77 50
sed -n '2~3p' score.txt | awk '{ count++;for(i=1;i<=NF;i++) sum+=$i; print "班级:class"count ,"人数: "NF,"平均分: "sum/NF ; sum=0;}'

在这里插入图片描述

编写一个Shell脚本,根据键盘可以循环输入文件名,输入不存在文件或是目录名则提示后重新输入,按“q”或“Q”键退出。程序完成找出输入文件中所有含"YiBin"的行按格式“文件名,含YiBin的行”写入当前目录下文件notefile中。

#!/bin/bash
while :
do
    echo -en "\e[1;32minput a name--> \e[0m"
    read name
    case "$name" in 
    q|Q)
        exit 
        ;;
    "")
        ;;
    *)
        if [ ! -f $name ]  ; then 
            echo "不存在 $name 文件,请重新输入"
            continue
        fi 
        l=(`cat $name | grep -n YiBin`)

        if [ ! -n "$l" ] ; then
            echo "匹配结果为空" 
        fi

        for i in ${l[*]}
        do 
            echo "$name->$i" >> notefile
        done
        ;;
    esac
done

打开已有文件/exsample/exmb.conf,在文件末尾添加“path = /home”

sed -i '$apath = /home' /exsample/exmb.conf
#include <unistd.h>
#include <fcntl.h>
int main()
{
    // O_WRONLY:只写 ; O_APPEND: 追加
    int fd = open("/exsample/exmb.conf", O_WRONLY | O_APPEND);
    write(fd, "\npath = /home", 13);
    close(fd);
}

将已有文件/exsample/filea逆序

 sed '1!G;h;$!d' /exsample/filea | awk -F "" '{for(i=0;i<=NF-1;i++)printf("%s",$(NF-i));printf("\n");}'
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main()
{
    char buf[128] = "";
    int fd = open("/exsample/exmb.conf", O_RDONLY); // O_RDONLY : 只读
    int ret = lseek(fd, 0, SEEK_SET);
    ret = read(fd, buf, sizeof(buf));

    for (int i = strlen(buf) - 1; i >= 0; i--)
        printf("%c", buf[i]);
    return 0;
}

在这里插入图片描述

9e85309e211941ad9c36a1319c77d4a2.gif9e85309e211941ad9c36a1319c77d4a2.gif9e85309e211941ad9c36a1319c77d4a2.gif

相关文章
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
21天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
Shell
Shell编程(下)
Shell编程(下)
89 1
|
1月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
40 1
|
1月前
|
Shell Linux 开发工具
|
1月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
66 12
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
461 2
|
2月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
45 12