Shell脚本

Shell编程简介

Shell编程小入门

Shell是每个Unix和Linux系统的标准接口。 用户和管理员都具有使用Shell的经验,将命令组合到脚本中是很自然的事情。 但是,这只是冰山一角。

我最近花了一些时间学习shell和编写脚本,并且我已经意识到shell实际上是一种具有变量和函数的完整编程语言 ,并且也是诸如数组(包括关联数组)之类的更高级的结构,因此直接与内核链接后,它的语法本身就内置了本地IO原语,以及流程和作业控制。

我已经计划了一系列的几篇文章,并且我会尽量简洁明了。 此外,本文最初是在DEV上发布的。

那么,什么是shellscript?

Shellscripting正在编写一系列命令以供Shell执行。 它可以将冗长而重复的命令序列组合成一个简单的脚本,该脚本可以随时存储和执行,这对于自动化任务非常有用。 这减少了最终用户所需的工作量。

脚本的命令由解释器(外壳程序)一一执行,您可以在命令行中键入的所有内容也可以放入脚本中。

在运行脚本之前,我们需要使用以下命令设置执行权限:

chmod 755 script.sh

然后,我们可以通过命令行使用./script.sh运行脚本(如果在同一目录中)。


变量和Shebang#

hash-bang(也称为shebang)是文件开头的一对特殊字符,表示后面的可执行文件是执行脚本的解释器(和可选参数),例如:
#! /bin/bash #! /bin/bash#! /bin/zsh #! /bin/zsh或最佳移植性#! /bin/sh #! /bin/sh (这将运行系统外壳程序,但不能保证某些高级功能)。

请注意,本系列中的大多数代码仅通过`bash`和`zsh` shell进行了测试,大多数sh脚本可以由Bash运行而无需修改,但是有些东西无法正常工作。

  #!  / bin / sh 
睡90

当我们执行包含#!的脚本时#! 实际发生的情况是执行了解释程序,并将用于调用脚本的路径作为参数传递。 为了确认这一点,假设我们有sleepy.sh脚本,然后可以使用./sleepy.sh &来运行脚本,其中&用于将脚本作为后台进程运行并返回脚本执行进程的PID。 然后,我们可以运行ps -fp [PID]来查看进程信息:

  UID PID PPID C STIME TTY TIME CMD 
505 65418 59985 0 7:09 PM ttys000 0:00.01 / bin / zsh ./sleepy.sh
```
我们可以在这里看到CMD下 ./sleepy.sh 被传递给我 / bin / zsh 二进制作为参数。

如果脚本不包含#! 命令是使用默认Shell执行的,但最好的做法是明确使用,因为不同的Shell的语法略有不同。

另外,我们不必仅使用shell作为脚本的解释器。 我们还可以使用其他二进制文件,例如python

  #!  / usr / bin / pythonprint“这是一个Python脚本” $ chmod 755 hi.py 
$ ./hi.py
这是一个Python脚本

变数

没有变量,很难完成很多工作:您无法计算,循环或读取来自用户或环境的输入,并且您无法进行任何更改。 变量是一块内存,您可以通过引用其名称来存储任意数据,然后再次检索它。

用于创建变量的语法为: VARIABLE_NAME=”Value” 。 重要的是要注意,变量名区分大小写,并且按照惯例,变量名应全部使用大写。 声明变量时,还请确保不要在=号之前和之后使用空格。

默认情况下,所有变量都是全局变量,必须在使用前定义它们。
可以在函数中定义变量(我们最终将讨论它们),但是我们不能在调用函数之前访问它们。

 函数clarifyVar(){ 
FUNC_VAR = 1
}#FUNC_VAR目前尚未定义,因此不会返回任何内容
$ echo $ FUNC_VAR
defineVar#这就是我们在shell中调用函数的方式
#FUNC_VAR现在可用,因为该函数已被调用
echo $ FUNC_VAR#输出:1

有效的变量名称可以由字母,数字和下划线组成,但数字不能为名称中的第一个字符。

  #有效名称 
DARK_JEDI =“瓦德”
GR4Y_J3DI =” Ahsoka”
Regular_Jedi =” Obi-Wan”#无效名称
3DARK_LORDS =” Vader Sidius Plagueis”
两重=“ Solo Leia”
ONE @ SHIP =“乌木鹰”#! / bin / bash
MY_SHELL =” zsh”
echo“我喜欢$ MY_SHELL shell”#输出:我喜欢zsh shell

我们还可以将变量名称括在花括号中:

  MY_SHELL =” zsh” 
echo“我喜欢$ {MY_SHELL} shell”#输出:我喜欢zsh shell

大括号语法是可选的,除非您需要使用其他数据在变量之前或之后,例如:

  MY_SHELL =“ bash” 
回声“我在键盘上正在$ {MY_SHELL}!”
#输出:我在键盘上b。

没有花括号,这将不起作用,因为解释器会将名称变量后的那一部分作为变量名称的一部分。

另一个最佳实践是在使用变量时将其括在引号中,以防止某些意外的副作用。

我们还可以将命令的输出分配给变量:

  SERVER_NAME = $(主机名) 
回声“您正在$ {SERVER_NAME}上运行此脚本”

局部变量

局部变量是使用local关键字创建的,并且只有函数可以具有局部变量 ,因此只能在声明它们的函数中访问它们。 上面我已经说过,按照惯例,变量应该全部用大写字母表示,但是,正如一位用户指出的那样,您只ALL_CAPS_NAMES用于环境变量或属于Shell世界的其他内容。 脚本本地变量应为lower_snake_case以避免发生冲突并暗示它们在脚本外部不会产生任何影响。

 函数myFunc(){ 
local local_var =”我在本地范围内”
}

最佳做法是仅在函数内部使用局部变量。

增加local关键字使bash成为编写更复杂的函数和库的实用shell。


到此为止,我将在下一个中写一些有关testsconditionals的内容。 感谢您的阅读,如果您有任何疑问,请问问!