脚本编程

grep无法查找shell传过来的变量?先注意一下文本格式吧!

昨天,同事告诉我发现一个诡异的问题,grep无法搜索shell中的变量,着实很惊讶。到他所说的服务器上试了下,还真是不行! 大概就是这样一个要求: ①、有个文本为userid.txt,里面每一行一个用户id,类似如下: ②、另外还有一个文本为record.txt,里面是所有用户的操作记录,一行一条,并且包含有id,类似如下: ③、现在他要求循环取出userid.txt中每一行ID值,然后去record.txt去查找并保存结果。 实现这个需求原本很简单,根本难不倒他,只要使用while read + grep 就能搞定。可问题是明明record.txt里面包含这些id,却无法输出结果?? 我顺便写了一个测试脚本测试了下: 发现脚本可以打印echo $userId,却无法grep到??而实际上record.txt里面是有这个id的!还真诡异! 先百度搜索了一下【grep 无法搜索变量】,还真有不少类似问题,比如:http://bbs.chinaunix.net/thread-123113-1-1.html 根据经验,对于这种诡异的问题,我首先会想到是不是系统有问题,要是系统有问题你怎么折腾都是错! 于是把他的文件拷贝到其他服务器,发现居然可以了!!!难道真是系统问题么? 第一台是SUSE Linux,第二台是Centos,难道和系统发行版有关系? 后来,同事在第二台服务器上完成了他的项目。但这个问题却一直留在我的脑子里,挥之不去。   今天,我决定再次研究下这个问题,看看是不是有其他原因。我先在那台SUSE Linux上,手工编写所需文件: # vim 1.txt # vim 2.txt # vim test.sh 结果,发现居然可以输出结果!证明这系统没有问题啊!于是再一次测试了一下昨天的脚本,发现还是无法输出。 于是使用 -x 参数 调试一下脚本: 先修改脚本代码: 然后,带 -x 参数执行: 难怪找不到,grep的变量已经变了!0001变成了 $'0001\r' ! 看到\r,立马想到是文本中的换行符,可为毛会输出换行符呢?想到博客以前写的《Linux终端:用cat命令查看不可见字符》,继续改了一下代码: 执行后恍然大悟: 原来是dos下的文本格式,问了下同事,他还真是从Windows下导过来的! — —|| 也就是说,userid.txt这个文本的换行符是Windows格式,在Linux下读取会带有^M。 所以解决上述问题,就很明了了,要么转换userid.txt的换行格式,要不就修改代码,去掉多余的字符! 试了下转换格式,发现居然转换不成功,可能是我没找对方法,暂时先不折腾了! 直接如下修改代码,就搞定了: 好了,搞了半天原来是dos和unix的换行符问题!o(︶︿︶)o 唉!还是经验不足啊! 网上那些问grep无法搜索变量的朋友,赶紧看看是不是文本格式造成的!现在,让我很纳闷的是,为毛在另一台centos系统可以直接grep??为什么在SUSE系统就不行? 如果和发行版没关系的话,那造成2个不同结果的原因就只有一个:在我用sz+rz命令将所有文本传送到centos的过程中,文件很可能被自动转格式了!好吧,具体就不深究了,有兴趣的可以试试看。
阅读全文
脚本编程

[不定期更新]简单的shell脚本练习实例

此文将整理一些简单实用、有趣易学的shell练习脚本,希望可以帮到一些想学习shell的初学者。张戈也会在闲暇时间不定期更新此文,对已有实例进行改进和注释,增强可读性和易懂性。当然我也会不定期的添加更多简单、有趣且实用的shell练习脚本,帮助一些有需要的入门学习者。 一、编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息。 原文代码为: 初学者看到这代码,可能不太会用,其实很简单,看到有$1,就表示需要带参数来执行,所以,这个脚本的执行方法是: ①、将以上代码保存为shell脚本,比如test, ②、使用chmod加上执行权限,chmod +x test ③、执行 ./test  newfile 即可看到效果。 Ps:当然也可以不要第②步,直接使用 sh test newfile 即可。 执行效果如下: 这个脚本对于经常写shell的童鞋就很有用,但是忘记带参数执行就会卡住不动,而且不带路径的话就直接在当前目录下生成新文件,会很乱。所以张戈就将其改进一下,变得更加易用: 改进说明:如果未带参数执行,将在家目录下生成带时间戳的新文件,避免重复及乱的问题。可将这个脚本改名后直接丢到path路径中,比如/bin/addjb  那么你的系统就多了一个命令 addjb了,是不是很有趣呢! 时间有限,以下脚本暂时就不做测试、解释或改进了,请先自行测试吧!有空再来更新。 二、任意三个整数,判断最大数。 执行效果:   注:非常简单的逻辑判断脚本,有兴趣的可以改进下,练练手。   三、求100以内偶数的和。 方法①: 方法②:  四、利用for语句ping C类网、ping B类网。 ①、ping C类网: ②、ping B类网: 五、提示输入一个用户名,判断用户是否存在,如果存在,显示一下用户默认的shell。 六、监控系统登录人数,超过四个,显示已经达到四个,5S检查一下,并退出脚本(exit)
阅读全文