标题咋一看有点奇怪,脚本运行和压缩文件解压有啥关系,其实确实没啥关系,单纯只是因为笔者最近接触到这两方面的一些东西了,准备写一写来记录一下。但是又懒得开两个文章了,所以干脆把没啥联系的两个东西放一个地方写了。

Linux脚本运行

Linux下说的脚本,一般是指以.sh结尾的Shell脚本。我没有接触过啥Shell编程,据说Shell这能写上千行做业务的,应该表达能力很强。我的个人理解就是一个高级命令行,类似于Python解释器即时解释模式和写.py文件之后再解释类似。

那就按和Python的对应关系,来简单粗略地看一下Shell的语法。

Shell的语法

变量赋值

有时候需要储存一些信息,那就首先得用到变量。和Python类似,Shell没有所谓的类型,只需要直接赋值即可。不过要注意变量名和等号之间不能有空格!

1
image_path="/root/data/image_path"

但使用的时候需要额外用$符号标记一下:

1
echo $image_path

拼接字符串

拼接字符串也是非常重要的一个技能,毕竟有时候还是希望输出更可读一点的:

1
2
cd $image_path
echo "Accessing: ${image_path}"

获取参数

命令行非常关键的一个话题就是获取参数,使用$0 , $1这样的方式获取参数,$0代表的使执行的文件名,包含执行路径。这点和Python的argv非常相似。

遍历文件

可以结合ls和for...in...循环语句来做:

1
2
3
for image_file in $(ls ${image_path});do
echo $image_file
done

if else

这个地方有点新奇,因为它if的结束语句是fi:

1
2
3
4
5
6
if [ condition ]
then
command
else
command2
fi

这里也要注意中括号和condition不要粘在一起了,不然会有问题。do的结束语句是done很好理解,那为啥if的结束语句是fi呢?

因为fi是if反过来写的,这就是结束了,还比较雷。一开始看到了没怎么琢磨明白fi是啥意思。

输入输出重定向

一般用得比较多的就是输出重定向和输入重定向:

1
2
3
4
# 输出重定向
command > file
# 输入重定向
command < file

语法大概就写这么多吧,肯定非常不完整,但是对我来说,能大致看懂别人写的脚本是啥意思就行了。

Chmod赋予可执行权限

有的时候Copy了别人的脚本,然后啥后缀名都是对的,结果死活执行不了。

这里涉及到Linux的一个权限机制,它不是说写入了一个文本就能执行的,要执行必须给它赋予“可执行”的权限才能执行。

要让脚本可执行,可以对脚本赋予可执行权限:

1
2
3
4
# 先赋予可执行权限,即-x参数
chmod -x {你要执行的脚本}
# 之后运行
./{你要执行的脚本}

这样脚本就顺利跑起来了。

Linux解压压缩文件

tar命令

基本用这个命令就够了,这个命令实际上不是压缩,只是打包而已,不会做任何压缩大小的事。但是,能有比较好压缩比的是文本,但文本又不咋占地方;图像占地方,但是它本身就是高度压缩了,再压缩收益很小,而且要压缩解压还废计算资源。因此很多时候我需要的实际上是打包,把一堆文件或文件夹聚合在一块。

下面是tar的几个核心功能

1
2
3
4
5
6
# 打包文件
tar -cf {压缩包名称}.tar {待打包文件目录}
# 解压文件
tar -xf {压缩包名称}.tar -C {解压路径}
# 查看打包文件内容但不解压,有时候忘记打包了哪些文件可以用这个方法看看里面的文件内容
tar -tvf {压缩包名称}.tar

zip命令

zip是会压缩的,打包一大堆文本的时候可以有比较显著的空间优势。

1
2
3
4
5
6
# 压缩文件
zip -r {压缩包名称}.zip {待打包文件目录}
# 解压文件
unzip {压缩包名称}.zip -d {解压路径}
# 只查看文件而不解压
unzip -v {压缩包名称}.zip

嗯,这些应该就够用了。突然没有图形界面要靠命令行做这些确实有点不习惯,但好处就是可以自动化呀。很多复杂的操作可以写成脚本,后面就不那么麻烦了,应该是能提升效率的。