记录一些常用的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
|
循环
主要包括for和while语法
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
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
|