每个职业都有最常用的工具。对于许多系统管理员来说,shell可能很熟悉。在大多数Linux和其他类Unix系统上,默认的shell是Bash。Bash是一个相当古老的程序,起源于80年代后期。但它建立在更多、更旧的shell之上,例如Cshell(csh)。让我们回顾一些基础知识。相信您在某些时候无意中以root身份运行命令并导致了某种问题?这里有一些非常简单的提示,可以防止您遇到此类问题。使用别名首先,为mv和rm等命令设置别名,指向mv-I和rm-I。这将确保运行rm-f/boot至少要求您进行确认。在RedHatEnterpriseLinux中,如果您使用root帐户,这些别名是默认设置的。如果您还想为普通用户帐户设置这些别名,只需将这两行放入主目录中名为.bashrc的文件中(这些也适用于sudo):aliasmv='mv-i'aliasrm='rm-i'您的root提示符您可以采取的另一项防止意外发生的措施是确保您知道何时使用root帐户。我通常这样做是为了让我在日常工作中使用的提示符能够很好地从根提示符中脱颖而出。如果将以下内容放入root主目录的.bashrc文件中,您将看到黑红色的root提示符,这是一个明确的信号,表明您(或其他任何人)应该谨慎行事。exportPS1="\[$(tputbold)$(tputsetab0)$(tputsetaf1)\]\u@\h:\w#\[$(tputsgr0)\]"实际上你应该尽可能避免以root身份登录,而是通过sudo运行大多数系统管理命令,但这是另一回事了。在实施了一些技巧来帮助防止使用root帐户的“意外副作用”之后,让我们看看Bash如何帮助您进行日常工作?控制历史文件您可能知道,当您在Bash中按下向上箭头键时,您可以查看并重复使用所有以前的命令。这是因为命令被保存到主目录中名为.bash_history的文件中。这个历史文件带有一组非常有用的设置和命令。首先,您可以通过键入history查看整个最近的命令历史记录,也可以通过键入history将其限制为最近的30个命令。您可以更好地控制Bash保存什么以及如何保存。例如,如果您将以下内容添加到您的.bashrc中,任何以空格开头的命令将不会保存到历史列表中:HISTCONTROL=ignorespace如果您需要使用该命令以明文形式写入密码。(是的,这很可怕,但它仍然会发生。)如果你不希望频繁执行的命令出现在历史记录中,请使用:HISTCONTROL=ignorespace:erasedups这样,每次使用命令时,它都会从历史记录中删除history从文件中删除所有以前的事件并仅将最后一次调用保存到历史列表中。我特别喜欢的历史记录设置是HISTTIMEFORMAT设置。这会将所有条目添加到历史文件中的时间戳。例如,我使用:HISTTIMEFORMAT="%F%T"当我输入5条历史记录时,我得到这样的完整信息:10092018-06-1122:34:38cat/etc/hosts10102018-06-1122:34:40echo$foo10112018-06-1122:34:42echo$bar10122018-06-1122:34:44sshmyhost10132018-06-1122:34:55vim.bashrc这让我更容易浏览我的命令历史并找到我用来设置SSH两天前到我家的隧道。BestBashPractices在编写Bash脚本时,我将列出最佳的11种用法(我是这么认为的)。11.Bash脚本可以变得复杂,添加注释并不那么复杂。因为如果你在周末后回到工作岗位并且不得不花时间弄清楚你上周五想做什么,请不要忘记添加注释。10.用花括号将所有变量名括起来,例如${myvariable}。养成使${variable}_suffix成为可能并提高整个脚本的一致性的习惯。9.计算表达式时不要使用反引号;请改用$()语法。可以使用:forfilein$(ls);相反地??做:forfilein`ls`;do前一个选项是可嵌套的,更容易阅读,并且会取悦普通的系统管理员。不要使用反引号。8、一致性好。选择一种风格并在整个脚本中坚持使用。显然,我更喜欢人们在反引号中选择$()语法,并将变量放在花括号中。7.使用适当的shebang作为Bash脚本。由于我正在编写Bash脚本并且只打算用Bash执行它们,所以我经常使用#!/usr/bin/bash作为我的shebang。不使用#!/bin/sh或#!/usr/bin/sh.您的脚本将执行,但它将以兼容模式运行。可能会发生许多意想不到的副作用。(当然,除非你想要兼容模式。)6.当比较字符串时,在if语句中引用变量是个好主意,因为如果你的变量为空,Bash将抛出这样一行错误:if[${myvar}=="foo"];thenecho"bar"fi将对这样的行求值为false:if["${myvar}"=="foo"];thenecho"bar"fi此外,如果您不确定变量的内容(例如,在解析用户输入时),引用变量以防止某些特殊字符的解释,并确保变量被视为单个单词,即使它包含空格。5.我想这是个人喜好问题,但我更喜欢使用双等号(==),即使在Bash中比较字符串时也是如此。但是,这是一个一致性问题,对于字符串比较,只有一个等号可以工作,我的考虑立即变成“一个等号是赋值运算符!”4.使用适当的退出代码。确保如果您的脚本无法执行某些操作,它会向用户显示书面失败消息(最好通过解决方法)并发送非零退出代码:#wehavefailedecho“Processhasfailedtocomplete,youneedtomanuallyrestartthewhatchamacallit”exit1这使得以编程方式调用从另一个脚本中调用脚本并验证它是否成功完成。3.使用Bash的内置机制为变量提供合理的默认值,或者如果你想定义的变量未定义则抛出错误:#thissetsthevalueof$myvartoredhat,并打印'redhat'echo${myvar:=redhat}#thisthrowsanerrorreading'Thevariablemyvarisundefined,dearreader'if$myvarisundefined${myvar:?Thevariablemyvarisundefined,dearreader}2.特别是如果你正在编写一个大脚本,特别是如果你正在与其他脚本一起处理那个大脚本,请考虑在内部定义变量时使用本地函数关键字。local关键字将创建一个仅在该函数内可见的局部变量。这限制了冲突变量的可能性。1.每个系统管理员有时都必须这样做:在控制台上调试某些东西,无论是数据中心的真实服务器还是虚拟化平台上的虚拟服务器。如果您必须以这种方式调试脚本,您会感谢自己记住了这一点:不要让脚本中的行太长!在许多系统上,控制台的默认宽度仍然是80个字符。如果您需要在控制台上调试脚本并且该脚本有很长的行,那将是一个悲剧。此外,行数较短的脚本(默认情况下仍为80个字符)在普通编辑器中也更易于阅读和理解!
