shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例


文章目录

  • shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例
    • 前言
    • 1. hello world
    • 2. 使用echo打印
    • 3. 使用注释
    • 4. 多行注释
    • 5. while循环
    • 6. for循环
    • 7. 接收用户输入
    • 8. if语句
    • 9. 使用if elif else
    • 10. 使用AND运算符
    • 11. 使用OR运算符
    • 12. case分支选择结构
    • 13. 命令行参数
    • 14. 获取带有名称的参数
    • 15. 连接字符串
    • 16. 切片字符串
    • 17. 使用cut提取子字符串
    • 18. 两个值相加
    • 19. 添加多个值
    • 20. Bash中的函数
    • 21. 带返回值的函数
    • 22. 从bash脚本创建目录
    • 23. 确认存在后创建目录
    • 24. 读取文件
    • 25. 删除文件
    • 26. 附加到文件
    • 27. 测试文件的存在
    • 28. 解析日期和时间
    • 29. 展示进度百分比
    • 30. sleep命令
    • 31. 等待wait命令
    • 32. 显示最近更新的文件
    • 33. 系统维护
    • 34. 获取文件数或目录数
    • 35. 清理日志文件
    • 36. 检查您是否为root用户
    • 37. 从文件中删除重复的行
    • 最后

https://www.linuxidc.com/Linux/2020-04/162937.htm

前言

学习完之前的内容后,接下来你可以继续根据官方的文档了解其它内容,也可以跟着我这里的学习步骤学习实例进行实战,之前的总结只是官方bash文档的一个章节,我主要是通过其了解bash的一些基础特性和概念,实际上bash还有很多的内容,我们这里就不展开了,就像汽车,我们目前了解一些汽车的基本特性并学会开车即可,要了解汽车的其它内容则根据个人的情况而定。

接下来我将根据Linux公社上提供的简单有效的shell脚本在WSL做一些实例演示总结,最好对前面的内容有一些阅读来对相关概念有一些学习,这样接下来的实例脚本就很容理解了,如果不太需要对bash相关内容做了解而仅仅是使用的话则根据需要直接看下面的实例就可以,第一次接触bash并希望快速上手bash的话我建议对着示例敲一遍,接下来就可以自行写一些简单的bash脚本了。

1. hello world

在wsl终端创建hello.sh,然后输入以下内容并执行:

#! /usr/bin/bash

echo "Hello World"

执行时就像我们在第九节所示的方式通过chmod给与执行权限:

chmod +x hello.sh

然后执行:

./hello.sh

图示如下(使用了tmux进行窗口切分,一个写代码,一个执行):

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第1张图片

2. 使用echo打印

echo命令用于以bash格式打印信息。它类似于C函数’printf’,并提供许多常用选项,包括转义序列和重定向。

将以下几行复制到一个名为linuxidc.com.sh的文件中,并使其可执行,如上所述。

#!/bin/bash

echo "Hello"
echo -n "不使用换行符打印文本"
echo -e "\nubuntu \t centos\t debian\n"

运行脚本,看看它做了什么。-e选项用于告诉echo传递给它的字符串包含特殊字符,需要扩展功能。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第2张图片

3. 使用注释

注释对于文档很有用,并且是高质量代码库的要求。在处理关键逻辑的代码中放入注释是一种常见的做法。要注释掉一行,只需在它前面使用#(散列)字符。检查以下bash脚本示例。

#! /bin/bash

# 两个值相加
((sum=17+19))

#打印结果
echo $sum

该脚本将输出数字36。请在某些行之前使用#检查如何使用注释。但是第一行是一个例外。它被称为shebang,让系统知道运行此脚本时使用哪个解释器。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第3张图片

4. 多行注释

许多人使用多行注释来记录其Shell脚本。在下一个名为linuxidc.com.sh的脚本中检查如何完成此操作。

#!/bin/bash
: '
该脚本计算
5的平方。
'
((area=5*5))
echo $area

注意多行注释是如何放置在:’ 和 '字符中的。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第4张图片

5. while循环

while循环结构用于多次运行某些指令。请查看以下名为while.sh的脚本,以更好地理解此概念。

#!/bin/bash
i=0

while [ $i -le 2 ]
do
echo Number: $i
((i++))
done

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第5张图片

因此,while循环采用下面的形式。

while [ condition ]
do
commands 1
commands n
done

方括号是必需的。

6. for循环

for循环是另一种广泛使用的bash shell构造,它允许用户有效地遍历代码。下面演示一个简单的示例。

#!/bin/bash

for (( a=1; a<=5; a++ ))
do
echo -n "$a "
done

printf "\n"

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第6张图片

7. 接收用户输入

获取用户输入对于在脚本中实现用户交互至关重要。下面的Shell脚本示例将演示如何在Shell程序中接收用户输入。

#!/bin/bash

echo -n "输入内容:"
read something

echo "您输入了:$something"

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第7张图片

因此,read结构后跟一个变量名,用于获取用户输入。输入存储在这个变量中,可以使用$符号访问它。

8. if语句

如果语句是Unix shell脚本中最常见的条件构造,则它们采用以下形式。

if CONDITION
then
STATEMENTS
fi

仅当条件为true时才执行语句。fi关键字用于标记if语句的结尾。下面是一个简单的示例。

#!/bin/bash

echo -n "请输入数字: "
read num

if [[ $num -gt 17 ]]
then
echo "数字大于17."
fi

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第8张图片

仅当通过输入提供的数字大于17时,以上程序才会显示输出。该-gt表示大于; 类似地-lt小于;-le小于等于;和-Ge为大于等于。[[]]是必需的。

9. 使用if elif else

将else构造与if结合使用,可以更好地控制脚本的逻辑。一个简单的例子如下所示。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第9张图片

10. 使用AND运算符

AND运算符允许我们的程序一次检查是否满足多个条件。用AND运算符分隔的所有部分都必须为true。否则,包含AND的语句将返回false。查看以下bash脚本示例,以更好地了解AND的工作原理。

#!/bin/bash

echo -n "输入数字:"
read num

if [[ ( $num -lt 10 ) && ( $num%2 -eq 0 ) ]]; then
echo "您刚才输入的是偶数:$num"
else
echo "您刚才输入的是奇数:$num"
fi

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第10张图片

11. 使用OR运算符

OR运算符是另一个至关重要的结构,它使我们能够在脚本中实现复杂而强大的编程逻辑。与AND相反,由OR运算符组成的语句在其任何一个操作数为true时均返回true。仅当由OR分隔的每个操作数为false时,它才返回false。

#!/bin/bash

echo -n "输入任何数字:"
read n

if [[ ( $n -eq 25 || $n -eq 50 ) ]]
then
echo "你赢了"
else
echo "你输了"
fi

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第11张图片

12. case分支选择结构

多分支选择结构是Linux bash脚本提供的另一个强大特性。它可以在需要嵌套条件的地方使用,但是您不希望使用复杂的if-else-elif链。那请看下一个例子。

#!/bin/bash

echo -n "请输入数字: "
read num

case $num in
100)
echo "100!!" ;;
200)
echo "200!!" ;;
*)
echo "既不是100也不是200" ;;
esac

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第12张图片

13. 命令行参数

在许多情况下,直接从命令shell获取参数可能是有益的。下面的示例演示如何在bash中执行此操作。

#!/bin/bash
echo "参数总数 : $#"
echo "第1个参数 = $1"
echo "第2个参数 = $2"

在其名称之后,使用两个附加参数运行此脚本。

因此,$1用于访问第一个参数, 2 用 于 访 问 第 二 个 参 数 , 依 此 类 推 。 2用于访问第二个参数,依此类推。 2访#用于获取参数的总数。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第13张图片

14. 获取带有名称的参数

下面的示例演示如何获取带有名称的命令行参数。

#!/bin/bash

for arg in "$@"
do
    index=$(echo $arg | cut -f1 -d=)
    val=$(echo $arg | cut -f2 -d=)
    case $index in
        A) a=$val;;
        B) b=$val;;
        *)
    esac
done

((result=a+b))
echo "A+B=$result"

对这块使用的一些特殊符号参数不理解的去看一下shell关于参数的那一节的内容。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第14张图片

15. 连接字符串

字符串处理对于各种现代bash脚本至关重要。值得庆幸的是,它在bash中使用起来更加舒适,并且允许使用一种更加精确,简洁的方式来实现此目的。请参阅以下示例,快速浏览bash字符串连接。

#!/bin/bash

string1="Linux"
string2="公社"
string3="(www.linuxidc.com)"
string=$string1$string2$string3
echo "$string 为Linux爱好者提供海量技术教程。"

以下程序输出字符串“Linux公社(www.linuxidc.com) 为Linux爱好者提供海量技术教程。”如下图:

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第15张图片

16. 切片字符串

与许多编程语言相反,bash不提供用于切片字符串部分的任何内置函数。下面的示例演示如何使用参数扩展来完成此操作。

#!/bin/bash
Str="Learn Bash Commands from linuxidc.com"
subStr=${Str:0:20}
echo $subStr

这个脚本应该输出“Learn Bash Commands”。参数扩展采用${VAR_NAME:S:L}的形式。在此,S表示起始位置,L表示长度。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第16张图片

17. 使用cut提取子字符串

可以在脚本内部使用Linux cut命令来“剪切”一部分字符串,也就是子字符串。 下一个示例显示了如何完成此操作。

#!/bin/bash
Str="Learn Bash Commands from linuxidc.com"
#subStr=${Str:0:25}

subStr=$(echo $Str| cut -d ' ' -f 1-4)
echo $subStr

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第17张图片

关于cut的使用可以通过cut --help指令在命令行上了解。

18. 两个值相加

在Linux Shell脚本中执行算术运算非常容易。下面的示例演示如何从用户接收两个数字作为输入并将其相加。

#!/bin/bash
echo -n "输入第一个数字:"
read a
echo -n "输入第2个数字:"
read b
(( sum=a+b ))
echo "相加的结果=$sum"

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第18张图片

19. 添加多个值

您可以使用循环获取多个用户输入并将其添加到脚本中。以下示例说明了这一点。

#!/bin/bash

sum=0

for (( counter=1; counter<5; counter++))
do
    echo -n "输入数字:"
    read n
    (( sum+=n ))
    echo -n "$sounter"
done

printf "\n"
echo "结果是:$sum"

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第19张图片

但是,省略**(( ))**将导致字符串连接而不是加法。因此,请在程序中检查类似这样的事情。

20. Bash中的函数

与任何编程方言一样,函数在Linux Shell脚本中起着至关重要的作用。它们允许管理员创建自定义代码块以供频繁使用。下面的演示将概述功能如何在Linux bash脚本中工作。

#!/bin/bash

function Add() {
    echo -n "输入一个数字:"
    read a
    echo -n "输入另一个数字:"
    read b
    echo "相加的结果是:$(( a+b ))"
}

Add

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第20张图片

21. 带返回值的函数

函数最神奇的功能之一是它们允许将数据从一个函数传递到另一个函数。它在多种情况下很有用。查看下一个示例。

#!/bin/bash

function Greet() {
    str="你好$name,是什么把你带到Linux公社?"
    echo $str
}

echo "->你叫什么名字?"
read name

val=$(Greet)
echo -e "-> $val"

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第21张图片

22. 从bash脚本创建目录

使用Shell脚本运行系统命令的能力使开发人员的工作效率更高。以下简单示例将向您展示如何从Shell脚本中创建目录。

#!/bin/bash

echo -n "输入目录名称->"
read newdir
cmd="mkdir $newdir"
eval $cmd

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第22张图片

如果仔细观察,此脚本仅调用标准的shell命令mkdir并将其传递给目录名称。该程序应在您的文件系统中创建一个目录。您还可以传递命令以在backticks(``)内部执行,如下所示。

`mkdir $newdir`

23. 确认存在后创建目录

如果您当前的工作目录中已经包含一个具有相同名称的文件夹,则上述程序将无法工作。下面的程序将检查是否存在名为$dir的任何文件夹,并且如果找不到则创建一个文件夹。

#!/bin/bash

echo -n "输入目录名称->"
read dir
if [ -d "$dir" ]
then
    echo "目录已存在"
else
    `mkdir $dir`
    echo "目录已创建"
fi

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第23张图片

使用eval编写此程序可以提高bash脚本编写技能。

24. 读取文件

Bash脚本使用户可以非常有效地读取文件。以下示例将展示如何使用Shell脚本读取文件。创建一个名为test.txt的文件,其中包含以下内容。

1.vim
2.nano
3.centos
4.ubuntu
5.emacs

该脚本将输出以上每行内容:

#!/bin/bash

file='test.txt'
while read line
do
    echo $line
done< $file

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第24张图片

25. 删除文件

以下程序将演示如何在Linux Shell脚本中删除文件。该程序将首先要求用户提供文件名作为输入,如果存在则将其删除。Linux rm命令在此处进行删除。

\#!/bin/bash
echo -n "输入文件名 ->"
read name
rm -i $name

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第25张图片

26. 附加到文件

下面的Shell脚本示例将向您展示如何使用bash脚本将数据追加到文件系统上的文件。它将在先前的test.txt文件中增加一行。

#!/usr/bin/env sh

echo "在追加文件之前"
cat test.txt
echo "6.C++" >> test.txt
echo "追加文件之后"
cat test.txt

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第26张图片

您现在应该注意到,我们正在直接使用Linux bash脚本中的日常终端命令。

27. 测试文件的存在

下一个shell脚本示例显示了如何从bash程序检查文件是否存在。

#!/usr/bin/env sh

filename="/etc/hosts"
if [ -f "$filename" ]
then
    echo "文件已存在"
else
    echo "文件不存在"
fi

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第27张图片

我们直接也可以从命令行传递文件名作为参数。

28. 解析日期和时间

这个bash脚本示例将向您展示如何使用脚本处理日期和时间。Linux date命令用于获取必要的信息,我们的程序执行解析。

#!/usr/bin/env sh

year=`date +%Y`
month=`date +%m`
day=`date +%d`
hour=`date +%H`
minute=`date +%M`
second=`date +%S`
echo `date`
echo "当前日期是:$day-$month-$year"
echo "当前时间是:$hour:$minute:$second"

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第28张图片

运行这个程序,看看它是如何工作的。另外,尝试从终端运行date命令。

29. 展示进度百分比

在需要处理一个几万行的文件的时候,需要处理的时间是比较长的。现在实现一个展示进度百分比的脚本。

#!/usr/bin/env bash

# 定义变量 i
i=1
# 获取 /var/log/dpkg.log这个文件的行数,并把运行结果赋予变量 l
l=$(wc -l /var/log/dpkg.log | sed 's/^[ \t]*//g' | cut -d ' ' -f1)

# 每行遍历循环
while read line
do
	# 输出百分比
    echo -en "\b\b\b\b"`echo $i*100/$l | bc`'%'
     # 计算 i++
    ((i++))
done< /var/log/dpkg.log

# 完成时打个OK,因为字符长度不足以遮盖原先的百分比,所以后面加了几个空格
echo -e '\b\b\b\bOK   '

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第29张图片

30. sleep命令

sleep命令允许您的shell脚本在指令之间暂停。在许多情况下(例如执行系统级作业),它很有用。下一个示例显示了Shell脚本中运行的sleep命令。

#!/bin/bash
echo "要等多长时间?"
read time
sleep $time
echo "等待了$time秒!"

该程序将暂停最后一条指令的执行,直到$time,在这种情况下由用户提供。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第30张图片

31. 等待wait命令

wait命令用于从Linux bash脚本暂停系统进程。请查看以下示例,以详细了解它在bash中的工作方式。

#!/bin/bash
echo "测试等待命令"
sleep 5 &
pid=$!
kill $pid
wait $pid
echo $pid 被终止了。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第31张图片

这个地方如果没有了解前面的bash脚本的特性的话是不好理解的。

32. 显示最近更新的文件

有时您可能需要查找某些操作的最新更新文件。以下简单程序向我们展示了如何使用awk命令在bash中执行此操作。它将列出当前工作目录中的最后更新或创建的文件。

#!/bin/bash

ls -lrt | grep ^- | awk 'END{print $NF}'

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第32张图片

为了简单起见,我们将避免在此示例中描述awk的功能。您只需复制此代码即可完成任务。

33. 系统维护

我经常使用一些Linux Shell脚本来升级系统,而不是手动执行。下面的简单shell脚本将向您展示如何执行此操作。

#!/bin/bash

echo -e "\n$(date "+%d-%m-%Y --- %T") --- 开始工作\n"

apt-get update
apt-get -y upgrade

apt-get -y autoremove
apt-get autoclean

echo -e "\n$(date "+%T") \t 脚本终止"

该脚本还处理不再需要的旧软件包。您需要使用sudo运行此脚本,否则它将无法正常工作。

34. 获取文件数或目录数

Linux shell统计目录下文件数与目录数有多少。

#!/bin/bash

#定义一个函数fun_directory
fun_directory() {
    let "filenum=0"
    let "dirnum=0"
    for i in $(ls)
    do
        if [ -d $i ]
        then
            let dirnum+=1
        else
            let filenum+=1
        fi
    done

    echo "目录数是:$dirnum"
    echo "文件数是:$filenum"
}

fun_directory

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第33张图片

35. 清理日志文件

下一个简单的示例演示了我们可以在现实生活中使用shell脚本的便捷方法。该程序将只删除/ var / log目录中存在的所有日志文件。您可以更改保存此目录的变量,以清除其他日志。

#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR

cat /dev/null > messages
cat /dev/null > wtmp
echo "清理日志。"

记住要以root身份运行此Linux Shell脚本。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第34张图片

36. 检查您是否为root用户

以下示例演示了一种从Linux bash脚本中查找用户是否为root用户的快速方法。

#!/bin/bash

ROOT_UID=0

if [ "$UID" -eq "$ROOT_UID" ]
then
    echo "您是root用户"
else
    echo "您不是root用户"
fi
exit 0

该脚本的输出取决于运行它的用户。它将基于$UID匹配root用户。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第35张图片

37. 从文件中删除重复的行

文件处理需要花费大量时间,并在许多方面影响管理员的工作效率。在文件中搜索重复项可能会成为一项艰巨的任务。幸运的是,您可以使用简短的Shell脚本来完成此操作。

#!/bin/bash

echo -n "输入文件名->"
read filename

if [ -f "$filename" ]
then
    sort $filename | uniq | tee test.txt
else
    echo "$pwd当前所在目录中没有$filename..再试一次"
fi
exit 0

上面的脚本逐行遍历文件,并删除所有重复的行。然后,它将新内容放入新文件中,并保持原始文件完整。

shell脚本系列:10、快速上手bash脚本:简单有效的shell脚本示例_第36张图片

最后

需要了解hell、bash、shell脚本的区别以及明白sh解释器和bash解释器的一些功能是不同的,写shell脚本时需要注意指明正确的解释器。

你可能感兴趣的:(shell脚本,shell,bash)