Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1308771
  • 博文数量: 273
  • 博客积分: 5865
  • 博客等级: 准将
  • 技术积分: 3280
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-11 10:01
文章分类

全部博文(273)

文章存档

2015年(33)

2014年(11)

2013年(11)

2012年(136)

2011年(32)

2010年(50)

分类: LINUX

2012-07-23 09:15:38

命令行 shell Unix shell

在以下几个例子中,文字用here文档传递给命令。

$ tr a-z A-Z < one two three > uno dos tres > END_TEXT ONE TWO THREE UNO DOS TRES

END_TEXT被用作标识符。它指定了here文档的开始和结束ONE TWO THREE和UNO DOS TRES是执行后tr的输出。

在<<后边添加一个减号使前导的制表符被忽略。这允许在shell脚本中缩进here文档而不改变它们的值。(注意在命令行上可能会需要输入Ctrl-v TAB来真正地输入一个制表符。下边的例子用空格模拟制表符;不要复制粘贴。)

$ tr a-z A-Z <<-END_TEXT > one two three > uno dos tres > END_TEXT ONE TWO THREE UNO DOS TRES

默认地,会进行变量替换和命令替换:

$ cat << EOF > Working dir $PWD > EOF Working dir /home/user

这可以通过使用引号包裹标识符来禁用。可以使用单引号或双引号:

$ cat << "EOF" > Working dir $PWD > EOF Working dir $PWD

bash,ksh或zsh中也可以用here-字串:

$ tr a-z A-Z <<<"Yes it is a string" YES IT IS A STRING

 

 

 

PHP

输出:

This is a heredoc section. For more information talk to Joe Smith, your local Programmer. Thanks! Hey Joe Smith! You can actually assign the heredoc section to a variable!

包含关闭标识符的行不得包含除了(可选的)分号的任何其他字符。不然它就不会被识别为关闭标识符,PHP就会继续寻找一个。如果没有找到关闭标识符,分析错误会发生在最后一行

在PHP 5.3和以后的版本中,就像一样,可以用单引号包裹标识符阻止变量扩展;这叫作nowdoc

$x = <<<'END' Dear $recipient, I wish you to leave Sunnydale and never return. Not Quite Love, $sender END;

在PHP5.3和以后的版本中,也可以用双引号包裹标识符,像Perl一样,和不用引号的效果一样。

== Here Document 实例 ==

当要将几行文字传递给一个命令时,用here documents是一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果使用here documents就不必用echo函数一行行输出。Here document以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:

#!/bin/sh
# we have less than 3 arguments. Print the help text:
if [ $# -lt 3 ] ; then
cat << HELP
ren -- renames a number of files using sed regular expressions USAGE: ren 'regexp' 'replacement' files...
EXAMPLE: rename all *.HTM files in *.html:
    ren 'HTM$' 'html' *.HTM
HELP
    exit 0
fi
OLD="$1"
NEW="$2"
# The shift command removes one argument from the list of
# command line arguments.
shift
shift
# $* contains now all the files:
for file in $*; do
    if [ -f "$file" ] ; then
       newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
       if [ -f "$newfile" ]; then
    echo "ERROR: $newfile exists already"
       else
          echo "renaming $file to $newfile ..."
          mv "$file" "$newfile"
       fi
    fi
done
这个示例有点复杂,我们需要多花点时间来说明一番。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了目的:得到了旧文件名和新文件名。然后使用 mv命令进行重命名

阅读(1159) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~