@Chiang
2020-01-20T15:18:32.000000Z
字数 1933
阅读 439
Linux
Shell
建立 Shell 脚本的方法同建立普通文本文件的方式相同,利用自己称手的文本编辑器编辑即可。在 Shell 脚本中,采用 # 号来做程序注释。但是有一个特殊的符号需要注意,即 #! 。该符号虽以 # 号开头,但却不代表注释,该符号用于声明解释脚本所用的解释器,例如 #!/bin/bash 表示用 /bin 目录下的 bash 解释器来解释执行脚本。或许你会发现,在我们的第一个例子中,没有写这样类似的语句。如果在脚本中没有声明解释器,则会采用系统默认的解释器来执行。但一般情况建议加上,这样在平台移植的时候便于错误调试。
#!/bin/bash
# Filename: test1-2.sh
# Author: huoty
# CreateDate: 2015-08-21 13:35:00
echo "What is your name?"
read PERSON
echo "Hello, ${PERSON}"
该脚本从标准输入读取用户输入,然后再回显到输出。 read 用于从标准输入获取用户输入, PERSON 是一个变量,使用变量的方式是在变量前加美元符号 $ 。
对于 shell 脚本文件的命名没有任何限制,只要符合 UNIX/Linux 下的文件命令规则即可。Shell脚本文件的默认后缀名是 .sh 。在 UNIX/Linux 中不以文件的后缀名来区分的文件类型,所以在为 shell 脚本文件命名时不需要添加额外的后缀名。当然,也可以为你的 shell 脚本文件加上 .sh 的后缀名,这样一些编辑器会为文件添加语法高亮显示,这样看起来比较方便。
执行 shell 脚本的方式一般有三种。
这种方式是用输入重定向的方式让 Shell 从给定文件中读入命令行并进行相应的处理,其格式为:
sh < script-name
sh 实际上是一个软链接,它代表的是系统默认的 shell 解释器,用 ls -l `which sh` 命令可以查看,例如在我的系统上 sh 就指向的是 dash。既然说到这儿,我就简单说说 bash 与 dash 区别。dash 是轻量级的 shell 解释器,他比 bash 少了很多功能,但速度比 bash 快,例如变量的很多扩展功能 dash 就不支持。所以在编写脚本时,一定要注意文件头部申明的解释器类型,否则脚本程序可能无法正常运行。
这种方式是脚本名作为 Shell 命令的参数。利用该方式则可以在执行命令时向脚本传递参数。其格式为:
sh script-name [parameter]
给 shell 脚本添加可执行权限后变可以直接执行。添加可执行权限可以用如下命令:
chmod a+x script-name
在执行脚本时需要加上路径,也就是要让系统找到脚本文件的位置。例如在当前目录下则可用如下方式执行:
./script-name
如果想让编写的 Shell 脚本像 Shell 提供的命令一样为每个用户使用(即在任何位置直接输入命令即可执行),可以在编写好的 shell 脚本上为所有用户添加可执行权限后,将其放在命令搜索路径的目录之下(环境变量 PATH 所包含的路径,可以用 echo $PATH 命令查看),这样就等于为系统开发了一个新的命令工具。
Shell 接收用户输入的 shell 命令和脚本名进行分析。如果文件被标记有可执行权限,但不是被编译过的程序,就认为它是一个 shell 脚本。Shell 将读取其中的内容,并加以解释执行。
默认情况下,shell 脚本的执行是通过创建子进程来完成的。首先,交互式 shell(bash) fork/exec 一个子 shell(sh)用于执行脚本,父进程 bash 等待子进程 sh 终止。接着 sh 读取脚本中的内容执行,直到读到文件尾,sh终止。Sh 终止后,bash 继续执行,打印提示符等待用户输入。
如果将命令行下输入的命令用括号括起来,那么也会 fork 出一个子 shell 执行小括号中的命令,一行中可以输入由分号隔开的多个命令,例如:
(cd ..; ls -l)
当执行以上命令后你会发现,虽然执行了 cd .. 命令,但是 shell 当前的路径并没改变,这就是因为它是通过创建子进程来执行的原因。这跟执行脚本的效果是一样的。但是如果用 source
命令或者.
来执行脚本时,则不会创建子进程,而是直接在交互式 shell 中执行脚本中的命令。如下所示:
source ./script-name
或
. ./script-name
参考资料:
Shell 程序设计教程