在本教程中,我们将讨论 shell 脚本以及如何制作第一个 shell 脚本。它们通常被称为 shell 脚本,但我们将它们称为 Bash 脚本,因为我们将在其他 Linux shell 中使用 Bash。
有 zsh、tcsh、ksh 和其他 shell。
在之前的文章中,我们了解了如何使用 Bash shell 以及如何使用Linux命令.
Bash 脚本的概念是运行一系列命令来完成工作。
要从 shell 单步运行多个命令,您可以在一行中键入这些命令并用分号分隔。
pwd ; whoami
这是一个 Bash 脚本!
首先运行 pwd 命令,显示当前工作目录,然后运行 whoami 命令以显示当前登录的用户。
您可以根据需要运行多个命令,但有限制。您可以使用此命令确定最大参数。
getconf ARG_MAX
好吧,将命令放入一个文件中怎么样,当我们需要运行这些命令时,我们只运行该文件。这称为 Bash 脚本。
首先,使用以下命令创建一个新文件触摸命令。在任何 Bash 脚本的开头,我们应该定义将使用哪个 shell,因为 Linux 上有很多 shell,Bash shell 就是其中之一。
shell脚本shebang
编写 Bash 脚本时键入的第一行是 (#!),后跟您将使用的 shell。
#!
#!/bin/bash
如果您在 shell 脚本中的任何行前面使用井号 (#),则该行将成为注释,这意味着它将不会被处理,但是,上面的行是一个特例。这一行定义了我们将使用的 shell,在我们的例子中是 Bash shell。
每行输入一个 shell 命令,如下所示:
#!/bin/bash
# This is a comment
pwd
whoami
您可以在同一行中键入多个命令,但必须用分号分隔它们,但最好将命令写在单独的行上;这将使以后的阅读变得更简单。
设置脚本权限
编写 shell 脚本后,保存文件。
现在,将该文件设置为可执行;否则,它会给你拒绝许可。您可以查看如何使用设置权限chmod 命令.
chmod +x ./myscript
然后尝试通过在 shell 中键入以下内容来运行它:
./myscript
是的,它被执行了。
制作你的第一个 Bash 脚本
正如我们从其他帖子中了解到的,打印文本是使用
echo
command.
编辑您的文件并输入以下内容:
#!/bin/bash
# our comment is here
echo "The current directory is:"
pwd
echo "The user logged in is:"
whoami
查看输出:
完美的!现在我们可以运行命令并显示文本:
echo
如果您不知道 echo 命令或如何编辑文件,我建议您查看以前的文章基本 Linux 命令.
使用变量
变量允许您存储信息以便在脚本中使用它。
您可以在 shell 脚本中定义两种类型的变量:
环境变量
有时你需要与系统变量进行交互;你可以通过使用来做到这一点环境变量.
#!/bin/bash
# display user home
echo "Home for the current user is: $HOME"
请注意,我们将 $HOME 系统变量放在双引号之间,并且它正确打印了 home 变量。
如果我们想打印美元符号本身怎么办?
echo "I have $1 in my pocket"
因为变量 $1 不存在,所以它不起作用。那么如何克服呢?
您可以使用转义字符,即美元符号之前的反斜杠 \,如下所示:
echo "I have \$1 in my pocket"
现在可以了!!
用户变量
此外,您还可以在脚本中设置和使用自定义变量。
您可以用与以下相同的方式调用用户变量:
#!/bin/bash
# User variables
grade=5
person="Adam"
echo "$person is a good boy, he is in grade $grade"
chmod +x myscript
./myscript
命令替换
您可以使用命令替换从命令结果中提取信息。
您可以使用以下方法之一执行命令替换:
确保键入反引号字符时,它不是单引号。
您必须用两个反引号将命令括起来,如下所示:
mydir=`pwd`
或者另一种方式:
mydir=$(pwd)
所以脚本可能是这样的:
#!/bin/bash
mydir=$(pwd)
echo $mydir
您可以将命令的输出存储在 mydir 变量中。
数学计算
您可以使用 $(( 2 + 2 )) 格式执行基本数学计算:
#!/bin/bash
var1=$(( 5 + 5 ))
echo $var1
var2=$(( $var1 * 2 ))
echo $var2
就这么简单。
如果-那么语句
您的 shell 脚本将需要条件语句。就像如果值小于 10,则执行此操作,否则执行此操作。你可以想象任何你想要的逻辑。
if-then 语句最基本的结构是这样的:
如果命令;然后
做一点事
fi
这是一个例子:
#!/bin/bash
if whoami; then
echo "It works"
fi
自从
whoami
将返回我的用户,因此条件将返回 true,并且它将打印消息。
让我们更深入地挖掘并使用我们知道的其他命令。
检查用户是否存在
也许在用户文件中搜索特定用户
/etc/passwd
如果存在记录,请在消息中告诉我。
#!/bin/bash
user=likegeeks
if grep $user /etc/passwd; then
echo "No such a user $user"
fi
我们使用
/etc/passwd
文件。您可以查看我们的教程grep 命令.
如果用户存在,shell 脚本将打印该消息。
如果用户不存在怎么办?该脚本将退出执行,而不告诉我们该用户不存在。好吧,让我们进一步改进脚本。
if-then-else 语句
if-then-else 语句采用以下结构:
如果命令;然后
做一点事
else
做另一件事
fi
如果第一个命令运行并返回零,则表示成功,则不会命中 else 语句之后的命令;否则,如果 if 语句返回非零;这意味着语句条件失败,在这种情况下,shell 将执行 else 语句之后的命令。
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd; then
echo "The user $user Exists"
else
echo "The user $user doesn’t exist"
fi
到目前为止我们做得很好,继续前进。
现在,如果我们需要更多 else 语句怎么办?
嗯,这很简单,我们可以通过嵌套 if 语句来实现这一点,如下所示:
如果条件1;然后
commands
elif条件2;然后
commands
fi
如果第一个命令返回零;表示成功,它将执行它后面的命令,否则如果第二个命令返回零,它将运行它后面的命令,否则如果这些命令都不返回零,它将只执行最后的命令。
#!/bin/bash
user=anotherUser
if grep $user /etc/passwd; then
echo "The user $user Exists"
elif ls /home; then
echo "The user doesn’t exist"
fi
你可以想象任何场景,也许如果用户不存在,使用创建一个用户
useradd
命令或做任何其他事情。
组合测试
您可以使用 AND (&&) 或 OR (||) 命令组合多个测试。
#!/bin/bash
dir=/home/likegeeks
name="likegeeks"
if [ -d $dir ] && [ -n $name ]; then
echo "The name exists and the folder $dir exists."
else
echo "One test failed"
fi
仅当两个测试都成功时,此示例才会返回 true;否则,就会失败。
此外,您还可以以同样的方式使用 OR (||):
#!/bin/bash
dir=/home/likegeeks
name="likegeeks"
if [ -d $dir ] || [ -n $name ]; then
echo "Success!"
else
echo "Both tests failed"
fi
如果其中一个或两个成功,此示例将返回成功。
只有当他们两个都失败时,它才会失败。
数字比较
您可以使用数字比较检查在两个数值之间执行数字比较,如下所示:
number1 -eq number2 检查 number1 是否等于 number2。
number1 -ge number2 检查 number1 是否大于或等于 number2。
number1 -gt number2 检查 number1 是否大于 number2。
number1 -le number2 检查 number1 是否小于或等于 number2。
number1 -lt number2 检查 number1 是否小于 number2。
number1 -ne number2 检查 number1 是否不等于 number2。
作为例子,我们就尝试其中一个,其余的都是一样的。
请注意,比较语句位于方括号中,如图所示。
#!/bin/bash
num=11
if [ $num -gt 10 ]; then
echo "$num is bigger than 10"
else
echo "$num is less than 10"
fi
该数字大于十,因此它将运行第一个语句并打印第一个回显。
字符串比较
您可以使用以下方式之一比较字符串:
string1 = string2 检查 string1 是否与 string2 相同。
string1 != string2 检查 string1 是否与 string2 不同。
string1
string1 > string2 检查 string1 是否大于 string2。
-n string1 检查 string1 是否长于零。
-z string1 检查 string1 的长度是否为零。
我们可以将字符串比较应用于我们的示例:
#!/bin/bash
user="likegeeks"
if [ $user = $USER ]; then
echo "The user $user is the current logged in user"
fi
关于的一个棘手的注释大于和小于对于字符串比较,他们MUST be 用反斜杠转义因为如果仅使用大于符号,则会显示错误的结果。
所以你应该这样做:
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
它可以运行,但会发出以下警告:
./myscript: line 5: [: too many arguments
要修复此问题,请用双引号将 $vals 括起来,强制它保持为一个字符串,如下所示:
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
关于的重要说明大于和小于用于字符串比较。检查以下示例以了解差异:
#!/bin/bash
v1=Likegeeks
v2=likegeeks
if [ $v1 \> $v2 ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
sort myfile
像极客
喜欢极客
测试条件认为小写字母比大写字母大。
sort
与排序命令不同,排序命令的作用相反。
测试条件基于 ASCII 顺序。
sort
而排序命令则基于系统设置的编号顺序。
文件比较
您可以使用以下运算符来比较和检查文件:
-d my_file 检查它是否是一个文件夹。
-e my_file 检查文件是否可用。
-f my_file 检查它是否是一个文件。
-r my_file 检查它是否可读。
my_file –nt my_file2 检查 my_file 是否为newer比 my_file2.
my_file –ot my_file2 检查 my_file 是否为older比 my_file2.
-O my_file 检查文件所有者和登录用户是否匹配。
-G my_file 检查文件和登录用户是否具有相同的组。
正如他们所暗示的那样,您将永远不会忘记他们。
让我们选择其中之一为例:
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]; then
echo "Directory $mydir exists"
cd $mydir
ls
else
echo "NO such file or directory $mydir"
fi
我们不会将它们中的每一个都作为示例。您只需按原样键入方括号之间的比较即可正常完成脚本。
还有一些其他高级的 if-then 功能,但我们将在另一篇文章中介绍。
就目前而言。我希望你喜欢它并继续练习。
谢谢。