如果需要,提示可以执行 shell 脚本并在不同条件下表现不同。 您甚至可以在每次发出命令时让提示播放一首曲子,尽管这很快就会变得无聊。 更多信息可以在 Bash-Prompt HOWTO 中找到。
7.2.5. 外壳脚本
7.2.5.1.什么是脚本?
正如我们在 shell 配置示例中看到的,shell 脚本是一个包含 shell 命令的文本文件。 当调用 Bash 时将这样的文件用作第一个非选项参数时,并且 -c 也不 -s 选项,Bash 从文件中读取并执行命令,然后退出。 这种操作模式创建了一个
非交互式外壳。 当 Bash 运行 shell 脚本时,它会设置特殊参数 0 到文件名,而不是外壳的名称,并且位置参数(脚本名称之后的所有内容)被设置为剩余的参数,如果有的话。 如果没有提供额外的参数,位置参数将被取消。
可以使用以下命令使 shell 脚本可执行 CHMOD 命令打开执行位。 当 Bash 在搜索时发现这样的文件 PATH 对于命令,它会生成一个子shell 来执行它。 换句话说,执行
文件名 争论
相当于执行
打坏 文件名参数
如果“文件名”是一个可执行的 shell 脚本。 这个子 shell 重新初始化自己,所以效果就像调用了一个新的 shell 来解释脚本,除了父级记住的命令的位置(参见 哈希 在信息页面中)由孩子保留。
大多数 UNIX 版本都将此作为操作系统命令执行机制的一部分。 如果脚本的第一行以两个字符“#!”开头,则该行的其余部分指定程序的解释器。 因此,您可以指定 打坏, AWK, perl的 或其他一些解释器或 shell 并用该语言编写脚本文件的其余部分。
解释器的参数由脚本文件第一行解释器名称后面的单个可选参数、脚本文件名称和其余参数组成。 Bash 将在自己不处理它的操作系统上执行此操作。
Bash 脚本通常以
#! / bin / bash (假设 Bash 已经安装在 /箱),因为这确保了 Bash 将用于解释脚本,即使它是在另一个 shell 下执行的。
7.2.5.2. 一些简单的例子
一个非常简单的脚本,只包含一个命令,向执行它的用户打招呼:
[杰瑞@无处~] 猫你好.sh
#!/斌/庆典
echo "你好 $USER"
[杰瑞@无处~] 猫你好.sh
#!/斌/庆典
echo "你好 $USER"
该脚本实际上只包含一个命令, 回音,使用 价值 ($) USER 环境变量以打印为发出命令的用户定制的字符串。
另一个单行,用于显示已连接的用户:
#!/斌/庆典
谁| 剪切 -d " " -f 1 | 排序 -u
#!/斌/庆典
谁| 剪切 -d " " -f 1 | 排序 -u
这是一个包含更多行的脚本,我用它来制作目录中所有文件的备份副本。 脚本首先列出当前目录中的所有文件并将其放入变量中 清单. 然后它为每个文件设置副本的名称,然后复制文件。 对于每个文件,都会打印一条消息:
蒂尔:~> 猫箱/makebackupfiles.sh
#!/斌/庆典
# 复制目录中的所有文件 LIST=`ls`
对于 $LIST 中的 i; 做
原点=$i
DEST=$i.old
cp $ORIG $DEST 回声“复制的 $i”
完成
蒂尔:~> 猫箱/makebackupfiles.sh
#!/斌/庆典
# 复制目录中的所有文件 LIST=`ls`
对于 $LIST 中的 i; 做
原点=$i
DEST=$i.old
cp $ORIG $DEST 回声“复制的 $i”
完成
只需输入一行 mv * *。老的 将不起作用,因为您在一组测试文件上尝试此操作时会注意到。 一个 回音 添加命令是为了显示一些活动。 回音's 通常在脚本不起作用时很有用:在每个可疑步骤后插入一个,您很快就会发现错误。
/etc/rc.d/init.d 目录包含大量示例。 让我们看看这个控制虚构的 ICanSeeYou 服务器的脚本:
#!/ bin / sh的
# 描述:ICanSeeYou 可以让你看到联网的人
# 进程名称:ICanSeeYou
# pid文件:/var/run/ICanSeeYou/ICanSeeYou.pid
# 配置:/etc/ICanSeeYou.cfg
# 源函数库。
。 /etc/rc.d/init.d/functions
# 看看我们是如何(使用哪些参数)被调用的。 案例“$1”在
启动)
echo -n "启动 ICanSeeYou:" 守护进程 ICanSeeYou
回音
触摸 /var/lock/subsys/ICanSeeYou
;;
停止)
echo -n "正在关闭 ICanSeeYou:"
#!/ bin / sh的
# 描述:ICanSeeYou 可以让你看到联网的人
# 进程名称:ICanSeeYou
# pid文件:/var/run/ICanSeeYou/ICanSeeYou.pid
# 配置:/etc/ICanSeeYou.cfg
# 源函数库。
。 /etc/rc.d/init.d/functions
# 看看我们是如何(使用哪些参数)被调用的。 案例“$1”在
启动)
echo -n "启动 ICanSeeYou:" 守护进程 ICanSeeYou
回音
触摸 /var/lock/subsys/ICanSeeYou
;;
停止)
echo -n "正在关闭 ICanSeeYou:"
killproc ICanSeeYou 回声
rm -f /var/lock/subsys/ICanSeeYou
rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
;;
地位)
状态 ICanSeeYou
;;
重新启动)
$ 0停止
$ 0开始
;;
*)
echo "用法:$0 {start|stop|restart|status}" exit 1
ESAC
退出0
killproc ICanSeeYou 回声
rm -f /var/lock/subsys/ICanSeeYou
rm -f /var/run/ICanSeeYou/ICanSeeYou.pid
;;
地位)
状态 ICanSeeYou
;;
重新启动)
$ 0停止
$ 0开始
;;
*)
echo "用法:$0 {start|stop|restart|status}" exit 1
ESAC
退出0
首先,与 . command (dot) 一组 shell 函数,几乎所有的 shell 脚本都在使用
/etc/rc.d/init.d, 已加载。 然后一个 案件 命令发出,它定义了脚本可以执行的 4 种不同方式。 一个例子可能是 我能看见你 开始. 通过读取脚本的(第一个)参数来决定应用哪种情况,表达式为 $1.
如果未提供符合要求的输入,则会应用标有星号的默认情况,脚本会在此情况下给出错误消息。 这 案件 列表以 ESAC 陈述。 在里面 开始 如果服务器程序作为守护进程启动,并且分配了进程 ID 和锁。 在里面 停止 在这种情况下,服务器进程被跟踪并停止,并且锁和PID被删除。 选项,例如 守护 选项和功能,如 杀死进程, 定义在 /etc/rc.d/init.d/functions 文件。 此设置特定于本示例中使用的发行版。 您系统上的初始化脚本可能会使用在其他文件中定义的其他函数,或者根本不使用。
成功后,脚本将向其父级返回零退出代码。
这个脚本是使用函数的一个很好的例子,它使脚本更容易阅读,工作完成得更快。 请注意,他们使用 sh 而不是 打坏,使它们在更广泛的系统上有用。 在 Linux 系统上,调用 打坏 as sh 导致 shell 以符合 POSIX 的模式运行。