一个liunx命令题目引发的对shell的回顾

原题回顾:打印当前文件夹下所有的.txt文件的最后一行到新文件newFile.txt中
其答案最后解答如下

1
2
3
4
5
6
7
8
#!/bin/bash
for file in `ls .`
do
if [ -f $file ] && [[ $file =~ .*\.txt ]]
then
tail -1 $file >> newFile.txt
fi
done

在实现的过程中遇到了一些问题,也是一些重要的知识点。

shell脚本的头部加上bash所在的位置

如#!/bin/bash

使用for遍历一个命令返回的列表

可以使用``符号包围一个命令来获取其返回值,如ls .返回当前目录下所有的文件(包括目录),for循环取得其下所有的文件名称。
for的基本语法格式是

1
2
3
4
for variant in `cmd`
do
variant do sth.
done

使用if语句进行判断变量的值

引用变量的值使用$variant,其中if语句的格式为

1
2
3
4
5
6
7
8
if condition
then
do sth.
elif condition
do sth.
else
do sth.
fi

condition可以用test condition,或者[ condition ]或者[[ condition ]]注意方括号condition左右都有空格,其中[[]]可以直接使用>,<等符号,而[]能够使用的符号比较少。
在[[]]condition中使用正则表达式进行匹配,例如[[ $file =~ .*.txt ]],匹配文件名后缀名为txt的文件,注意=~符号的前后也要右空格,并且正则表达式是不加引号的,如果要加,前面的变量也要加上。
正则表达式.*代表任意一串字符,*是代表前面的字符重复0-1次而已。^pattern$, ^代表以什么开头,$代表以什么结尾
[ -f $file ]代表文件是一个文件而不是目录,两个表达式可以用&&,||连接

读一个文件的最后一行

tail -number file显示文件的后几行
head -number file显示文件的前几行

重定向符号

单个>代表重定向到文件,但是会覆盖原来的内容,两个>>代表后来添加

坚持原创技术分享,您的支持将鼓励我继续创作!