脚本练习

40个简单而有效的Shell脚本,想不起来的时候一看就懂(下)

Cloud研习社 2022-06-27 13:38 发表于山东
图片

 

快来复习你的shell脚本吧!!!

21.bash中的函数


图片

 


与任何编程语言一样,函数在 Linux shell 脚本中起着至关重要的作用。它们允许管理员创建自定义代码块。实例:

#!/bin/bash
function Add()
{
echo -n "Enter a Number: "
read x
echo -n "Enter another Number: "
read y
echo "Adiition is: $(( x+y ))"
}

Add

 

在这里,我们像以前一样添加了两个数字。但是在这里,我们已经使用一个名为 Add 的函数完成了这项工作。因此,每当您需要再次添加时,您只需调用此函数即可,而无需再次编写该部分。

22.有返回值的函数


图片

 


允许数据从一个函数传递到另一个函数。它在各种场景中都很有用。

#!/bin/bash

function Greet() {

str="Hello $name, what brings you to UbuntuPit.com?"
echo $str
}

echo "-> what's your name?"
read name

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

 

这里,输出包含从 Greet() 函数接收到的数据。

23.用bash脚本创建目录


图片

 


使用 shell 脚本运行系统命令,使开发人员的工作效率更高。示例:

#!/bin/bash
echo -n "Enter directory name ->"
read newdir
cmd="mkdir $newdir"
eval $cmd

 

如果您仔细观察,该脚本只是调用您的标准 shell 命令 mkdir 并将目录名称传递给它。这个程序应该在你的文件系统中创建一个目录。您还可以传递命令以在反引号(“)内执行,如下所示。

`mkdir $newdir`



24.确认存在后创建目录


图片

 

如果您当前的工作目录已经包含同名文件夹,则上述程序将不起作用。例如,下面的程序将检查是否存在任何名为$dir的文件夹,如果没有找到则只创建一个。

#!/bin/bash
echo -n "Enter directory name ->" 
read dir
if [ -d "$dir" ]
then 
echo "Directory exists" 
else 
`mkdir $dir`
echo "Directory created" 
fi

 


25.读取文件


图片

 


Bash 脚本允许用户非常有效地读取文件。下面的示例将展示如何使用 shell 脚本读取文件。首先,创建一个名为 editors.txt 的文件,其内容如下。

1. Vim
2. Emacs
3. ed
4. nano
5. Code

 

这个脚本会输出:

#!/bin/bash
file='editors.txt'
while read line; do
echo $line
done < $file

 


26.删除文件


图片

 


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

#!/bin/bash
echo -n "Enter filename ->"
read name
rm -i $name

 

我们输入 editors.txt 作为文件名,并在要求确认时按 y。它应该删除该文件。

27.向文件中追加内容


图片

 


下面的 shell 脚本示例将向您展示如何使用 bash 脚本将数据附加到文件系统上的文件中。它在较早的 editors.txt 文件中添加了一行。

#!/bin/bash
echo "Before appending the file"
cat editors.txt
echo "6. NotePad++" >> editors.txt
echo "After appending the file"
cat editors.txt

 

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

28.测试文件是否存在


图片

 


检查文件是否存在

#!/bin/bash
filename=$1
if [ -f "$filename" ]; then
echo "File exists"
else
echo "File does not exist"
fi

 

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

29.从shell脚本发送邮件


图片

 

从 bash 脚本发送电子邮件非常简单。以下简单示例将演示从 bash 应用程序执行此操作的一种方法。

#!/bin/bash
recipient=”admin@example.com”
subject=”Greetings”
message=”Welcome to UbuntuPit”
`mail -s $subject $recipient <<< $message`

 


30.解析日期和时间


图片

 

如何使用脚本处理日期和时间

#!/bin/bash
year=`date +%Y`
month=`date +%m`
day=`date +%d`
hour=`date +%H`
minute=`date +%M`
second=`date +%S`
echo `date`
echo "Current Date is: $day-$month-$year"
echo "Current Time is: $hour:$minute:$second"

 

运行这个程序,看看它是如何工作的。

31.sleep命令


图片

 


sleep 命令允许您的 shell 脚本在指令之间暂停。它在许多场景中都很有用,例如执行系统级作业。

#!/bin/bash
echo "How long to wait?"
read time
sleep $time
echo "Waited for $time seconds!"

 

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

32.wait命令


图片

 


wait 命令用于从 Linux bash 脚本暂停系统进程。

#!/bin/bash
echo "Testing wait command"
sleep 5 &
pid=$!
kill $pid
wait $pid
echo $pid was terminated.

 

自己运行这个程序,看看它是如何工作的。

33.显示最后更新的文件


图片

 

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

#!/bin/bash

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

 


34.批量添加扩展名


图片

 


下面的示例将对目录中的所有文件应用自定义扩展名。创建一个新目录并将一些文件放在那里以进行演示。我的文件夹共有五个文件,每个文件名为 test 后跟 (0-4)。我已将此脚本编程为在文件末尾添加( .UP) 。你可以添加任何你想要的扩展。

#!/bin/bash
dir=$1 
for file in `ls $1/*`
do 
mv $file $file.UP
done

 

首先,不要从任何常规目录尝试此脚本;相反,从测试目录运行它。另外,您需要提供文件的目录名称作为命令行参数。对当前工作目录使用句点(.)。

35.打印文件或目录数量


图片

 


查找给定目录中存在的文件或文件夹的数量。利用 Linux find 命令来执行此操作。首先,您需要传递目录名称以从命令行搜索文件。

#!/bin/bash

if [ -d "$@" ]; then
echo "Files found: $(find "$@" -type f | wc -l)"
echo "Folders found: $(find "$@" -type d | wc -l)"
else
echo "[ERROR] Please retry with another folder."
exit 1
fi

 

如果指定的目录不可用或有权限问题,程序将要求用户重试。

36.清理日志文件


图片

 


删除 /var/log 目录中存在的所有日志文件。

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

cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."

 


37.备份文件和目录


图片

 

Shell 脚本提供了一种强大的方法来备份您的文件和目录。以下示例将备份过去 24 小时内修改过的每个文件或目录。该程序利用 find 命令来执行此操作。

#!/bin/bash

BACKUPFILE=backup-$(date +%m-%d-%Y)
archive=${1:-$BACKUPFILE}

find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar"
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."
exit 0

 

备份过程成功后,它将打印文件和目录的名称。

38.检查当前是不是root用户


图片

 

#!/bin/bash
ROOT_UID=0

if [ "$UID" -eq "$ROOT_UID" ]
then 
echo "You are root." 
else 
echo "你不是root" 
fi 
exit 0

 


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


图片

 


文件处理需要相当长的时间,并在许多方面影响管理员的工作效率。例如,在文件中搜索重复项可能会成为一项艰巨的任务。但是用shell脚本就简单多了。

#! /bin/sh

echo -n "Enter Filename-> "
read filename
if [ -f "$filename" ]; then
sort $filename | uniq | tee sorted.txt
else
echo "No $filename in $pwd...try again"
fi
exit 0

 

上面的脚本逐行通过您的文件并删除任何重复的行。然后它将新内容放入一个新文件中,并保持原始文件不变。

 

40.系统升级


图片

 

 

#!/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 脚本终止"

 

请把上面的脚本改写成用yum实现。

 

如果您是 Linux 新爱好者,雷哥强烈建议您掌握这些基本的 bash 脚本示例。


推荐阅读

ifconfig已淘汰,ip登场

Linux 云计算 学习路线(建议收藏)放后台的Linux任务没有了,试试这个命令

Linux 网络状态工具 ss 命令详解

这次终于搞明白VLAN技术了

终于有人把敏捷、DevOps、CI、CD讲清楚了


 

 

除每周二、四、六定期更新的《Linux云计算一站式教程》以外,其余时间雷哥会推送一些工作中遇到的小知识、实战经验总结的文章。后续都会收录在“实战经验”合集中。

图片

 


40个简单而有效的Shell脚本,想不起来的时候一看就懂(上)

Cloud研习社 Cloud研习社 2022-06-26 18:08 发表于山东
图片

 

快来复习你的shell脚本吧!!!Bash,又名Bourne Again Shell ,是当今大多数Linux 发行版中的默认命令行解释器。它是在版本 7 Unix 中首次引入的早期 Bourne shell 的升级版。学习 bash shell 脚本可以让您更快地理解其他 shell 脚本。所以,自己尝试这些简单的例子来获得第一手经验。

1.Hello World


图片

 

使用 vim 或 nano 等编辑器创建文件 hello-world.sh 并将以下行复制到其中。

#!/bin/bash
echo "Hello World"

 

保存并退出,然后:

$ chmod a+x hello-world.sh

 

开始执行(两种方法都可以)

$ bash hello-world.sh
$ ./hello-world.sh

 

此时在屏幕上就可以看到输出的:Hello World 了。

2.使用echo打印


图片

 


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

将以下行复制到一个名为 echo.sh 的文件中,并像上面那样使其可执行。

#!/bin/bash
echo "打印文本" 
echo -n "打印不带换行符的文本" 
echo -e "\n删除\t特殊\t字符\n"

 

运行脚本以查看它的作用。-e选项用于告诉 echo 传递给它的字符串包含特殊字符并且需要扩展功能。

 

3.使用注释


图片

 

 

要注释掉一行,只需在它前面使用#(哈希)字符。例如,检查下面的 bash 脚本示例。

#!/bin/bash

# 两个值
相加 ((sum=25+35))

#打印结果
echo $sum

 

该脚本将输出数字 60。首先,在某些行之前使用#检查如何使用注释。不过,第一行是个例外,用来让系统知道在运行此脚本时要使用哪个解释器。


4.多行注释


图片

 


许多人使用多行注释来记录他们的 shell 脚本。在名为 comment.sh 的下一个脚本中检查这是如何完成的。

#!/bin/bash
: '
This script calculates
the square of 5.
'
((area=5*5))
echo $area

 

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

5.while循环


图片

 

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

#!/bin/bash
i=0

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

 

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

while [ condition ]
do
commands 1
commands n
done

 

方括号周围的空格是必须要有的。

6.for循环


图片

 

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

#!/bin/bash

for (( counter=1; counter<=10; counter++ ))
do 
echo -n "$counter " 
done 

printf "\n"

 

将此代码保存在名为 for.sh 的文件中并使用 ./for.sh 运行它。不要忘记使其可执行。这个程序应该打印出数字 1 到 10。

7.接受用户输入


图片

 

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

#!/bin/bash

echo -n "Enter Something:"
read something

echo "You Entered: $something"

 

因此,后跟变量名的阅读结构用于获取用户输入。输入存储在此变量中,可以使用 $ 符号访问。

8.if语句


图片

 

if CONDITION
then
STATEMENTS
fi

 

只有在 CONDITION 为真时才会执行这些语句。fi 关键字用于标记 if 语句的结束。下面给一个简单的示例。

#!/bin/bash

echo -n "Enter a number: "
read num

if [[ $num -gt 10 ]]
then
echo "Number is greater than 10."
fi

 

如果通过输入提供的数字大于 10,上述程序将仅显示输出。-gt代表大于;同样-lt表示小于;-le小于等于;-ge表示大于等于。此外,[[ ]] 是固定写法。

9.使用if-else实现更多控制


图片

 

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

#!/bin/bash

read n
if [ $n -lt 10 ];
then
echo "It is a one digit number"
else
echo "It is a two digit number"
fi

 

else 部分需要放在 if 的 action 部分之后,fi 之前。

10.使用AND运算符


图片

 


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

#!/bin/bash

echo -n "Enter Number:"
read num

if [[ ( $num -lt 10 ) && ( $num%2 -eq 0 ) ]]; then
echo "Even Number"
else
echo "Odd Number"
fi

 

AND 运算符由&&符号表示。

11.使用OR运算符


图片

 

OR 运算符是另一个重要的构造,它允许我们在脚本中实现复杂、健壮的编程逻辑。与 AND 相反,由 OR 运算符组成的语句在其任一操作数为真时返回真。仅当由 OR 分隔的每个操作数为 false 时才返回 false。

#!/bin/bash

echo -n "Enter any number:"
read n

if [[ ( $n -eq 15 || $n -eq 45 ) ]]
then
echo "You won"
else
echo "You lost!"
fi

 

这个简单的示例演示了 OR 运算符如何在 Linux shell 脚本中工作。只有当用户输入数字 15 或 45 时,它才会宣布用户为获胜者。|| 符号表示 OR 运算符。

12.使用elif


图片

 


elif 语句代表 else if 并为实现链式逻辑提供了一种方便的方法。通过评估以下示例了解 elif 的工作原理。

#!/bin/bash

echo -n "Enter a number: "
read num

if [[ $num -gt 10 ]]
then
echo "Number is greater than 10."
elif [[ $num -eq 10 ]]
then
echo "Number is equal to 10."
else
echo "Number is less than 10."
fi

 


13.Switch语句


图片

 


Switch语句是 Linux bash 脚本提供的另一个强大功能。它可以用于需要嵌套条件的地方,但您不想使用复杂的 if-else-elif链。看看下一个例子。

#!/bin/bash

echo -n "Enter a number: "
read num

case $num in
100)
echo "Hundred!!" ;;
200)
echo "Double Hundred!!" ;;
*)
echo "Neither 100 nor 200" ;;
esac

 

条件写在 case 和 esac 关键字之间。*) 用于匹配除 100 和 200 之外的所有输入。

14.命令行参数


图片

 


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

#!/bin/bash
echo "Total arguments : $#"
echo "First Argument = $1"
echo "Second Argument = $2"

 

运行此脚本,并在其名称后加上两个附加参数。我将其命名为 test.sh,调用过程如下所述。

$ ./test.sh Hey Howdy

 

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

15.使用名称获取参数


图片

 


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

#!/bin/bash

for arg in "$@"
do
index=$(echo $arg | cut -f1 -d=)
val=$(echo $arg | cut -f2 -d=)
case $index in
X) x=$val;;
Y) y=$val;;
*)
esac
done
((result=x+y))
echo "X+Y=$result"

 

将此脚本命名为 test.sh 并调用它,如下所示。

$ ./test.sh X=44 Y=100

 

它应该返回 X+Y=144。此处的参数存储在“ $@ ”中,脚本使用 Linux cut 命令获取它们。

16.连接字符串


图片

 


字符串处理对于各种现代 bash 脚本都极为重要。值得庆幸的是,它在 bash 中更加舒适,并且允许以更精确、更简洁的方式来实现它。请参阅下面的示例以了解 bash 字符串连接。

#!/bin/bash

string1="Ubuntu"
string2="Pit"
string=$string1$string2
echo "$string is a great resource for Linux beginners."

 


17.字符串切片


图片

 

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

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

 

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

18.使用cut提取子串


图片

 


Linux cut 命令可以在您的脚本中使用来“剪切”字符串的一部分,也就是子字符串。下一个示例显示了如何做到这一点。

#!/bin/bash
Str="Learn Bash Commands from UbuntuPit"
#subStr=${Str:0:20}

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

 


19.添加两个值


图片

 

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

#!/bin/bash
echo -n "Enter first number:"
read x
echo -n "Enter second number:"
read y
(( sum=x+y ))
echo "The result of addition=$sum"

 

如您所见,在 bash 中添加数字相当简单。

20.添加多个值


图片

 


您可以使用循环来获取多个用户输入并将它们添加到您的脚本中。以下示例显示了这一点。

#!/bin/bash
sum=0
for (( counter=1; counter<5; counter++ ))
do
echo -n "Enter Your Number:"
read n
(( sum+=n ))
#echo -n "$counter "
done
printf "\n"
echo "Result is: $sum"

 

但是,省略(( ))将导致字符串连接而不是相加。所以,在你的程序中检查这样的事情。下期预告:
简单而有效的Shell脚本,想不起来的时候一看就懂(下)
推荐阅读

Linux 云计算 学习路线(建议收藏)

ifconfig已淘汰,ip登场

放后台的Linux任务没有了,试试这个命令

Linux 网络状态工具 ss 命令详解

这次终于搞明白VLAN技术了

终于有人把敏捷、DevOps、CI、CD讲清楚了


 

 

除每周二、四、六定期更新的《Linux云计算一站式教程》以外,其余时间雷哥会推送一些工作中遇到的小知识、实战经验总结的文章。后续都会收录在“实战经验”合集中。

图片

 


Cloud研习社
为Linux云计算零基础同学服务,致力于打造一套完整的linux云计算教程。包括新手学习路线、linux、存储、集群架构以及Docker,K8S,DevOps等
146篇原创内容
公众号

图片

 

收录于合集 #实战经验
 33
上一篇40个简单而有效的Shell脚本,想不起来的时候一看就懂(下)下一篇Docker入门-基础知识
阅读原文
阅读 170
posted @ 2022-08-20 11:28  往事已成昨天  阅读(53)  评论(0编辑  收藏  举报