新建一个文本文件包含所需要的脚本。举例,我会使用pico编辑器写一个脚本用来运行程序tar,带上必要的可选项可以用来解压从因特网下载下来的*.tar的文件(我好像总是记不住tar的所有参赛)。我决定把我的脚本名称叫做“untar”:

pico untar

因为在我的当前工作目录里untar文件不存在,所有pico文本编辑器自动创建这个文件,现在,我输入以下内容:

#!/bin/bash

echo this is the script file $0

echo untarring the file $1

# this calls tar with options -xvzf (extract,

# verbose, filter through gzip, input filename)

tar -xvzf $1

我使用O保存这个文件,然后X退出。

脚本的第一行,以“#!”开始是特别的提示-它告诉shell应该用哪一个程序来解释我的脚本。在这个例子里,我使用bash shell /bin/bash。第一行必须使用“#!”开头,否则脚本不会运行(系统认为是一个文本文件)。其他以“#”开始的行是注释行只是给作者和读者使用的,计算机将跳过这些行。

在以上脚本里,参数$0, $1, $2…是传递到脚本里面的参数。举个例子,如果我运行我的脚本名“myscript”带七个参数如下:

myscript a b c d e f g

那么,参赛$0就是myscript, $1就是a, $2就是b,$3就是c,依此类推。

脚本的第二行和第三行,echo命令输出所有在它后面同一行上的文本,然后扩展在脚本里对应的参数$0和$1。第四行和第五行是我写的注释文本,提醒我在这个脚本里要做的事情。只有最后一行是真正起作用的。

一旦脚本已经写好,我把文件属性改成对文件拥有者是“可执行”的:

chmod u+x untar

然后我的脚本就可以这样运行了:

./untar my_tar.tar.gz

Liunx脚本的确非常丰富,灵活,功能强劲,还可能有点复杂。然而,对于日常任务编写一些简单脚本,它并不需要什么特别高深的知识。你可以把一些要用到的命令放在一起,一个接一个,输入到文件里。我使用脚本很频繁是因为我太懒了,不想一次一次的输入相同的命令。

一个最简单的方法,可以把一组命令放在文本文件里然后使用source命令传递给shell让它直接运行:

source my_file

这个时候就不需要在文本第一行加上“#!”的标志了。

3.4.6  引号的含义

一般来说,以下字符对于shell有特殊的含义:

\ ' " ` < > [ ] ? | ; # $ ^ & * ( ) =

这里有四种不同的符号:反斜杠(\),单引号(‘),双引号(“),反向单引号(`)。

反斜杠(\)表示:关闭后面字符的特殊含义

单引号(‘)表示:关闭在两个单引号之间所有字符的特殊含义

双引号(“)表示:关闭在两个双引号之间所有字符的特殊含义除了$ ` \

反向单引号(`)表示:告诉shell首先运行两个反向单引号之间的命令,然后把得到的结果再传递给两个单引号之外的命令。同样的功能也可以通过“$command”命令来实现,而且可能会更方便。

举个例子,我可以创建一个奇怪的目录名叫做“*”通过使用“\”或者“’”符号:

mkdir \*

mkdir ’*’

这屏蔽了“*”对于shell的特别含义。如果没有“\”,“*”意味着当前目录下所有文件。

3.4.7  输入输出重定向

有三个最重要的输入输出流:标准输入(stdin),标准输出(stdout),标准错误(stderr)。它们对于控制台(“控制台”指的是键盘用于输入,屏幕用于输出)来说是缺省的,但是它们可以被重定向。

重定向标准输出,可以使用“>”符号,举例:

dir my_dir > filelisting.txt

将把dir命令的标准屏幕输出重定向到文本文件 filelisting.txt文件里,所以屏幕上没有任何输出。这个文件可以用来编辑(比如使用pico文本编辑器)或者合并到其他的文件里。

重定向标准错误,可以使用结构“2>”,举例:

dir my_dir 2> errorlisting.txt

以上命令将送标准输出到屏幕上,如果没有错误信息,将没有任何信息写到errorlisting.txt文件里。如果出错,则没有什么东西输出到屏幕,而文件errorlisting.txt将包含错误信息。错误信息有可能是这样的:

dir: my_dir:  Permission denied

最后,我也可以把标准输出和标准错误一起输出到同一个文件里,

dir my_dir > file_and_error_listing.txt 2>&1

以上命令先重定向标准输出到文本文件里,然后再重定向标准错误到和标准输出同样的位置。它如何实现可能看起来有点古怪,但是是可行的。

在以上的例子里,如果重定向的文件已经存在,该文件会被覆盖。如果你要追加到该文件的末尾,可以使用“>>”符号,以上的例子就变成:

dir my_dir >> filelisting.txt

dir my_dir 2>> errorlisting.txt

dir my_dir >> file_and_error_listing.txt 2 > &1

如果你对“2>”感到很迷惑,这里有一个简单的办法可以帮你理解,标准流有标准的解析器:“0”代表标准输入,“1”代表标准输出,“2”代表标准错误。

dir my_dir > file.txt

是以下命令的简写方式:

dir my_dir 1 > file.txt

那么以下命令就是用来输出标准错误:

dir my_dir 2 > file.txt

还有,你还可以使用符号“|”(管道命令)把一个命令的标准输出送到另外一个命令的标准输入。在以下这个标准的例子里,dir命令的标准输出通过管道输入到命令more里(输出满屏的时候自动暂停):

dir | more

你还可以使用“tee”命令把标准输出同时写到文件和屏幕,

dir | tee filelisting.txt

tee是“T型连接器”的模拟音,在管道中的主要的用途是分流。

这个部分这样都用来讲述标准输出重定向,对于标准输入重定向不像标准输出重定向那么有用,但是它可以使用以下方式实现:

cat < my_file

还有一种叫做“直接插入式”的标准输出,可以通过“<”式第二个提示符)

cat << my_marker

> my_line_from_the_keyboard

> another_line_from_the_keyboard

> my_marker

除了重定向到常规文件和“过滤器”之外(如以上的例子所示),你还可以重定向到设备和其他特殊文件。看下面这些例子。

重定向到设备文件的例子。以下命令将显示文件列表到第四个文本终端:

dir > /dev/tty4

以下是一个重定向到一个特殊的FIFO(先进先出)文件的例子。该命令送信息”you are lucky”到叫做“lucky”的ICQ用户UIN 7777777 (假定你已经用你的ICQ程序连接到ICQF服务器上了)

echo message 7777777 “you are lucky” < ~/.licq/licq_fifo

以上的例子能够工作是因为在你licq目录下的文件“licq_fifo”是一个特别的FIFO序列文件。以上这个例子,对比于在图形用户界面下的ICQ程序有什么特别有用的地方吗?举个例子,你可以写一个短的脚本带上多个信息给你的那些ICQ伙伴们:

#!/bin/bash

echo Messaging UIN: $1 Message: $2 Times: $3

# The next command puts puts your licq in the status "on-line, invisible".

echo 'status *online' > ~/.licq/licq_fifo

c=0

while [ $c -le $3]

do

echo message $1 $2 > ~/.licq/licq_fifo

c=`expr $c + 1`

echo $c " "

done

echo 'status offline' > ~/.licq/licq_fifo

echo "all done"

这个例子利用了licq通信模型(FIFO文件)和简单的文件重定向功能,给你一个关于如何 “自动化”licq的主意。

3.4.8  Shell的特殊字符(metacharacters)

一般来说,这些字符对于shell有特别的含义:

\ ' " ` < > | ; ( ) [ ] ? # $ ^ & * =

以下是这些字符的含义:

\ ‘ “ 和 ‘ 主要用来注释,前面已经描述过 (参见 3.4.6)。

< 和 > 主要用来输入和输出重定向

| 是管道命令,管道左边的标准输出是管道右边的标准输入

; 用于间隔在同一命令行上的几个命令

和 间用于分开命令的字符和单词

完成一条命令或者一组命令

( ) 用于封装需要使用不同的shell启动的命令, 比如 ( dir )

{ } 用于封装要用当前shell启动的一组命令,比如 { dir },需要空格间隔

& 使当前命令在后台运行(有它自己独立的进程),所以下一条命令不需要等待前一条命令结束才能开始。

* 当搜索文件时,它匹配除了以“.”开头的所有文件

?当搜索文件时,它匹配任何单个字符

[ ] 当搜索文件时,它匹配任何在[]里面的单个字符

&& 是用于连接两个命令的“与操作”,

command1 && command2, 只有当command1退出状态为0时(没有错误),command2才会被执行。比如, cat file1 && cat file2 只有当file1正常显示时, file2才能被显示。

||  是用于连接两个命令的“或操作”

command1 || command2, 只有当command1退出状态非0时(有错误),command2才会被显示。比如:cat file1 || cat file2 只有当显示file1出错时,file2才能被显示

= 指定值给变量

举例,命令me=blahblah设定值“blahblah”给变量“me”,我可以输出变量名:

echo $me

$      预处理扩展变量名

变量可以使用“=”来设定值,也可以通过预先变量设定来设置

$0     被执行的shell脚本的名称

$#     按位置对应的命令输入参数, $1第一个参赛, $2第二个参数, $3第三个参数…直到$9

$*     扩展所有的位置参数给命令

$@     扩展所有的位置参数给命令,但是当“$@”使用时,参数个别标注

posted on 2006-09-16 18:37 有猫相伴的日子 阅读(13355) 评论(0)  编辑  收藏 所属分类: linux/unix应用

linux脚本重定向到输入,linux shell输入输出重定向相关推荐

  1. Linux Shell脚本入门教程系列之(十六) Shell输入输出重定向

    本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...

  2. linux中文件输出输入,linux中文件输入输出的管理

    一..输入输出的定义 1,输入:输入是指我们的键盘,鼠标等硬件在系统中录入的字符 2,输出:输出是指系统在接受到我们想要实现的功能字符后,经过进程的处理产生的字符, 输出会有两种出现,编号1为正确输出 ...

  3. linux脚本命令行交互,linux – 是否有可能使bash shell脚本与另一个命令行程序交互?...

    我在运行bash shell的Linux终端中使用交互式命令行程序.我有一个确定的命令序列,我输入到shell程序.程序将其输出写入标准输出.其中一个命令是'save'命令,它将上一个运行的命令的输出 ...

  4. linux 脚本 expected,使用expect实现shell中scp自动输入密码

    使用expect实现shell中scp自动输入密码 前段时间有一个需求,要实现一个自动备份脚本,因为不需要全部备份,所以没有使用rsync,在这里使用scp.因为scp需要输入用户密码,在网上查了好多 ...

  5. linux 脚本竖线表示,[转载]Linux shell中的竖线(|)——管道符号

    vim一些常用的快捷键 快速注释: Ctrl+v I // esc 打开文件 gf ctrl+o MyBatis入门(五)---延时加载.缓存 一.创建数据库 1.1.建立数据库 /* SQLyog ...

  6. Shell输入输出重定向:Shell Here Document,/dev/null文件

    Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 输出重定向 命令的输出不仅可以 ...

  7. linux 脚本在哪里编写,Linux 脚本编写基础(一)

    1. Linux脚本编写基础1.1语法基本介绍1.1.1开头程序必须以下面的行开始(必须方在文件的第一行):#!/bin/sh符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使 ...

  8. shell 输入输出重定向

    1. 命令列表: command > file 将输出重定向到file command < file 将输入重定向到file command >> file 将输出以追加的方式 ...

  9. linux脚本参数获取时间戳,Linux系统date命令的参数及获取时间戳的方法

    date指令相关用法示例 date 用法: date [OPTION]... [+FORMAT] date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] ...

最新文章

  1. java——原型模式
  2. 解锁并设置远程登录尝试次数
  3. 相交链表—leetcode160
  4. MySQL 中 delete 语句的子查询限制
  5. ShardingSphere UI 初步体验
  6. Atitit 提升科技影响力 目录 1. 大原则 2 1.1. 科技强人必须是创新型[ 2 1.2. 要有一定的体量和规模 2 2. 创新能力主要科技指标 2 2.1. 领域科技大奖与荣誉 2 2
  7. 《企业IT架构转型之道》边读边想——数字化运营能力
  8. 解决idea中xml注释出现空格和顶格问题
  9. 国产银河麒麟 安装wps 的简单方法
  10. 怎么用c语言编写单片机流水灯程序,单片机编程入门:单片机流水灯程序
  11. 俄内政部悬赏破解 Tor 匿名网络
  12. 曲终人散,我亦是行人。
  13. ES6基本知识及API
  14. 2022-05-12 Druid源码阅读——poolPreparedStatements是如何控制缓存游标的?
  15. 《禅与摩托车维修艺术》读后感
  16. Professional SharePoint 2007 Web Content Management Development: Building Publishing Sites with Offi
  17. MySQL分配内存多少合适_mysql 如何分配内存
  18. web前端期末大作业 html+css+javascript网页设计实例 企业网站制作 (绿色植物网站设计)
  19. 微信公众号服务器搭建
  20. 数据库管理系统有哪些

热门文章

  1. [原创]Silverlight与PostgreSQL数据库的互操作(CURD完全解析)
  2. webpack 开发模式管理 Development
  3. c语言详解sizeof
  4. 国产操作系统可以基于BSD开发再闭源吗?
  5. 设计模式: 自己手动实现一个观察者设计模式
  6. Java多线程协作(wait、notify、 notifyAll)
  7. mysql数据库访问控制_一文总结MySQL数据库访问控制实现原理
  8. 古剑奇谭二服务器维护,《古剑奇谭二》10月4日例行维护更新公告
  9. dev c++自动排版_再也不头疼文字排版了
  10. 台式您想使用系统还原计算机吗,联想台式机一键恢复,小编教你怎么使用联想电脑一键恢复...