shell while readline中cfgline干啥用的

紧急求助SHELL脚本执行问题_百度知道shell初学者写着玩,功能都可以实现,但总会报错:./IFS.sh: line 4: 0: command not found 求大神指点_百度知道shell脚本错误问题_百度知道博客访问: 27720
博文数量: 10
博客积分: 1480
博客等级: 上尉
技术积分: 115
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
一.& read读取单个词.
&&&& $read name&&&& $tony ma&&&& $echo $name&&&& tony 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/bash&&&& 2& lineno=1
&&&& 3& cat $* |
&&&& 4& while read -r line&&&& 5& do&&&& 6&&&&&&&&& 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/bash&&&& 2& echo -n "Enter name to be removed: "&&&& 3& read name&&&& 4& p=$(grep "$name " phonebook | wc -l)&&&& 5& echo $p&&&& 6& if [ "$p" -gt 1 ]&&&& 7& then&&&& 8&&&&&&&&& echo "M Please sele"&&&& 9&&&&&&&&& grep& "$name " phonebook > pbook&&& 10&&&&&&&&& cat pbook | while read line&&& 11&&&&&&&&& do(&&& 12&&&&&&&&&&&&&&& echo -n& "$line& Remove(y/n)?"&&& 13&&&&&&&&&&&&&&& exec < /dev/tty&&& 14&&&&&&&&&&&&&&& read answer&&& 15&&&&&&&&&&&&&&& if [ "$answer" = y ]&&& 16&&&&&&&&&&&&&&& then&&& 17&&&&&&&&&&&&&&&&&&&&&&&&& grep -v "^$line$" phonebook > /tmp/phonebook.tmp&&& 18&&&&&&&&&&&&&&&&&&&&&&&&& mv /tmp/phonebook.tmp phonebook&&& 19&&&&&&&&&&&&&&& else&&& 20&&&&&&&&&&&&&&&&&&&&&&&&& continue&&& 21&&&&&&&&&&&&&&& fi
&&& 22&&&&&&&&&&&& )&&& 23&&&&&&&&& done&&& 24& else&&& 25&&&&&&&&& grep -v "^$line$" phonebook > /tmp/phonebook.tmp&&& 26&&&&&&&&& mv /tmp/phonebook.tmp phonebook
&&& 27& fi
&&& 28& cat phonebook
四.& 用read读取一行中的多个字段:
[root@localhost lk]# ls -l| grep b.txt
&-rw-r--r-- 1 root root 5435 Apr 20 10:59 b.txt
[root@localhost lk]# ls -l| grep c.txt
-rw-r--r-- 1 root root 3397 Apr 20 11:00 c.txt
&[root@localhost lk]# ls -l| grep d.txt
-rw-r--r-- 1 root root 1673 Apr 20 11:01 d.txt
&[root@localhost lk]# cat a.test
&b.txt 5435
&c.txt 3397
&d.txt 1600
[root@localhost lk]# cat size_1.sh
&#cat a.test |
while read filename size
&&&&&&& real_size=$(ls -l $filename | awk '{print $5}')
&&&&&& &if [ "$real_size" -eq "$size" ]
&&&&&&&&then
&&&&&&&&&&&&& mv $filename /home/liukang
&&&&&&& else
&&&&&&&&&&&&& echo "($filename)'s size is not equal."
&&&&&& &fi
done < a.test
[root@localhost lk]#
文件a.test中的每一行都含有两个字段,分别是文件名(filename)和文件大小(size)。
先用while& read来分别读取每一行,再读取每一行的每一个字段。
阅读(6184) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。9516人阅读
linux系统(107)
&&&& 在Bash Shell中,管道的最后一个命令都是在子Shell中执行的。这意味着在子Shell中赋&#20540;的变量对父Shell是无效的。所以当我们将管道输出传送到一个循环结构,填入随后将要使用的变量,那么就会产生很多问题。一旦循环完成,其所依赖的变量就不存在了。
& & & /& cat & test8_1.sh
&& && #!/bin/sh
&& && #1. 先将ls -l命令的结果通过管道传给grep命令作为管道输入。
&& && #2. grep命令过滤掉包含total的行,之后再通过管道将数据传给while循环。
&& && #3. while read line命令从grep的输出中读取数据。注意,while是管道的最后一个命令,将在子Shell中运行。
&& && ls -l | grep -v total | while read line
&& & && & #4. all变量是在while块内声明并赋&#20540;的。
&&& && && all=&$all $line&
&& && &&& echo $line
& & & done
& & & #5. 由于上面的all变量在while内声明并初始化,而while内的命令都是在子Shell中运行,包括all变量的赋&#20540;,因此该变量的&#20540;将不会传递到while块外,因为块外地命令是它的父Shell中执行。
& & & echo &all = & $all
& & & CTRL&#43;D
& & & /& ./test8_1.sh
& & & -rw-r--r--.& 1 root root 193 Nov 24 11:25 outfile
& & & -rwxr-xr-x. 1 root root 284 Nov 24 10:01 test7.sh
& & & -rwxr-xr-x. 1 root root 108 Nov 24 12:48 test8_1.sh
& & & all =
& & & 为了解决该问题,我们可以将while之前的命令结果先输出到一个临时文件,之后再将该临时文件作为while的重定向输入,这样while内部和外部的命令都将在同一个Shell内完成。
& & & /& cat & test8_2.sh
& & & #!/bin/sh
& & & #1. 这里我们已经将命令的结果重定向到一个临时文件中。
& & & ls -l | grep -v total & outfile
& & & while read line
& && &&&& #2. all变量是在while块内声明并赋&#20540;的。
& && &&&& all=&$all $line&
&& && &&& echo $line
&& && &&& #3. 通过重定向输入的方式,将临时文件中的内容传递给while循环。
&& && done & outfile
& & & #4. 删除该临时文件。
& & & rm -f outfile
& & & #5. 在while块内声明和赋&#20540;的all变量,其&#20540;在循环外部仍然有效。
& & & echo &all = & $all
& & & CTRL&#43;D
& & & /& ./test8_2.sh
& & & -rw-r--r--.& 1 root root&& 0 Nov 24 12:58 outfile
&& && -rwxr-xr-x. 1 root root 284 Nov 24 10:01 test7.sh
&& && -rwxr-xr-x. 1 root root 140 Nov 24 12:58 test8_2.sh
& & & all =& -rwxr-xr-x. 1 root root 284 Nov 24 10:01 test7.sh -rwxr-xr-x. 1 root root 135 Nov 24 13:16 test8_2.sh
&& && 上面的方法只是解决了该问题,然而却带来了一些新问题,比如临时文件的产生容易导致性能问题,以及在脚本异常退出时未能及时删除当前使用的临时文件,从而导致生成过多的垃圾文件等。下面将再介绍一种方法,该方法将同时解决以上两种方法同时存在的问题。该方法是通过HERE-Document的方式来替代之前的临时文件方法。
&& && /& cat & test8_3.sh
& & & #!/bin/sh
&& && #1. 将命令的结果传给一个变量&& &
&& && OUTFILE=`ls -l | grep -v total`
&& && while read line
& && &&&& all=&$all $line&
& && &&&& echo $line
& & & done &&EOF
& & & #2. 将该变量作为该循环的HERE文档输入。
& & & $OUTFILE
& & & #3. 在循环外部输出循环内声明并初始化的变量all的&#20540;。
& & & echo &all = & $all
& & & CTRL&#43;D
& & & /& ./test8_3.sh
& & & -rwxr-xr-x. 1 root root 284 Nov 24 10:01 test7.sh
& & & -rwxr-xr-x. 1 root root 135 Nov 24 13:16 test8_3.sh
& & & all =& -rwxr-xr-x. 1 root root 284 Nov 24 10:01 test7.sh -rwxr-xr-x. 1 root root 135 Nov 24 13:16 test8_3.sh
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:323141次
积分:3794
积分:3794
排名:第6034名
原创:23篇
转载:217篇
评论:29条
(1)(3)(6)(4)(1)(4)(4)(1)(2)(3)(2)(1)(5)(3)(1)(5)(10)(5)(7)(6)(1)(10)(8)(10)(8)(6)(14)(5)(5)(4)(2)(7)(1)(1)(6)(13)(8)(1)(12)(4)(5)(1)(5)(1)(3)(6)(5)(5)(5)(5)}

我要回帖

更多关于 shell read line 的文章

更多推荐

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

点击添加站长微信