第7讲Shell的重定向和管道-Read
- 格式:ppt
- 大小:231.00 KB
- 文档页数:22
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常⽤重定向实例讲解每个打开的⽂件都会被分配⼀个⽂件描述符.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中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之终端读写⽂件数据流和重定向,,《,》终端实现⽂件中数据流的读写;重定向命令列表如下:命令说明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的基础语法包括以下几个方面: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管道中传递参数的常用方法:
1. 使用子进程:通过echo命令产生带有参数的输出,然后使用xargs命令将参数传递给命令。
例如:
```bash
echo "parameter" xargs -I {} command {}
```
2. 使用重定向:创建一个包含参数的文件(如),并将该文件作为输入传递给命令。
然后,使用重定向将命令的输出保存到另一个文件(如)。
例如:
```bash
command < >
```
请注意,这些方法适用于在Shell管道中传递参数。
如果您需要在Shell脚
本中传递参数,可以使用不同的语法。
例如,脚本内获取参数的格式为:$n,其中n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推。
同时,$0为执行的文件名。
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从键盘读入)。
(转)Shell中read的⽤法详解Shell中read的⽤法详解read的常⽤⽤法如下:read -[pstnd] var1 var2 ...-p 提⽰语句-n 字符个数-s 屏蔽回显-t 等待时间-d 输⼊分界[plain]1. 01). read # 从标准输⼊读取⼀⾏并赋值给特定变量REPLY2. root@linux~# read3. Hello,World!4. root@linux~# echo $REPLY5. Hello,World!6.7. 02). read name # 从标准输⼊读取输⼊并赋值给变量name8. root@linux~# read name9. Jerry10. root@linux~# echo $name11. Jerry12.13. 03). read var1 var2 # 第⼀个变量放置于var1,第⼆个变量放到var214. root@linux~# read firstname lastname15. Jerry Gao16. root@linux~# echo "firstname:$firstname lastname:$lastname"17. firstname:Jerry lastname:Gao18.19. 04). read -p "text" # 打印提⽰'text',等待输⼊,并将输⼊存储在REPLY中20. root@linux~# read -p 'Please Enter your name:-->'21. Please Enter your name:-->Jerry22. root@linux~# echo $REPLY23. Jerry24.25. 05). read -p "text" var # 打印提⽰'text',等待输⼊,并将输⼊存储在VAR中26. root@linux~# read -p 'Please Enter your name:-->' name27. Please Enter your name:-->Jerry28. root@linux~# echo $name29. Jerry30.31. 06). read -p "text" var1 var2 # 打印提⽰'text',等待输⼊,将变量分别存储在var1,var2...32. root@linux~# read -p 'What your name? ' firstname lastname33. What your name? Jerry Gao34. root@linux~# echo "Firstname:$firstname Lastname:$lastname"35. Firstname: Jerry Lastname:Gao36.37. 07). read -r line # 允许输⼊包含反斜杠38. root@linux~# read line # 不带-r参数;则反斜杠不显⽰39. This is line 1. \ This is line 2.40. root@linux~# echo $line41. This is line 1. This is line 2.42.43. root@linux~# read -r line # 带-r参数;则反斜杠正常显⽰显⽰44. This is line 1. \ This is line 2.45. root@linux~# echo $line46. This is line 1. \ This is line 2.47.48. 08). read -t 5 # 指定读取等待时间为5秒49. root@linux~# read -t 5 -p 'Your Name:' name50. Your Name:Jerry51. root@linux~# echo $name # 如果5秒还未输⼊,则不能输⼊52. Jerry53.54. 09). read -a arrayname # 把单词清单读⼊arrayname的数组⾥55. root@linux~# read -a citys56. BJ SH CD GZ57. root@linux~# echo ${citys[*]}58. BJ SH CD GZ59. root@linux~# echo ${citys[0]}60. BJ61.62. 10). read -s -p "pwd:" pwd # 使⽤-s参数可以不显⽰⽤户的输⼊63. root@linux~# read -p "Enter Your Password:" -s PASSWORD64. Enter Your Password:65. root@linux~#66. root@linux~# echo $PASSWORD # 刚才输⼊的密码为:123467. 123468.69.70. 11). read -n 1 -p "Sure?(y/n):" # 使⽤-n,来确定参数个数71. root@linux~# read -n 1 -p "Are you sure?(y/n): " ANSWER72. Are you sure?(y/n): y73. root@linux~#74. root@linux~# echo -e "Your ANSWER is: $ANSWER"75. Your ANSWER is: y76.77. 12). read -d ":" var # 使⽤:作为输⼊分界符78. root@linux~# read -d ";" -p "Enter Your Name:" name79. Enter Your Name:Jerry Gao;80. root@linux~# echo -e "Your Name: $name"81. Your Name: Jerry Gaoread在脚本中的应⽤:遍历⽅式⼀:[python]1. #!/bin/bash2.3. count=04.5. while read line6. do7. echo -e "$count:-->$line"8. count=$[ count + 1]9. done < /etc/passwd遍历⽅式⼆:[python]1. #!/bin/bash2.3. awk -F: '{print $1,$7}' /etc/passwd | while read user bash4. do5. echo -e "USER=$user; BASH=$bash"6. done。
shell中read的用法一、简介在shell脚本中,read是一个非常重要的命令,它用于从标准输入中读取用户输入,并将其赋值给变量。
read命令的基本语法如下:read [-options] [变量名]下面将详细介绍read命令的用法及其常见选项。
二、基本用法1. 读取用户输入使用read命令可以读取用户在终端中输入的数据,并将数据保存到一个变量中,例如:read nameecho "你的名字是:$name"以上代码中,read命令会等待用户输入,并将输入的内容保存到name变量中,然后使用echo命令将名字输出到终端。
2. 多个变量赋值read命令也可以同时读取多个变量的值,多个变量之间以空格或制表符分隔。
例如:read name ageecho "你的名字是:$name,你的年龄是:$age"以上代码中,read命令会依次读取用户输入的名字和年龄,并使用echo命令将它们输出到终端。
3. 提示用户输入使用read命令时,可以在命令后面加上参数-p来显示提示信息,以引导用户输入。
例如:read -p "请输入你的名字:" nameecho "你的名字是:$name"以上代码中,用户会看到提示信息”请输入你的名字:“,然后输入自己的名字,最后输出名字到终端。
4. 限制输入的字符个数使用read命令时,可以在命令后面加上参数-n来限制输入的字符个数。
例如:read -n 5 nameecho "你的名字的前五个字符是:$name"以上代码中,read命令只会读取用户输入的前五个字符,并将其保存到name变量中。
5. 超时退出使用read命令时,可以在命令后面加上参数-t来设置超时时间,如果用户在指定的时间内没有输入,read命令会自动退出。
例如:read -t 10 nameecho "你的名字是:$name"以上代码中,read命令会等待10秒钟,如果在10秒内用户没有输入,read命令会自动退出并输出名字为空。