第7讲Shell的重定向和管道-Read

合集下载

shell函数参数传递详解

shell函数参数传递详解

shell函数参数传递详解摘要:一、shell编程基础二、函数定义与调用三、参数传递方式四、实战案例解析正文:一、shell编程基础Shell是一种命令行解释器,主要用于执行脚本程序。

它基于Unix操作系统,可以理解为一种简化的、面向任务的编程语言。

在shell编程中,我们可以使用脚本文件来实现各种功能,如文件操作、系统管理等。

本文将重点介绍shell函数参数传递的相关知识,帮助大家更好地掌握shell编程。

二、函数定义与调用在shell脚本中,函数是一种组织代码的方式,它可以将一系列相关操作组合在一起,提高代码的可读性和可维护性。

函数的定义和使用类似于其他编程语言,如Python、Java等。

函数定义:使用`function`关键字,followed by 函数名、括号和括号内的参数列表。

例如:```bashfunction my_function() {echo "Hello, $1!"}```函数调用:使用函数名,可以带参数,也可以不带参数。

例如:```bashmy_function "World"```三、参数传递方式在shell脚本中,函数参数的传递主要有以下几种方式:1.位置参数:根据参数在函数定义中的位置来传递。

如:```bashfunction my_function() {echo "Hello, $1!"echo "Hello, $2!"}my_function "World" "Linux"```2.命名参数:通过为参数指定名称来传递。

如:```bashfunction my_function() {echo "Hello, $1!"echo "Hello, $2!"}my_function "World" "Linux" "Unix"```3.关联参数:通过关联数组传递。

shell常用重定向实例讲解

shell常用重定向实例讲解

shell常⽤重定向实例讲解每个打开的⽂件都会被分配⼀个⽂件描述符.stdin (键盘), stdout (屏幕), 和 stderr (错误消息输出到屏幕上)的⽂件描述符分别是0, 1, 和 2. 对于正在打开的额外⽂件, 保留了描述符3到9.⽂件描述符是⽂件系统为了跟踪这个打开的⽂件⽽分配给它的⼀个数字。

下⾯以实例说明1,>的⽤法复制代码代码如下:[zhangy@localhost ~]$ echo "11111" > 1.txt[zhangy@localhost ~]$ cat 1.txt11111[zhangy@localhost ~]$ echo "11111" 1> 1.txt //这个⽤法和上⾯的⽤法是⼀样[zhangy@localhost ~]$ cat 1.txt11111[zhangy@localhost ~]$ echo "22222" >1.txt[zhangy@localhost ~]$ cat 1.txt22222这种⽤法我想⼤家都⾮常的熟悉,因为这是我经常会⽤到的。

echo "11111" > 1.txt 时,>前⾯是有⼀个1的,是默认的。

>重定向到⽂件时,会将⽂件清空,在写⼊。

复制代码代码如下:[zhangy@localhost ~]$ > 1.txt[zhangy@localhost ~]$ :> 1.txt上⾯的这个例⼦,可以把1.txt⽂件中的内容清空,其实也很好理解,清空后,不输⼊内容当然为空了。

2,>>的⽤法复制代码代码如下:[zhangy@localhost ~]$ echo "2222" >> 2.txt[zhangy@localhost ~]$ cat 2.txt2222[zhangy@localhost ~]$ echo "2222" >> 2.txt[zhangy@localhost ~]$ cat 2.txt22222222从上⾯的这个例⼦我们可以看出,>>重定向到⽂件时,会将输出写到⽂件的结尾。

shell.管道.重定向

shell.管道.重定向

Shell 脚本
• Shell Scripts是一个包含shell指令的文本文
件。 • Shell脚本支持变量与简单的语法来完成批 量工作。 • Shell脚本支持交互的方式,在执行时从标 准输入读取数据。 • 有大量的系统工作都是通过Shell脚本的方 式来完成,例如系统开机,服务控制。
编辑shell脚本
设备文件
• 设备在Linux中以特殊文件的形式存在 • 块(block)设备文件 • 字符(character)设备文件 • 设备文件所在位置 • 查看设备类型
虚拟控制台及用户身份切换
• 在系统中有12个虚拟控制台,前6个可供用
作本地登录 • 用户可以用Alt+Fn(n=1~12)来切换。 • 用su可以用来切换用户身份 su - username
常用快捷键
• Ctrl + d:输入已结束。在shell下相当于一
个exit • Ctrl + c:键盘中断请求。 • Ctrl +s & Ctrl + q:暂停/恢复屏幕输出 • Ctrl + l:清屏,相当于clear。 • Tab:自动补完命令行与文件名
– Tab键双击可以列出所有可能匹配的选择
创建用户
#useradd [用户名] #passwd [用户名] • example: • [root@localhost root]# useradd student • [root@localhost root]# passwd student • Changing password for user student • New password: (无回显) • Retype new password: (无回显) • passwd: all authentication tokens updated successfully • [root@localhost root]#

Shell中Read用法简介

Shell中Read用法简介

Shell中Read用法简介一. read读取单个词.$read name$tony ma$echo $nametony ma$read id passwd$allen passwd$echo $id$allen$echo $passwd$passwd$read id passwd$allen kaka gogo$echo $id$allen$echo $passwd$kaka gogo二. read读取整行.利用while循环来使read读取整行。

以下是代码清单:1 #!/bin/bash2 lineno=13 cat $* |4 while read -r line5 do6 echo "$lineno: $line"7 lineno=$((lineno + 1))8 done三. read的嵌套.1)while外层的read依次读取的是文件pbook中的每一行,而内层的read是从console读取的内容。

2)要实现while read的嵌套,可以使用exec命令,将I/O重定向。

注意exec的用法,以及括号的使用。

1 #!/bin/bash2 echo -n "Enter name to be removed: "3 read name4 p=$(grep "$name " phonebook | wc -l)5 echo $p6 if [ "$p" -gt 1 ]7 then8 echo "More than one match ; Please select the one to remove;"9 grep "$name " phonebook > pbook10 cat pbook | while read line11 do(12 echo -n "$line Remove(y/n)?"13 exec < /dev/tty14 read answer15 if [ "$answer" = y ]16 then17 grep -v "^$line$" phonebook > /tmp/phonebook.tmp18 mv /tmp/phonebook.tmp phonebook19 else20 continue21 fi22 )23 done24 else25 grep -v "^$line$" phonebook > /tmp/phonebook.tmp26 mv /tmp/phonebook.tmp phonebook27 fi28 cat phonebookshell中read参数2011-09-29 17:52关键字:获取用户输入echo -n(不换行)read命令-p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 和“读文件”深入学习1、基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说)。

linuxshell之终端读写文件数据流和重定向,,《,》

linuxshell之终端读写文件数据流和重定向,,《,》

linuxshell之终端读写⽂件数据流和重定向,,《,》终端实现⽂件中数据流的读写;重定向命令列表如下:命令说明command > file将输出重定向到 file。

将终端数据写到⽂件file中command < file将输⼊重定向到 file。

将⽂件command >> file将输出以追加的⽅式重定向到 file。

n > file将⽂件描述符为 n 的⽂件重定向到 file。

n >> file将⽂件描述符为 n 的⽂件以追加的⽅式重定向到 file。

n >& m将输出⽂件 m 和 n 合并。

n <& m将输⼊⽂件 m 和 n 合并。

<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输⼊。

需要注意的是⽂件描述符 0 通常是标准输⼊(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

这⾥可以⽤于⽇志打印到⽂件;输出重定向重定向⼀般通过在命令间插⼊特定的符号来实现。

特别的,这些符号的语法如下所⽰:command1 > file1上⾯这个命令执⾏command1然后将输出的内容存⼊file1。

注意任何file1内的已经存在的内容将被新内容替代。

如果要将新内容添加在⽂件末尾,请使⽤>>操作符。

实例执⾏下⾯的 who 命令,它将命令的完整的输出重定向在⽤户⽂件中(users):$ who > users执⾏后,并没有在终端输出信息,这是因为输出已被从默认的标准输出设备(终端)重定向到指定的⽂件。

你可以使⽤ cat 命令查看⽂件内容:$ cat users_mbsetupuser console Oct 31 17:35tianqixin console Oct 31 17:35tianqixin ttys000 Dec 1 11:33输出重定向会覆盖⽂件内容,请看下⾯的例⼦:$ echo "菜鸟教程:" > users$ cat users菜鸟教程:$如果不希望⽂件内容被覆盖,可以使⽤ >> 追加到⽂件末尾,例如:$ echo "菜鸟教程:" >> users$ cat users菜鸟教程:菜鸟教程:$输⼊重定向和输出重定向⼀样,Unix 命令也可以从⽂件获取输⼊,语法为:command1 < file1这样,本来需要从键盘获取输⼊的命令会转移到⽂件读取内容。

shell的基础语法

shell的基础语法

shell的基础语法Shell是一种命令行解释器,它允许用户与操作系统进行交互并执行各种操作。

Shell的基础语法包括以下几个方面:1. 命令执行,在Shell中,用户可以直接输入命令来执行各种操作,例如`ls`命令用于列出当前目录下的文件和文件夹,`mkdir`命令用于创建新的目录等。

2. 变量,在Shell中,可以使用变量来存储数据并在需要的时候进行引用。

变量的赋值和引用使用类似于`variable_name=value`和`$variable_name`的语法。

3. 控制结构,Shell支持基本的控制结构,如条件判断和循环。

条件判断使用`if-then-else-fi`语法,而循环则可以使用`for`、`while`等关键字来实现。

4. 函数,Shell中可以定义和调用函数,使用`function_name() { ... }`的语法来定义函数,使用`function_name`来调用函数。

5. 管道和重定向,Shell支持管道和重定向操作,允许用户将一个命令的输出作为另一个命令的输入,或者将命令的输入/输出重定向到文件或其他设备。

6. 通配符,Shell支持通配符来匹配文件名,例如``用于匹配任意字符,`?`用于匹配单个字符等。

7. 注释,在Shell脚本中,可以使用`#`符号来添加注释,注释部分将被解释器忽略。

总的来说,Shell的基础语法包括了命令执行、变量、控制结构、函数、管道和重定向、通配符以及注释等内容。

掌握这些基础语法对于编写Shell脚本和在命令行下进行操作都是非常重要的。

希望这些信息能够帮助你更好地理解Shell的基础语法。

shell管道传参数

shell管道传参数

shell管道传参数
在Shell中,可以使用管道将一个命令的输出作为另一个命令的输入。

然而,管道传递参数的方式与常规参数传递方式有所不同。

以下是两种在Shell管道中传递参数的常用方法:
1. 使用子进程:通过echo命令产生带有参数的输出,然后使用xargs命令将参数传递给命令。

例如:
```bash
echo "parameter" xargs -I {} command {}
```
2. 使用重定向:创建一个包含参数的文件(如),并将该文件作为输入传递给命令。

然后,使用重定向将命令的输出保存到另一个文件(如)。

例如:
```bash
command < >
```
请注意,这些方法适用于在Shell管道中传递参数。

如果您需要在Shell脚
本中传递参数,可以使用不同的语法。

例如,脚本内获取参数的格式为:$n,其中n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推。

同时,$0为执行的文件名。

Shell中while循环的done后接一个重定向

Shell中while循环的done后接一个重定向

Shell中while循环的done后接一个重定向读文件的方法:第一步:将文件的内容通过管道(|)或重定向(<)的方式传给while第二步: while中调用read将文件内容一行一行的读出来,并付值给read后跟随的变量。

变量中就保存了当前行中的内容。

例如读取文件/sites/.txt1)管道的方式:cat /sites/.txt |while read LINEdoecho $LINEdone当然也可以将cat /sites/.txt 写成一些复杂一些的,比如:示例1:find -type f -name "*.txt" -exec cat |while read LINEdoecho $LINEdone可以将当前目录所有以 .txt 结尾的文件读出示例2:grep -r "" ./ | awk -F":" '{print $1}' | cat |while read LINEdoecho $LINEdone可以将含有 "" 字符串的所有文件打开并读取。

示例没有实际测试,如果使用请先测试。

:-)2)重定向的方式:2.1 利用重定向符<while read LINEdoecho $LINEdone < /sites/.txt2.2 利用文件描述符(0~9)和重定向符 <exec 3<&0 #先将文件描述符0复制到文件描述符3,也就是给文件描述符0做个备份exec 0</sites/.txt #读文件到文件描述符0while read LINE # 此变量是读来自stdin(即描述符0)的数据doecho $LINEdoneexec 0<&3 #将文件描述符3复制给文件描述符0(恢复0从键盘读入)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0 1 2 3 ...
ü Å ¼ Ì Õ ¶ Ö Ë
0 1 2 3 ...
ü Å ¼ Ì Õ ¶ Ö Ë
0 1 2 3 ...
ü Å ¼ Ì Õ ¶ Ö Ë rpt
sh输出重定向:程序举例1
程序文件msg.c(缓冲I/O) #include <stdio.h> char *msg="Msg from file descripter 5\n"; main() { FILE *f; f=fdopen(5,"w"); if(f) fprintf(f,"%s",msg); }
stdout stdin ü Á Ã î 1 stderr stdin stdout stderr
PIPE
ü Á Ã î 2
Õ ¶ Ö Ë
举例: ps -ef | grep liang
csh管道(续)
命令1 |& 命令2 把stderr合并到stdout然后管道到下一命令
stdout stdin ü Á Ã î 1 stderr PIPE stdin ü Á Ã î 2 stdout stderr
ê× ± ³³³ stdout,fd=1 ê× ± ³³³ stdin,fd=0 ³ò ³ ê× ± ³³ í³ ó³³ stderr,fd=2
使用原始I/0的程序举例
main() /* 使用原始I/0 */ { static char *strl= ”string1\n”; static char *str2= ”string2\n”; int i; for(i=0;i<20;i++) { write(1,strl,strlen(str1)); write(2,str2,strlen(str2)); } exit(0); }
sh输入重定向
<文件 从文件中获取stdin 例如: sort < telno.txt <<定界符 从shell中获取数据,直到再次遇到定界符为止
sh输入重定向(举例)
cat << TOAST Now : `date` My Home Directory is $HOME Good bye! TOAST 上述命令执行结果为: Now : Sat Jul 27 14:47:56 Beijing 2001 My Home Directory is /usr/jiang Good bye! 对定界符所界定内容作加工处理(等同双引号处理):变 量替换,命令替换,不作文件名生成
csh输出重定向(续2)
>>文件 >>&文件 文件已存在则附加到文件尾 csh变量noclobber:保护已存在的文件 set noclobber unset noclobber >! 文件名 >&! 文件名 >>! 文件名 >>&! 文件名
csh管道
命令1 | 命令2 把前面命令的stdout管道成下一命令的stdin
Õ ¶ Ö Ë
举例: cc -c try.c -o try |& more
交互式B-shell的启动
1. 在命令提示符下键入sh命令
程序文件为/bin/sh
2. 注册shell 当sh作为注册shell被启动时,会自动执行用户
主目录下.profile文件中命令
sh脚本的执行
文件lsdir(格式为文本文件) if [ $# = 0 ] then dir=. else dir=$1 fi find $dir -type d –print 执行这一脚本(script)文件的方法: 1. sh<lsdir 2. sh lsdir 3. chmod u+x lsdir; ./lsdir /bin 三种方法均启动程序/bin/sh,生成新进程
csh提示符
csh的提示符由csh的变量prompt控制。 prompt 变量值 ( 是一个字符串)中的!,在实际显示时 以命令号代替。 set prompt=”[\!]%” 在 ! 前 加 \ 以 取 消 csh 对 ! 的 特 殊 解 释 , 实 际 上 变 量 prompt的值为[!]%串
程序的标准输入/输出
csh输入重定向
从文件中获取stdin <文件 从文件中获取stdin 例:cat < list.txt 从shell中获取stdin <<定界符 从shell中获取stdin直到遇到定界符 例: cat<<EOF ABCD EFGH EOF
csh输出重定向
>文件 把stdout重定向到一个文件中
sh输出重定向:举例2
try >rpt 2>&1 stdout和stderr均存入文件rpt
0 1 2 3 ...
ü Å ¼ Ì Õ ¶ Ö Ë
0 1 2 3 ...
ü Å ¼ Ì Õ ¶ Ö Ë rpt
0 1 2 3 ...
ü Å ¼ Ì Õ ¶ Ö Ë rpt
try 2>&1 > rpt stderr定向到终端,stdout重定向到文件
使用缓冲I/0的程序举例
#include <stdio.h> main() /* 使用缓冲I/O */ { static char *str1= ”STRING1\n”; static char *str2= ”STRING2\n”; int i; for (i=0;i<20;i++) { printf(str1); /* 或:fprintf(stdout,str1); */ fprintf (stderr,str2); } exit(0); }
stdout stdin ³³ ò stderr
³³ ³³
例如: ps -ef > proc.list
csh输出重定向(续)
>&文件 把stderr合并到stdout,然后重定向到文件中
stdin
³³ ò
stdout stderr
Hale Waihona Puke ³³举例: cc -c try.c -o try >& err.list
sh输出重定向
> 将stdout重定向到文件
2> 将文件句柄2重定向到文件
2>&1 将文件句柄2重定向到文件句柄1指向的文件 sh重定向允许对其它文件句柄重定向
sh输出重定向:举例1
ls -l > file.list 将命令ls 标准输出定向到文件file.list中 cc try.c -o try 2> try.bugs 将cc命令的stderr重定向到文件try.bugs中 try > try.out 2>try.err try 1> try.out 2>try.err 将try程序执行后的stdout或stderr
相关文档
最新文档