bash脚本切换管理员
Bash外壳绝对不是唯一的外壳,但它是功能最强大的外壳之一。 对于需要开发严肃的应用程序的系统管理员来说,这是一种流行的选择,这些应用程序超出了要在系统上运行的简单命令列表的范围。 其他shell有很多很好的用途(例如,我默认使用Tcsh编写Git钩子 ),但是Bash是编写严肃脚本的简单选择,这就是原因。
功能
要在Bash脚本中创建函数,请使用关键字function :
function foo
{
# code here
}
函数对程序员很有用,因为它们有助于减少代码中的冗余。 代码中较少的冗余减少了所需的维护量,因为如果您需要更改值,则只需在它的功能中找到一次,而不是每次使用它。
Bash如何堆积
除了Tcsh例外,shell中的功能都得到了很好的支持。
- Korn Shell:使用与Bash相同的语法
- Zsh:使用与Bash相同的语法
- Fish:使用自定义功能命令创建和操作功能
- Tcsh:有时,您可以使用goto语句来解决Tcsh中缺少功能的问题,但这并不是最佳选择。
重新导向
在任何编程和脚本语言中,输入和输出的重定向都是非常标准的功能,当您使用Shell时,它会固有地发生。 您输入文字; 你得到输出。 有些外壳比其他外壳更健壮,而且您可能会猜到,Bash为您提供了几乎所有可以想象的选项。
基础很简单:使用一定数量的>字符重定向输出,使用一定数量的<字符重定向输入。 但是,对于特定类型的输入和输出,有一些特殊的名称。 例如,错误消息进入名为stderr的流,出于重定向的目的,该流被指定为2> 。 例如,此命令将错误消息定向到名为output.log的文件:
$ ls / void 2 > output.log
Bash如何堆积
与外壳程序交互时,重定向是一种非常方便的功能,尽管所有主要外壳程序都支持某种重定向方式,但并非所有功能部件在所有外壳程序中都可用。
- Korn Shell:使用与Bash相同的语法
- Zsh:使用与Bash相同的语法
- 鱼:部分支持
- Tcsh:部分支持
资源
例如,当您在Bash中使用source时,它将在当前目录中搜索您引用的文件。 如果找不到要获取的文件,则改为搜索您的PATH 。 这是一个很小的好处,但是它非常方便,因为它允许您将常用功能存储在驱动器上的集中位置,然后将您的环境视为集成开发环境(IDE)。 您不必担心函数的存储位置,因为您知道它们在/ usr / include本地等效目录中,因此无论您在何处获取它们,Bash都可以找到它们。
Bash如何堆积
当您使用source命令或缩写(和POSIX正确)时,Bash是唯一同时搜索当前目录和PATH的 shell 。 符号。
键绑定
许多外壳程序允许您自定义与它们的交互方式,当然,与基于文本的界面的任何交互都始于键入。 在Bash中,您可以查看当前的键盘映射:
$ bind -V | grep keymap
要更改键盘映射(例如,从Emacs更改为Vi):
$ bind 'set keymap vi'
Bash如何堆积
仅Bash和Zsh提供了用于键绑定的内置预设。
历史
Bash具有任何Shell中最健壮的命令历史界面。 Bash版本的历史记录允许进行反向搜索,快速回忆,历史记录编辑(包括按行号删除条目)等等。 所有其他外壳组合在一起都可以匹配Bash的历史接口,但是没有一个(甚至是Zsh,通常模仿Bash)也不能单独匹配。
历史操纵
历史命令不是与过去互动的唯一方法。 Bash具有丰富的速记符号集合,使您可以调用甚至修改Shell历史记录中的命令。
例如,要再次运行最新命令( &nbsp; history | tail -n1的输出,请使用由&nbsp;在此处指定的前导空格 , 以使历史记录命令不在您的历史记录中),您只需输入!! 进入Bash:
$
wc
-w luarocks.xml
1284 luarocks.xml
$
!!
1284 luarocks.xml
要在用其他命令替换该命令的一部分时运行最新命令,可以使用字符串替换:
$
wc
-w luarocks.xml
1284 luarocks.xml
$ ^-w^-l
$
wc
-l luarocks.xml
214 luarocks.xml
有许多这样的快捷方式,它们全部记录在Bash手册和信息页面中。 诚然,这些技巧中的许多技巧都是针对高级用户的,他们对Bash的交互是如此重复和平凡,以致于模糊,看似随机的按键组合非常有用。 Zsh有效地模仿了Bash,但是没有其他Shell提供这种最大化的效率。
Bash如何堆积
Bash的历史命令是其他任何Shell都无法比拟的(Zsh接近,但缺少某些选项,例如按行号删除的功能)。
关联数组
大多数Shell提供创建,操作和查询索引数组的功能。 用简单的英语来说,索引数组是带有数字前缀的事物的列表。 事物列表及其分配的编号方便地包装在单个变量中,这使在代码中轻松“携带”它成为可能。
但是,Bash可以创建关联数组,并将这些数组与其他任何数组一样对待。 关联数组使您可以创建键和值对的列表,而不仅仅是编号的值。
关联数组的好处是键可以是任意的:
$
declare
-A userdata
$ userdata
[ name
] =seth
$ userdata
[ pass
] =8eab07eb620533b083f241ec4e6b9724
$ userdata
[
login
] =
`
date
--utc +
% s
`
查询任何键:
$
echo
" ${userdata[name]} "
seth
$
echo
" ${userdata[login]} "
1583362192
您期望从阵列执行的大多数常规阵列操作均可用。
Bash如何堆积
Bash是唯一为关联数组提供全面支持的外壳程序(同样,Zsh接近,但缺少列出键的功能)。
选择Bash进行Shell脚本编写
Bash中的某些便利功能不符合POSIX。 从理论上讲,这意味着您可以编写一个在没有Bash的系统上无法按预期运行的Bash脚本。 如果发生这种情况,则表示您的脚本不是“可移植的”。
但是实际上,Bash是免费的开源软件,因此无论运行Linux,BSD,OpenIndiana,Windows还是macOS,任何人都可以安装它。 安装Bash不需要用户使用Bash作为其默认shell,甚至不需要自觉启动它,因为一个好的shell脚本会在其顶部shebang行(例如#!/ bin / bash )中标识它使用的shell。
如有疑问,请在文档中包括Bash作为Shell脚本的依赖项(即使它是唯一的依赖项),以警告用户它是Bash脚本而不是通用Shell脚本。
Bash有许多便利,我发现这些因素超过了用户是否已安装Bash的担忧。 就像Python或Java或任何其他软件一样,有时也存在依赖关系。 如果您喜欢Bash并发现它的速记和快捷方式有用,请不要改变自己。
下载有关面向系统管理员的Bash脚本的电子书!
翻译自: https://opensource.com/article/20/4/bash-sysadmins-ebook
bash脚本切换管理员