记录一些常用的shell,便于使用

基本语法篇

条件判断

首先,包裹条件的中括号有两种:

  • [] 更通用
  • [[]] 更强大,是一种bash语法

两者的区别:

特点 单中括号 [ ] 双中括号 [[ ]]
逻辑关系 使用标准的POSIX语法 使用扩展的Bash语法
字符串比较 使用= (==也可以)和 != 可以使用==!=
逻辑运算符 使用-a (and) 和 -o (or) 可以使用&& (and) 和 ||
引用变量 需要使用引号 "variable" 可以直接使用变量 variable
模式匹配 需要使用*进行通配符匹配 可以使用*?[ ]进行模式匹配
数值比较 使用-eq, -ne, 等 同样支持
文件测试 使用-f, -d, 等 同样支持
嵌套 可以嵌套使用 可以更灵活地嵌套使用

对于引用变量项,如果变量包含空格或特殊字符,单中括号不会识别,也就是无法这些当成包含在变量内的值,因此需要用引号。但是双中括号无需引号即可识别。

IF语法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 当then和if在同一行,必须加分号
if condition; then
	xxx
fi
# 当then在下一行时,就不用加分号
if condition
then
	xxx
fi
# elif/else
if condition; then
	xxx
elif condition1; then
	xxx
else
	xxx
fi

循环

主要包括forwhile语法

for

1
2
3
4
for var in list
do
	xxx
done

例如:列出该目录下的所有文件名

1
2
3
4
for filename in `ls ./`
do
echo "$filename"
done

while

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
while condition
do
	xxx
done

# 读取文件的每一行,也常用while来实现
while read line
do
	xxx
done < file

例如:读取文件的每一行,并在前面添加"say:"

1
2
3
4
while read line
do
echo "say:"$line
done < ./file

文件篇

获取某目录下的所有子目录的文件名

https://blog.csdn.net/Register_man/article/details/53860064

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#! /bin/bash
function read_dir(){
	for file in `ls $1`       #注意此处这是两个反引号,表示运行系统命令
	do
		if [ -d $1"/"$file ]  #注意此处之间一定要加上空格,否则会报错
		then
			read_dir $1"/"$file
		else
			echo $1"/"$file   #在此处处理文件即可
		fi
	done
}   
#读取第一个参数
read_dir $1

查看文件的编码

1
2
3
4
5
6
7
8
9
file -bi file
# -b : 不展示文件名; -i : 展示MIME类别

# 列出目录下所有文件的类型
> file *                                                      
1111:         directory                   
1.txt:        empty                                                 
2.txt:        ASCII text                                             
testCut.txt:  UTF-8 Unicode text                                     

查看文件内容(可以看到非打印字符)

https://blog.csdn.net/qq_35782149/article/details/113949995

对于windows的换行符在UNIX下会显示^M的问题,需要注意的是,并不是用vi查看就一定能发现。

vi命令查看test.sh文件看不到^M, 其实这个跟vi的版本有关系。有些版本vi显示的是行尾为M(AIX下都是显示M)。而有些vi打开时可以看到底下有[dos]的格式提示。

1
2
# 用这个命令可以看到文件中的非打印字符,也就是说,如果有^M,通过这种查看方式可以看出来
cat -v file

常用基础命令篇

grep

1
2
3
4
# -i 忽略大小写的匹配
# -c 获取匹配的个数
# 可以通过使用多次 -e 来匹配多种(or的关系)
# -r 遍历文件夹查找(包括子目录)

cat

1
2
3
4
5
6
# 合并文件
cat file1 file2 > file3
# 快捷创建和输入到新文件
cat > file
blablabla
# CTRL+D 退出编辑模式保存文件

sed

1
2
3
# -i 改动直接作用到原变量处
# sed -n '2,4p' file 获取特定行之间的数据
# sed 's/xxx/xxx1/g' 模式替换;也可用于批量重命名文件等

tail

1
tail -f # 动态查看文件后面

xargs

The xargs command builds and runs commands using input from other commands. It’s used to pass a list of items as arguments to another command.

1
2
3
4
5
6
# 批量删除
find . -name "*.txt" | xargs rm
# 批量新增
cat dir.list | xargs mkdir
# 压缩文件
ls *.log | xargs gzip