版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。
source 命令。
source 很多时候在 bash 中被简写为句点(.),是脚本调用的一种特殊形式。Shell 的基本
工作方式就是先创建子进程,然后执行新的命令;但是如果希望脚本在 Shell 进程内直接执
行,则可用 source 命令来调用脚本。它仅限于脚本,不可以对二进制文件使用。
通常来说,如果希望一个脚本能够改变当前 Shell 自身的一些属性,则必须在 Shell 进
程内执行。如修改了系统配置脚本/etc/profile 或个人配置脚本~/.profile 和~/.bashrc,欲使其
生效,必须用 source 命令执行该文件。例如:
$ source /etc/profile 或者 . /etc/profile
位置参数
位置参数就是按照位置引用的命令行参数,Shell 脚本被调用时可以传递参数给它。在
脚本中按照顺序就是$0、$1„„来引用,依此类推。其中,$0 代表命令本身,所以一般在
Shell 中引用命令行参数时不包括$0。
有如程序所示的脚本,会包括程序本身名称$0 在内的四个位置参数。
程序清单 打印位置参数示例
#!/bin/sh
echo $0
echo $1
echo $2
echo $3
实际运行结果如图所示。
脚本命令行参数
关于命令行参数的特殊变量还有三个:$#、$*和$@,它们的用法差异如表所列。
$#、$*和S@变量说明
$# 代表命令行参数的个数
$* 代表全部的命令行参数,而且全部作为一个单词。引用时必须在“”之中
$@ 代表所有的命令行参数,但是每个参数是一个独立的单词,引用时也要在“”中
说明:以上三个变量统计命令行参数中均不包含$0。
如程序清单 演示脚本,分别打印参数个数,使用$*和$@创建文件。
程序清单参数变量不同点演示
#!/bin/sh
echo $#
touch "$*"
ls -l
touch "$@"
ls -l
因为 touch 可以接受多个参数同时创建多个文件,每个参数是一个单词;$*将所有参数
当作一个单词,故创建了一个文件名是全部参数的文件;而$@的每一个参数都是独立的单
词,故每个参数都作为文件名创建了一个独立文件。在脚本中使用了 ls –l 命令列目录来验证
true:0 false:1
对于 Bash 来说,每一个命令同时也是一个逻辑表达式,用它们的返回值来代表它们的
真值,返回 0 为真,返回非 0 为假。这个值就是命令的 main()函数的返回值,该值可用“$?”
来获取。在脚本中 true 命令也经常用冒号(:)来代替
函数
Bash 脚本中也可以定义函数,Bash 里的函数行为像是一个独立的子脚本,故对于调用
者来说,Shell 中的函数和一个独立的命令区别并不大。
Bash 中有两种定义函数的方法,一种是通过 function 关键字来定义,如:
function function_name {
command...
}
另有一种定义方法与 C 函数类似:
function_name () {
command...
}
后一种更具有可移植性,推荐使用。 Bash 中没有类似于 C 中提前“声明”函数的方法,
任何函数都应该在其被调用前完整定义。
#!/bin/sh
echo"demo for function and call"
fun() {
echo "I‘am in func()"
}
fun
echo "end"