历史上,shell一直是类Unix系统的本地命令行解释器。它已被证明是Unix的主要功能之一,并发展成为一个全新的主题。Linux提供了各种功能强大的shell,包括Bash、Zsh、Tcsh和Ksh。这些外壳最令人惊讶的特性之一是其可编程性。创建简单而有效的Linux shell脚本来处理日常工作非常容易。
1. Hello World
echo命令用于在bash中打印信息。它类似于C函数“printf”,并提供了许多常见选项,包括转义序列和重定向。将以下行复制到名为echo.sh的文件中,并使其可执行,如上所述。
#!/bin/bashecho "Printing text"echo -n "Printing text without newline"echo -e "\nRemoving \t special \t characters\n"运行脚本以查看其功能。-e选项用于告诉echo传递给它的字符串包含特殊字符,需要扩展功能。
3.使用注释
注释对文档很有用,是高质量代码库的要求。将注释放在处理关键逻辑的代码中是一种常见的做法。要注释掉一行,只需在其前面使用#(hash)字符。例如,请查看下面的bash脚本示例。
#!/bin/bash # Adding two values ((sum=25+35)) #Print the result echo $sum此脚本将输出数字60。首先,在某些行之前使用#检查注释的使用方式。不过,第一行是一个例外。它被称为shebang,让系统知道在运行这个脚本时要使用哪个解释器。
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方括号周围的空格是必填的。
if CONDITION then STATEMENTS fi只有当条件为真时,才会执行这些语句。fi关键字用于标记if语句的结尾。下面显示了一个快速示例。
#!/bin/bashecho -n "Enter a number: "read numif [[ $num -gt 10 ]]thenecho "Number is greater than 10."fi如果通过输入提供的数字大于10,上述程序将仅显示输出。-gt表示大于;类似地-lt表示小于-le表示小于等于;且-ge表示大于等于。此外,还需要[[]]。
9.使用If Else进行更多控制
将else构造与if结合起来,可以更好地控制脚本的逻辑。下面显示了一个简单的示例。
#!/bin/bash read nif [ $n -lt 10 ];thenecho "It is a one digit number"elseecho "It is a two digit number"fi其他部分需要放在if的动作部分之后和fi之前。
OR运算符是另一个关键的构造,它允许我们在脚本中实现复杂、健壮的编程逻辑。与AND相反,当OR运算符的任一操作数为真时,由OR运算符组成的语句返回真。仅当由OR分隔的每个操作数为假时,它才返回假。
#!/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运算符如何在Linuxshell脚本中工作。只有当用户输入数字15或45时,它才会宣布用户为获胜者。||符号表示OR运算符。
12.使用El if
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.case 条件
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以外的所有输入。
下面的示例显示了如何获取带有名称的命令行参数。
#!/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。这里的参数存储在“$@”中,脚本使用Linuxcut命令获取它们。
16.连接字符串
字符串处理对于广泛的现代bash脚本来说非常重要。值得庆幸的是,它在bash中更加舒适,并允许以更精确、简洁的方式实现这一点。请参见下面的示例,了解bash字符串连接。
#!/bin/bash string1="Ubuntu"string2="Pit"string=$string1$string2echo "$string is a great resource for Linux beginners."
17.字符串截取
与许多编程语言不同,bash不提供任何用于剪切字符串部分的内置函数。然而,下面的示例演示了如何使用参数展开来实现这一点。
#!/bin/bashStr="Learn Bash Commands from UbuntuPit"subStr=${Str:0:20}echo $subStr该脚本应打印出“学习Bash命令”作为其输出。参数展开形式为${VAR_NAME:S:L}。这里,S表示起始位置,L表示长度。
在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中添加数字相当简单。
与任何编程方言一样,函数在Linux shell脚本中扮演着重要角色。它们允许管理员创建自定义代码块以供频繁使用。下面的演示将概述函数如何在Linux bash脚本中工作。
#!/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()函数接收的数据。
下一个shell脚本示例显示如何检查bash程序中文件的存在。
#!/bin/bash filename=$1 if [ -f "$filename" ]; then echo "File exists" else echo "File does not exist" fi我们直接从命令行传递文件名作为参数。
29.从Shell脚本发送邮件
从bash脚本发送电子邮件非常简单。下面的简单示例将演示一种从bash应用程序执行此操作的方法。
#!/bin/bashrecipient=”admin@example.com”subject=”Greetings”message=”Welcome to UbuntuPit”`mail -s $subject $recipient <<< $message`它将向收件人发送包含给定主题和消息的电子邮件。
30.解析日期和时间
下一个bash脚本示例将向您展示如何使用脚本处理日期和时间。同样,Linuxdate命令用于获取必要的信息,我们的程序执行解析。
#!/bin/bashyear=`date +%Y`month=`date +%m`day=`date +%d`hour=`date +%H`minute=`date +%M`second=`date +%S`echo `date`echo &#34;Current Date is: $day-$month-$year&#34;echo &#34;Current Time is: $hour:$minute:$second&#34;运行此程序以了解其工作原理。此外,尝试从终端运行date命令。
31.sleep命令
sleep命令允许shell脚本在指令之间暂停。它在许多场景中都很有用,例如执行系统级作业。下一个示例显示了shell脚本中的sleep命令。
#!/bin/bash echo &#34;How long to wait?&#34; read time sleep $time echo &#34;Waited for $time seconds!&#34;该程序暂停最后一条指令的执行,直到$time秒,在本例中,用户提供了这一点。
32.wait命令
wait命令用于暂停Linux bash脚本中的系统进程。查看下面的示例,详细了解这在bash中的工作方式。
#!/bin/bash echo &#34;Testing wait command&#34; sleep 5 & pid=$! kill $pid wait $pid echo $pid was terminated.
33.显示上次更新的文件
下面的示例将对目录中的所有文件应用自定义扩展名。创建一个新目录,并将一些文件放在其中以供演示。我的文件夹共有五个文件,每个文件名为test,后跟(0-4)。我已将此脚本编程为在文件末尾添加(.UP)。您可以添加所需的任何扩展名。
#!/bin/bash dir=$1 for file in `ls $1/*` do mv $file $file.UP done首先,不要从任何常规目录尝试此脚本;相反,请从测试目录运行此命令。此外,您需要提供文件的目录名作为命令行参数。对当前工作目录使用句点(.)。
35.打印文件或目录的数量
下面的Linuxbash脚本查找给定目录中存在的文件或文件夹的数量。它使用Linux find命令来执行此操作。首先,需要传递目录名以从命令行搜索文件。
#!/bin/bash if [ -d &#34;$@&#34; ]; thenecho &#34;Files found: $(find &#34;$@&#34; -type f | wc -l)&#34;echo &#34;Folders found: $(find &#34;$@&#34; -type d | wc -l)&#34;elseecho &#34;[ERROR] Please retry with another folder.&#34;exit 1fi如果指定的目录不可用或存在权限问题,程序将要求用户重试。
Shell脚本提供了一种强大的方法来备份文件和目录。以下示例将备份过去24小时内修改的每个文件或目录。该程序使用find命令执行此操作。
#!/bin/bash BACKUPFILE=backup-$(date +%m-%d-%Y)archive=${1:-$BACKUPFILE} find . -mtime -1 -type f -print0 | xargs -0 tar rvf &#34;$archive.tar&#34;echo &#34;Directory $PWD backed up in archive file \&#34;$archive.tar.gz\&#34;.&#34;exit 0备份过程成功后,它将打印文件和目录的名称。
38.检查你是否是root用户
下面的示例演示了通过Linux bash脚本快速确定用户是否为root用户的方法。
#!/bin/bash ROOT_UID=0 if [ &#34;$UID&#34; -eq &#34;$ROOT_UID&#34; ] then echo &#34;You are root.&#34; else echo &#34;You are not root&#34; fi exit 0此脚本的输出取决于运行它的用户。它将根据$UID匹配根用户。