在Unix或Linux系统上创建脚本可能非常简单,也可能非常复杂;这完全取决于你想让脚本做多少事情。在这篇文章中,我们将看看脚本的基本知识——如果你以前从未构建过脚本,那么如何开始。
识别壳
UNIX和Linux系统今天有许多可以使用的shell。每个shell都是命令解释器。它读取命令并将它们发送到内核进行处理。
抨击是最受欢迎的,但还有zsh,csh,TCSH.和科恩.甚至有一个叫鱼由于其有用的命令自动完成选项,这对于Linux初学者来说可能特别好。要确定您使用的shell,请使用此命令:
$ echo $ shell / bin / bash
您还可以通过检查来确定您的主shell/ etc / passwd文件:
/home/nemo:/bin/bash . conf . conf . conf . conf . conf . conf . conf . conf< = = /bin/bash
确定Linux系统上有哪些shell可用的一种方法是检查/ etc / shells文件。
$更多/ etc / shell#/ etc / shell:有效登录壳/ bin / sh / bin / dash / bin / bash / bin / rbash / bin / zsh / usr / bin / zsh / usr / bin /屏幕/ usr /Bin / TMUX / USR / BIN / FISH
上面显示的系统声称有9个可用的炮弹。
哪个shell最适合任何整除依赖性依赖于他们习惯使用的东西,因为脚本中的大部分语法都不表示您将找到的命令/ bin,/ usr / bin或者/usr/local/bin.相反,它们是壳牌本身的一部分,称为“内置”。这包括用于循环的命令(例如,为和尽管)。
对于脚本编写来说,一种简单的选择是使用命令行上使用的任何shell,因为毕竟,您或多或少会喜欢使用它。
选择你的shell.
要确定哪些可用的shell将在脚本中运行命令,请使脚本的第一行看起来像其中一个:
#!/bin/sh # !/ bin/dash #!/bin/bash #!/bin/rbash #!/bin/zsh #!/usr/bin/zsh #!/usr/bin/screen #!/usr/bin/tmux #!/usr/bin/fish
当脚本的第一行标识要使用的shell时,该shell将在脚本中运行命令。如果您不将shell作为脚本中的第一行包含,则在调用脚跟时使用的shell将是运行它的shell。
运行命令
您在Linux命令行上运行的任何命令都可以在脚本中运行,提供它与指定的shell兼容。使用您喜欢的文本编辑器并键入命令。这是一个非常简单的脚本,以日月为年份格式显示当前日期。我称这个脚本“今天”。
#!/ bin / bashdate +”%d %B %Y”
运行它......
今日美元2021年3月8日
添加一个评论
对于解释脚本的脚本添加注释是一个很好的想法 - 特别是当脚本长或语法复杂时,尤其是脚本。只需使用#符号开始评论。注释可以是单行的,也可以添加到脚本中的命令末尾。例如:
#!/ bin / bash#在循环中反复显示日期/时间,而true do echo-n“仍在运行......”日期睡眠300#睡眠5分钟完成
使文件可执行
要使脚本可执行,请使用chmod.命令并确保预期用户可以运行它。例如:
$ chmod 700 myscript # you can run it $ chmod 755 myscript # everyone can run it
如果脚本未设置为可执行文件,则它仍然可以使用“.“内置”源“(即,读取和运行)脚本。
$。今天08年3月20日
使用if命令
的如果命令用于测试条件或变量。在本例中,我们检查脚本是否在周五运行。
if['日期+ ' %A ' ' ==星期五];fi
一个基本的语法如果命令为“if value == other_value”。的==.执行比较操作,必须确保shell在比较操作符的两边各看到一个值。因此,您经常需要将字符串放在某种引号中。
了解变量
为了确保这一点是清楚的,重要的是要理解变量以一种方式赋值,而以另一种方式引用。给变量赋值时只使用它的名称,但在名称前面加上a$用它。
$ favnum = 11 $ echo $ favnum 11
提示用户输入
要在脚本中提示用户输入一些信息,您需要同时提供提示和命令来读取用户输入的内容。您还应该分配一个像本例中那样有意义的变量名。注意,使用echo - n命令意味着用户将在显示提示符时在同一行中输入响应。
echo -n“多少循环?>”读numloops
运行脚本的人将看到提示并提供他们的响应:
有多少圈?> 11
使用命令行参数
要使用用户随脚本名一起输入的参数,您需要知道如何识别它们。脚本参数将被分配名称$1,$2等等。对于要重复使用的任何参数,可以考虑将这些值分配给更有意义的变量名。
$!/ bin / bash如果[[$ 1!= [0-9] *]];然后回显“错误:1美元不是数字”退出
别的
循环fi = 1美元
在这种情况下,我们检查提供提供的第一个参数是数字和退出脚本如果不是。如果是响应是数字,然后我们将它分配给变量$循环稍后在脚本中使用。
在脚本中要做的另一件有用的事情是首先验证是否存在参数。否则,如上所示的语法将失败,因为shell将看到“if[[!=[0-9]*]];”,这将生成一个语法错误。
为了检查提供的参数的数量是否正确,你可以使用如下语法检查以确保至少提供了两个参数,否则,提醒用户需要行数和文件名:
#!/ bin / bash如果[ $# -lt 2 ]; then echo “Usage: $0 lines filename” exit 1 fi
不同的循环方式
有许多方法可以在脚本中循环。用为当你想要循环预设的次数。例如:
#!/ bin / bash为day in Sun Mon Tue Wed Thu Fri Sat do echo $day done
或者 …
#!/ bin / bash
字母在{a..Z} do echo $letter done
用尽管只要某种条件存在或不存在,即可循环循环。
#!/ bin / bash n = 1 while [$ n -le 4] do echo $ n((n ++))完成
使用案例陈述
案例语句允许您的脚本根据正在检查的值而不同的反应。在下面的脚本中,我们使用不同的命令来通过识别文件类型来提取作为参数提供的文件的内容。
#!/ bin / bash如果[ $# -eq 0 ]; then echo -n “filename> “ read filename else filename=$1 fi if [ ! -f “$filename” ]; then echo “No such file: $filename” exit fi case $filename in *.tar) tar xf $filename;; *.tar.bz2) tar xjf $filename;; *.tbz) tar xjf $filename;; *.tbz2) tar xjf $filename;; *.tgz) tar xzf $filename;; *.tar.gz) tar xzf $filename;; *.gz) gunzip $filename;; *.bz2) bunzip2 $filename;; *.zip) unzip $filename;; *.Z) uncompress $filename;; *.rar) rar x $filename ;; *) echo “No extract option for $filename” esac
注意,如果没有提供文件名,这个脚本还会提示输入文件名,然后检查以确保指定的文件实际存在。只有在那之后,它才会考虑拔牙。
对错误做出反应
您可以在脚本中检测和反应脚本中的错误,并在此过程中避免其他错误。诀窍是在运行命令后检查退出代码。如果出口代码具有除零以外的值,则发生错误。在此脚本中,我们希望看到Apache是否正在运行,但从支票发送输出/ dev / null.然后,我们检查退出代码是否不等于零,因为这表明了ps命令没有得到回复。如果退出代码是不是0时,脚本通知用户Apache没有运行。
#!/ bin / bash ps -ef |grep apache2> / dev / null如果[$?!= 0];然后Echo Apache未运行退出FI
总结
Linux系统上的脚本可以帮助确保以一致的方式完成复杂的处理,并且大大减少了运行一系列命令的麻烦。