Linux Shell脚本的一道作业

今天刚学完Linux基础,老师作业中有这样一道题:

先把/etc 目录下面(不包括子目录)所有以.conf 结尾的文件负责到/tmp 目录下面去,然后写一个脚本,实现把tmp 目录所有以.conf 结尾的文件,后缀改成.config。

我的思路是这样的:(复制就不说了,直接cp就好)

  1. 用ls列出/tmp目录中的所有文件信息;
  2. 使用grey过滤后缀.conf;
  3. 使用awk获取文件名;
  4. 根据文件名获取具体路径和重命名后的路径;
  5. 用mv重命名。
然后写出了如下的脚本:
#!/bin/bash
NAME=""
NEWNAME=""
"ls -l /tmp/ | awk -F   {print $9}" | grep .conf | while read line
do
	NAME="/tmp/$line"
	NEWNAME="/tmp/`echo "$line" | awk -F . {print $1}`.config"
	mv "$NAME" "$NEWNAME"
done
#!/bin/bash NAME="" NEWNAME="" "ls -l /tmp/ | awk -F {print $9}" | grep .conf | while read line do NAME="/tmp/$line" NEWNAME="/tmp/`echo "$line" | awk -F . {print $1}`.config" mv "$NAME" "$NEWNAME" done
执行后果断出错: 执行后果断出错:
我也是挺佩服自己出这种错误的,把ls -l /tmp/ | awk -F {print $9}用""引起来相当于把他整体当作一个文件给 | 去处理,所以又自作聪明的加上了反引号: 我也是挺佩服自己出这种错误的,把ls -l /tmp/ | awk -F {print $9}用""引起来相当于把他整体当作一个文件给 | 去处理,所以又自作聪明的加上了反引号:
#!/bin/bash
NAME=""
NEWNAME=""
"`ls -l /tmp/ | awk -F   {print $9}`" | grep .conf | while read line
do
	NAME="/tmp/$line"
	NEWNAME="/tmp/`echo "$line" | awk -F . {print $1}`.config"
	mv "$NAME" "$NEWNAME"
done
#!/bin/bash NAME="" NEWNAME="" "`ls -l /tmp/ | awk -F {print $9}`" | grep .conf | while read line do NAME="/tmp/$line" NEWNAME="/tmp/`echo "$line" | awk -F . {print $1}`.config" mv "$NAME" "$NEWNAME" done
这就错的更厉害了。。 这就错的更厉害了。。

#!/bin/bash NAME="" NEWNAME="" "`ls -l /tmp/ | awk -F {print $9}`" | grep .conf | while read line do NAME="/tmp/$line" NEWNAME="/tmp/`echo "$line" | awk -F . {print $1}`.config" mv "$NAME" "$NEWNAME" done 这就错的更厉害了。。
图太长,没有接完,总之就是把我的查找结果当成了一个命令,当然不会有这个命令,其实直接写就好,什么都不用加: 图太长,没有接完,总之就是把我的查找结果当成了一个命令,当然不会有这个命令,其实直接写就好,什么都不用加:
#!/bin/bash
NAME=""
NEWNAME=""
ls -l /tmp/ | awk -F   {print $9} | grep .conf | while read line
do
	NAME="/tmp/$line"
	NEWNAME="/tmp/`echo "$line" | awk -F . {print $1}`.config"
	mv "$NAME" "$NEWNAME"
done
#!/bin/bash NAME="" NEWNAME="" ls -l /tmp/ | awk -F {print $9} | grep .conf | while read line do NAME="/tmp/$line" NEWNAME="/tmp/`echo "$line" | awk -F . {print $1}`.config" mv "$NAME" "$NEWNAME" done
没有报错,查询/tmp目录结果如下: #!/bin/bash NAME="" NEWNAME="" ls -l /tmp/ | awk -F {print $9} | grep .conf | while read line do NAME="/tmp/$line" NEWNAME="/tmp/`echo "$line" | awk -F . {print $1}`.config" mv "$NAME" "$NEWNAME" done 没有报错,查询/tmp目录结果如下:
--------------------------------------------------------华丽的分割线--------------------------------------------------------------------------------------------------- --------------------------------------------------------华丽的分割线---------------------------------------------------------------------------------------------------
今天看了一下同学的做法,发现我想的太复杂了。。。 今天看了一下同学的做法,发现我想的太复杂了。。。

有一种茅塞顿开的感觉,看来我的思想还停留在Java编程上,没有认识到Shell中一切皆文件的特性,死板的按Java的思路,现获取文件名再做处理,其实Shell中可以直接通过命令来查询文件名。

看来还有很多要学的,加油吧!

经验分享 程序员 微信小程序 职场和发展