如何在unix中创建unix程序任意脚本

- 系统光盘下载网站!
当前位置: >
> 详细页面
Unix/Linux中如何直接执行PHP脚本文件?
来源:系统之家
作者:jianfang
  使用Linux系统的服务器都有搭建完整的PHP环境,因此有些用户会用PHP去写一些执行自动化任务的脚本,可是发现每次执行PHP脚本都需要使用php myscript.php的方式,感觉有点麻烦。其实我们是可以直接执行PHP脚本文件的,但是具体该怎么操作呢?下面小编就给大家介绍下Unix/Linux中如何直接执行PHP脚本文件。
  编写你的脚本文件
  这里我们编写一个名字为 test_run.php 的文件,文件的内容如下:
  Here is some plain text.
  Here is the file name:
  《?php
  echo $argv[0], PHP_EOL;
  脚本内容很简单,就是把当前脚本文件的名称打印出来。
  然后,我们使用 PHP 命令执行一下这个脚本:
  yuanyu@ymac:phpworkspace $ php test_run.php hello
  Here is some plain text.
  Here is the file name:
  test_run.php
  yuanyu@ymac:phpworkspace $
  给脚本文件增加头信息,并且设置权限
  然后,在这个文件的第一行写上 php 命令的全路径,前面是一个 #!:
  #!/usr/bin/php
  Here is some plain text.
  Here is the file name:
  《?php
  echo $argv[0], PHP_EOL;
  然后给这个文件赋予可执行的权限:
  yuanyu@ymac:phpworkspace $ chmod u+x 。/test_run.php
  接下来就可以直接执行这个脚本了:
  yuanyu@ymac:phpworkspace $ 。/test_run.php
  Here is some plain text.
  Here is the file name:
  。/test_run.php
  yuanyu@ymac:phpworkspace $
  这种方式在 PHP 官方文档中也是有说的,请参考:
  http://php.net/manual/en/features.commandline.usage.php
  文档中的
  &Example #2 Script intended to be run from command line (script.php)&
  以上就是Unix/Linux中直接执行PHP脚本文件的操作方法,不熟悉的用户可以参照上面介绍的具体步骤来操作。
栏目热门教程
人气教程排行
热门系统下载
本站发布的系统与软件仅为个人学习测试使用,请在下载后24小时内删除,不得用于任何商业用途,否则后果自负,请支持购买微软正版软件!如侵犯到您的权益,请及时通知我们,我们会及时处理。
Copyright&2011 系统之家(www.xitongzhijia.net) 版权所有 闽ICP备号-1如何在 Linux 或者 UNIX 下调试 Bash Shell 脚本
来自我的邮箱:
我写了一个 hello world 小脚本。我如何能调试运行在 Linux 或者类 UNIX 的系统上的 bash shell 脚本呢?
这是 Linux / Unix 系统管理员或新用户最常问的问题。shell 脚本调试可能是一项繁琐的工作(不容易阅读)。调试 shell 脚本有多种方法。
您需要传递 -x 或 -v 参数,以在 bash shell 中浏览每行代码。
让我们看看如何使用各种方法调试 Linux 和 UNIX 上运行的脚本。
-x 选项来调试脚本
用 -x 选项来运行脚本:
$ bash -x script-name
$ bash -x domains.sh
使用 set 内置命令
bash shell 提供调试选项,可以打开或关闭使用 :
set -x : 显示命令及其执行时的参数。
set -v : 显示 shell 输入行作为它们读取的
可以在 shell 脚本本身中使用上面的两个命令:
#!/bin/bash
# turn on debug mode
for f in *
# turn OFF debug mode
# more commands
你可以代替
#!/bin/bash
用以下代码(用于调试):
#!/bin/bash -xv
使用智能调试功能
首先添加一个叫做 _DEBUG 的特殊变量。当你需要调试脚本的时候,设置 _DEBUG 为 on:
_DEBUG="on"
在脚本的开头放置以下函数:
function DEBUG()
[ "$_DEBUG" == "on" ] &&
现在,只要你需要调试,只需使用 DEBUG 函数如下:
DEBUG echo "File is $filename"
DEBUG set -x
DEBUG set +x
当调试完(在移动你的脚本到生产环境之前)设置 _DEBUG 为 off。不需要删除调试行。
_DEBUG="off" # 设置为非 'on' 的任何字符
示例脚本:
#!/bin/bash
_DEBUG="on"
function DEBUG()
[ "$_DEBUG" == "on" ] &&
DEBUG echo 'Reading files'
for i in *
grep 'something' $i & /dev/null
[ $? -eq 0 ] && echo "Found in $i file"
DEBUG set -x
c=$(( $a + $b ))
DEBUG set +x
echo "$a + $b = $c"
保存并关闭文件。运行脚本如下:
$ ./script.sh
Reading files
Found in xyz.txt file
+ DEBUG set +x
+ '[' on == on ']'
现在设置 _DEBUG 为 off(你需要编辑该文件):
_DEBUG="off"
运行脚本:
$ ./script.sh
Found in xyz.txt file
以上是一个简单但非常有效的技术。还可以尝试使用 DEBUG 作为别名而不是函数。
调试 Bash Shell 的常见错误
Bash 或者 sh 或者 ksh 在屏幕上给出各种错误信息,在很多情况下,错误信息可能不提供详细的信息。
跳过在文件上应用执行权限
当你 ,您可能会得到一个错误,如下所示:
bash: ./hello.sh: Permission denied
设置权限使用 chmod 命令:
$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh
文件结束时发生意外的错误
如果您收到文件结束意外错误消息,请打开脚本文件,并确保它有打开和关闭引号。在这个例子中,echo 语句有一个开头引号,但没有结束引号:
#!/bin/bash
echo 'Error: File not found
missing quote
还要确保你检查缺少的括号和大括号 {}:
#!/bin/bash
[ ! -d $DIRNAME ] && { echo "Error: Chroot dir not found"; exit 1;
^^^^^^^^^^^^^
missing brace }
丢失像 fi,esac,;; 等关键字。
如果你缺少了结尾的关键字,如 fi 或 ;; 你会得到一个错误,如 &XXX 意外&。因此,确保所有嵌套的 if 和 case 语句以适当的关键字结束。有关语法要求的页面。在本例中,缺少 fi:
#!/bin/bash
echo "Starting..."
if [ $1 -eq 10 ]
if [ $2 -eq 100 ]
echo "Do something"
for f in $files
# 注意 fi 丢失了
在 Windows 或 UNIX 框中移动或编辑 shell 脚本
不要在 Linux 上创建脚本并移动到 Windows。另一个问题是编辑 Windows 10上的 shell 脚本并将其移动到 UNIX 服务器上。这将由于换行符不同而导致命令没有发现的错误。你可以使用下列命令
dos2unix my-script.sh
技巧 1 - 发送调试信息输出到标准错误
[标准错误] 是默认错误输出设备,用于写所有系统错误信息。因此,将消息发送到默认的错误设备是个好主意:
# 写错误到标准输出
echo "Error: $1 file not found"
# 写错误到标准错误(注意 1&&2 在 echo 命令末尾)
echo "Error: $1 file not found" 1&&2
技巧 2 - 在使用 vim 文本编辑器时,打开语法高亮
大多数现代文本编辑器允许设置语法高亮选项。这对于检测语法和防止常见错误如打开或关闭引号非常有用。你可以在不同的颜色中看到。这个特性简化了 shell 脚本结构中的编写,语法错误在视觉上截然不同。高亮不影响文本本身的意义,它只为你提示而已。在这个例子中,我的脚本使用了 vim 语法高亮:
技巧 3 - 使用 shellcheck 检查脚本
。可以使用它来查找 shell 脚本中的错误。这是用 Haskell 编写的。您可以使用这个工具找到警告和建议。你可以看看如何在 Linux 或 类UNIX 系统上安装和使用 shellcheck 来改善你的 shell 脚本,避免错误和高效。
作者:Vivek Gite
作者是 nixCraft 创造者,一个经验丰富的系统管理员和一个练习 Linux 操作系统/ UNIX shell 脚本的教练。他曾与全球客户和各种行业,包括 IT,教育,国防和空间研究,以及非营利部门。关注他的 ,,。
作者: 译者: 校对:
原创编译, 荣誉推出
共计翻译: 3 篇
| 共计贡献: 28 天
贡献时间: -&
-09%-11%-20%42%-44%-50%-58%-65%71%-71%-76%-84%
我写了一个 hello world 小脚本。我如何能调试运行在 Linux 或者类 UNIX 的系统上的 bash shell 脚本呢?
上一篇:下一篇:
评论功能关闭
根据国家法律法规要求,本站暂时关闭文章评论功能。开放时间不确定。我们将谋求一种可以让大家更好的发表意见的方式。
根据国家法律法规要求,只有实名认证后才可以发表评论。
分享到微信
打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。
请将我们加入您的广告过滤器的白名单,请支持开源站点。谢谢您。&>&精通UNIX Shell脚本编程(附源代码)
精通UNIX Shell脚本编程(附源代码)
上传大小:25.37MB
* 原书名: Mastering UNIX Shell Scripting
* 原出版社: Wiley
* 作者: (美)Randal K. Michael
[作译者介绍]
* 译者: 詹文军[同译者作品] 邓波
* 出版社:电子工业出版社
* 上架时间:
* 出版日期:2005 年1月
* 开本:16开
* 页码:516
* 版次:1-1
* 所属分类: 计算机 & 操作系统 &
教材 & 研究生/本科/专科教材 & 工学 &
教材 & 计算机教材 & 本科/研究生 & 计算机专业 & 计算机专业课程 &
内容简介回到顶部↑
本书中使用的技术将教会读者如何理性地处理问题,同时还使得读者能够根据基本的命令语法
来将它转换为一个针对特定问题的shell脚本解决方案。
本书提供了许多完整的脚本,可以将它们用于自动完成重复的任务和解决现实
系统管理问题的
shell脚本。这些任务包括:
● 通信,例如自动的事件通知;监视本地或远程系统上的进程:自动的FTP文件传输
● 针对文件系统、页面调度/交换空间、系统负载、应用程序、进程的信息收集与监视活动,
捕获系统配置
● 打印队列管理,保证打印机正常打印
● 使用bc工具程序在shell脚本中进行浮点数学运算
本书配套的Web网站(www.wiley.com/compbooks/michael)上包含了本书中讨论的所有shell
脚本和大部分函数,同时还提供了针对各种任务的其他shell脚本。
本书详细介绍如何编写shell脚本来解决实际生活中遇到的UNIX问题和任务。本书面向所有的UNIX版本,重点覆盖对象包括AIX、Linux、 HP-UX和Solaris操作系统。本书的每一章都以一个经常遇到的UNIX问题作为开始。对于每个问题,都定义了一个明确的目标。在了解了目标和命令语法之后,读者可以根据命令来创建shell脚本。本书的特点是从基础开始,然后在解决方案中加入越来越多的判断逻辑。针对复杂程度不同的各种问题,本书分别用不同的章节加以介绍。
本书面向那些通过命令行方式使用UNIX的用户。在本书中讨论的主题主要针对UNIX专业人员—程序员、系统分析员、系统操作员、系统管理员,以及任何希望在技术支持领域取得进步的人。
作译者回到顶部↑
本书提供作译者介绍
Randal K.Michael是一位在可口可乐公司任职的UNIX系统管理员,他编写了许多shell脚本来处理
UNIX下复杂的系统监视和事件通知问题。他具有23年的工作经验:同时担任UNIX系统管理员达10年
之久,熟悉Solaris、Linux、AIX和HP-UX操作系统。
...展开收缩
综合评分:4
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有18条
比较零散,页与页不挨着
不如PDF来的直观。。。HTML文件太多了- -
还行吧,unix高深着呢
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
精通UNIX Shell脚本编程(附源代码)
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
精通UNIX Shell脚本编程(附源代码)通过脚本实现操作的自动化
此内容是该系列 # 部分中的第 # 部分: 对话 UNIX,第 6 部分http://www.ibm.com/developerworks/cn/views/aix/articles.jsp?view_by=search&search_by=%E5%AF%B9%E8%AF%9D+UNIX敬请期待该系列的后续内容。此内容是该系列的一部分:对话 UNIX,第 6 部分敬请期待该系列的后续内容。
如果您曾经在资深 UNIX® 用户工作时站在他的背后注视屏幕,可能会对命令行上不断滚动的咒语般的奇怪内容感到相当迷惑。如果您阅读过对话 UNIX 系列中以前的文章(请参见),那么至少所输入的某些诗一般的神秘内容——如波形符 (~)、管道 (|)、变量和重定向(& 和 &)——看起来是熟悉的。您也许还会认出某些 UNIX 命令名称和组合,或者了解何时使用别名来作为某个命令组合的简写形式。尽管如此,还有其他命令组合可能是您无法理解的,因为资深的 UNIX 用户通常以 Shell 脚本 的形式收集一大堆小的、高度专门化的命令组合,以简化或自动化经常重复的任务。与输入或重新输入(可能)复杂的命令来完成某个繁琐任务不同,Shell 脚本可以自动化该工作。在对话 UNIX 系列(请参见)的第 6 部分中,您将学习如何编写 Shell 脚本和更多命令行诀窍。核心就是一个词:“自动化”有些 Shell 脚本完全就是反复运行同样的命令,并处理同样的一组文件。例如,将您的整个主目录内容传播到三台远程计算机的 Z Shell 脚本可以像 一样简单。清单 1. 跨多台计算机同步主目录的简单 Shell 脚本#! /bin/zsh
for each machine (groucho chico harpo)
rsync -e ssh --times --perms --recursive --delete $HOME $machine:
end若要将 用作 Shell 脚本,可以将上述内容保存到某个文件——例如 simpleprop.zsh——并运行 chmod +x simpleprop.zsh 以使该文件成为可执行文件。您可以通过输入 ./simpleprop.zsh 来运行该脚本。 如果您想查看 Z Shell 如何展开每个命令,可以将 -x 选项添加到脚本的 #!(# 号-感叹号对通常称为 shuh-bang)行的结尾,如下所示:#! /bin/zsh -x该脚本对 groucho、chico 和 harpo 中的每一台计算机运行 rsync 命令,并将 $HOME 替换为您的主目录(例如,/home/joe),将 $machine 替换为计算机名称。如 所示,变量和诸如循环等脚本控制结构使脚本更容易编写和维护。如果您想将第四台计算机(例如 zeppo)包括到计算机池中,只需将其添加到该列表。如果您必须更改 rsync 命令,比如说添加另一个选项,则只需编辑一个实例。与在传统编程中一样,您也应该努力避免在 Shell 脚本中进行剪切和粘贴。使用恰当的参数其他 Shell 脚本需要参数,或要处理的对象——文件、目录、计算机名称——的动态列表。例如,考虑,这是前一示例的变体,它允许您使用命令行来指定您想要与之同步的计算机。清单 2. 允许您指定要处理的计算机的清单 1 的变体#! /bin/zsh
for each machine
rsync -e ssh --times --perms --recursive --delete $HOME $machine:
end假设您将 保存在名为 synch.zsh 的文件中,您得按照 zsh synch.zsh moe larry curly 的形式调用该脚本,以将主目录复制到另外的计算机 larry 和 curly。foreach 行上缺少的列表并不是输入错误:如果您省略某个列表,则 foreach 结构将处理命令行上给出的参数列表。命令行参数也称为位置参数 (positional parameter),因为某个参数在命令行上的位置通常在语义上非常重要。例如,如果您未 指定任何参数,则
可以利用位置参数的存在性或非存在性来提供有帮助的用法信息。增强的脚本如 所示。清单 3. 许多脚本将在未提供参数时提供有帮助的消息#! /bin/zsh
if [[ -z $1 || $1 == "--help" ]]
echo "usage: $0 machine [machine ...]
foreach machine
rsync -e ssh --times --perms --recursive --delete $HOME $machine:
end命令行上的每个空格分隔的字符串变成了位置参数,包括所调用的脚本的名称。因此,命令 synch.zsh 只有一个位置参数 $0。synch.zsh --help 命令有两个位置参数:$0 和 $1,其中 $1 是字符串 --help。所以, 表示“如果第一个位置参数为空(-z 操作符测试空字符串)或(由 || 表示)如果第一个参数等于‘—help’,则打印用法信息”。(如果您刚开始编写脚本,可以考虑在每个脚本中提供用法信息作为提示。它提醒其他人——甚至您自己,如果您忘了的话——如何使用该脚本。)短语 [[ -z $1 || $1 == "--help" ]] 是 if 语句的 条件,但您也可以将同样的条件子句用作命令,并将其与其他命令组合使用以控制通过脚本的流。请查看。它枚举您的 $PATH 中的所有可执行命令,并将条件与其他命令组合使用以执行适当的工作。清单 4. 列出 $PATH 中的命令#! /bin/zsh
directories=(`echo $PATH | column -s ':' -t`)
for directory in $directories
[[ -d $directory ]] || continue
pushd "$directory"
for file in *
[[ -x $file && ! -d $file ]] || continue
echo $file
done | sort | uniq此脚本中执行了相当多的操作,我们将它细分为以下几部分:第一个实际脚本行——directories=(`echo $PATH | column -s ':' -t`)——创建指定目录的数组。您在 zsh 中通过将参数放在括号中来创建数据,例如 directories=(...)。在此例中,数组元素是通过在每个冒号(column -s ':')处分拆 $PATH 以产生空格分隔的目录列表(column 的 -t 参数)来生成的。对于列表中的每个目录,该脚本尝试枚举该目录中的可执行文件。步骤 3 至步骤 6 描述了该过程。[[ -d $directory ]] || continue 行是所谓的 short-circuiting 命令的一个示例。short-circuiting 命令在其逻辑条件产生确定的结果时立即终止。
例如,[[ -d $directory ]] || continue 短语使用逻辑“或”(||)——它首先执行第一个命令,并且——当且仅当——第一个命令失败时才执行第二个命令。因此,如果 $directory 中的条目存在,并且是一个目录(-d 操作符),则测试成功,求值结束,并且 continue 命令(它跳过当前元素的处理)永远不会执行。然而,如果第一个测试失败,则会执行该逻辑的下一个条件或执行 continue。(continue 始终成功,因此它通常出现在 short-circuiting 命令的最后)。基于逻辑“与”(&&) 的 Short-circuiting 首先执行第一个命令,并且——当且仅当——第一个命令成功时才执行第二个命令。pushd 和对应的 popd 分别用于在处理前切换到新目录和在处理后切换到先前的目录。使用目录堆栈是一种理想的脚本技术,用于维持您在文件系统中的位置。内部的 for 循环枚举当前工作目录中的所有文件——通配符 *(星号)匹配所有条目——然后测试每个条目是否为文件。[[ -x $file && ! -d $file ]] || continue 行表示“如果 $file 存在并且是可执行文件而且不是目录,则处理它;否则执行 continue”。最后,如果前面的所有条件都满足,则使用 echo 来显示文件名。您弄明白该脚本的最后一行了吗?您可以将大多数控制结构的输出发送给另一个 UNIX 命令——毕竟,Shell 将该控制结构视为一个命令。因此,整个脚本的输出通过 sort、然后通过 uniq 进行管道传输,以产生在您的 $PATH 中找到的唯一命令的字母排序列表。如果将 保存到一个名为 listcmds.zsh 的可执行文件,则输出可能类似如下:$ ./listcmds.zsh
aclocalshort-circuiting 命令在脚本中非常有用。它在单个命令中组合了条件和操作。而且由于每个 UNIX 命令都返回一个指示成功或失败的状态代码,因此,您可以使用任何命令作为“条件”——而不仅仅是使用测试操作符。根据约定,UNIX 返回零 (0) 表示成功,返回非零表示失败,其中非零值反映所发生的错误类型。例如,如果将 [[ -d $directory ]] || continue 行替换为 cd $directory || continue,则可以从 中消除 pushd 和 popd。如果 cd 命令成功,则它会返回 0,并且逻辑“或”的求值可以立即结束。然而,如果 cd 失败,则它会返回非零,并且会执行 continue。不要删除。应存档!现代 UNIX Shell——bash、ksh、zsh——提供了许多控制结构和操作以创建复杂的脚本。由于您可以调用所有 UNIX 命令来将数据从一种形式处理为另一种形式,Shell 脚本编程几乎与诸如 C 或 Perl 等完整语言中的编程一样丰富。您可以使用脚本来自动化几乎所有个人或系统任务。脚本可以监视、存档、更新、上载、下载和转换数据。一个脚本可以只有单行或包括无数个子系统。任务无论大小,均可通过脚本来处理。实际上,如果您查看 /etc/init.d 目录,会看到在每次启动计算机时运行服务的各种 Shell 脚本。如果您创建了一个非常有用的脚本,您甚至可以将它部署为系统范围的实用程序。只需将其放到用户的 $PATH 上的某个目录中。让我们创建一个实用程序,以练习您新发现的诀窍。脚本 myrm 将替换系统自己的 rm 实用程序。与彻底删除某个文件不同,myrm 把要删除的文件复制到某个存档,对其进行唯一命名以便您以后能够找到它,然后再删除原始文件。myrm 脚本有效但是非常简单,并且您还可以添加许多杂项功能。您还可以编写一个广泛的 unrm(撤销删除)脚本作为配套实用程序。(您可以搜索 Internet 来找到各种各样的实现。)myrm 脚本如 所示。清单 5. 用于在从文件系统中删除文件之前备份该文件的简单实用程序#! /bin/zsh
backupdir=$HOME/.tomb
systemrm=/bin/rm
if [[ -z $1 || $1 == "--help" ]]
exec $systemrm
if [[ ! -d $backupdir ]]
mkdir -m 0700 $backupdir || echo "$0: Cannot create $backupdir"; exit
args$=$( getopt dfiPRrvw $* ) || exec $systemrm
flags = ""
foreach argument in $args
case $argument in
*) flags="$flags $argument";
(( count=$count + 1 ));
shift $(( $count ))
[[ -e $file ]] || continue
copyfile=$backupdir/$(basename $file).$(date "+%m.%d.%y.%H.%M.%S")
/bin/cp -R $file $copyfile
exec $systemrm $=flags "$@"您应该发现该 Shell 脚本很容易理解,尽管其中存在一些之前尚未讨论过的新内容。让我们探讨一下那些新内容,然后查看整个脚本。当 Shell 运行某个命令(如 cp 或 ls)时,它会为该命令产生一个新进程,然后在继续之前等待该(子)进程完成。exec 命令还启动另外一个命令,但是与产生新进程不同,exec 使用一个新命令来“替换”当前进程——即 Shell 进程——的任务。换句话说,exec 重用同一进程来启动一个新任务。在该脚本的上下文中,exec 立即“终止”该脚本并启动指定的任务。UNIX 实用程序 getopt 扫描位置参数以获得您指定的命名参数。这里,dfiPRrvw 列表查找 -d、-f、-i、-P、-R、-r、-v 和 -w。如果出现别的选项,则 getopt 将会失败。否则,getopt 返回一个以特殊字符串 -- 结尾的选项字符串。shift 命令从左到右删除位置参数。例如,如果命令行为 myrm, -r -f -P file1 file2 file3,则 shift 3 将分别删除 $0、$1 和 $2,或 -r、-f 和 -P。file1、file2 和 file3 将被重新编号为 $0、$1 和 $2。case 语句的工作方式与传统编程语言中的对应结构相似。它将其参数与列表中的每个模式比较;当找到匹配项时,则执行对应的代码。与在 Shell 中非常类似,* 匹配所有条目,并且可用作在未找到其他匹配项时的缺省操作。特殊符号 $@ 展开为所有(其余)的位置参数。zsh 操作符 $= 在空白边界处拆分单词。当您有一个非常长的字符串,并且希望将该字符串拆分为各个参数时,$= 是非常有用的。例如,如果变量 x 包含字符串 '-r -f'——这是一个具有五个字符的单词——$=x 将变为两个单独的单词 -r 和 -f。给出这些解释之后,您现在应该能够详细分析该脚本了。下面让我们逐块地研究一下该代码:第一个块设置整个脚本中使用的变量。下一个块应该是非常熟悉的:它在未提供参数时打印用法信息。它为什么执行 (exec) 实际的 rm 实用程序呢?如果您将此脚本命名为“rm”并将其放在 $PATH 中靠前的位置,则它就可以充当 /bin/rm 的替代者。该脚本的错误选项也是 /bin/rm 的错误选项,因此该脚本允许 /bin/rm 提供用法信息。下一个块在备份目录不存在时创建该目录。如果 mkdir 失败,则该脚本终止并显示适当的错误消息。下一个块查找位置参数列表中的 dash 参数。如果 getopt 成功,则 $args 具有一个选项列表。如果 getopt 失败,例如在它无法识别某个选项的时候,则它会打印错误消息,并且该脚本将退出并显示用法信息。随后的块捕获一个字符串中旨在提供给 rm 的所有选项。当遇到特殊 getopt 选项 -- 时,选项收集过程停止。shift 从参数列表中删除所有已处理的参数,保留待处理的文件和目录列表。从以 for file 开头的块复制每个文件和目录,以便在您自己的存档目录中保存它们。每个文件的目录被逐字 (-R) 复制到存档目录,并附带当前日期和时间作为后缀,以确保该副本是唯一的,并且不会改写以前存档的具有相同名称的条目。最后,使用传递给该脚本的相同命令行选项来删除文件和目录。然而,如果您碰巧需要刚才删除(意外删除?)的文件或目录,您可以在存档中查找原始副本。向自动化进军您使用 UNIX 的时间越多,就越有可能创建脚本。脚本可以节省重新输入复杂的较长命令序列所需的时间和精力,并且还可以防止发生错误。Web 上充满了其他人已创建的用于许多目的的有用脚本。很快您也会发布自己的神奇脚本。
相关主题您可以参阅本文在 developerWorks 全球站点上的
。:阅读该列表以了解更多的 Z Shell 技巧和提示。:从 下载最新版本的 Z Shell。按主题搜索“AIX and UNIX”库:
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=http://www.ibm.com/developerworks/js/artrating/SITE_ID=10Zone=AIX and UNIXArticleID=199621ArticleTitle=对话 UNIX,第 6 部分: 通过脚本实现操作的自动化publish-date=}

我要回帖

更多关于 unix 创建空文件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信