关于bash脚本(Linux) shell的一些学习心得
对bash脚本的一些理解
bash脚本就是把一些我们重复的在终端输入的操作写成.sh文件,然后直接在终端运行这个.sh文件,就可以批量的完成我的操作,可能我这句话说的不是很准确,我要用我写的例子来讲述我的理解。
要实现的案例
首先我要做的是将一个文件夹里所有的deb文件按照它们的名字建立分级目录,然后将deb解压后的文件夹里的所有.so文件和可执行文件提取到建立好的分级目录里。
如图所示,文件名字为lighttpd_1.4.35-4ubuntu2.1_arm64.deb。我要建立一个分级目录/lighttpd/1.4.35-4ubuntu2.1/arm64.deb,把解压后的deb文件中的.so文件和可执行文件放到这个目录下。如果仅仅只对这一个文件进行操作,我们只需要在终端分别输入指令就可以。
#先建立解压后的deb文件存放的文件夹
mkdir extract
mkdir extract/DEBIAN
#然后对文件进行解压,XXX为文件的名字,这个例子里面XXX就填成lighttpd_1.4.35-4ubuntu2.1_arm64.deb
dpkg -X .XXX extract
#按照deb文件的名字建立分级目录
#mkdir -p p1/p2/p3
mkdir -p lighttpd/1.4.35-4ubuntu2.1/arm64.deb
#查找所有的so文件和可执行文件
find . -name *.so
find . -type f -perm -111
#然后使用cp操作就可以把找到的文件复制到之前创建好的多级文件夹里
deb文件:deb包是Debian,Ubuntu等Linux发行版的软件安装包,扩展名为.deb。
但是这样子只能每个文件都要在终端敲一遍,这个时候我们的bash脚本就发挥作用了。
开始写实现上面需求功能的脚本
bash脚本的开头要写上
#! /bin/bash
#author:zhangyingli
#bash脚本的目的
#建立解压deb文件后的文件所在的文件夹
mkdir extract
mkdir extract/DEBIAN
#Linux Shell获取文件夹下的文件名
#$n就代表传给脚本的第几个参数
path=$1 #$1代表传入的第一个参数,输入deb文件在的文件夹的路径
files=$(ls $path)
for filename in $files #将path下的文件名循环出来
do
#mkdir extract
#mkdir extract/DEBIAN
#echo $filename
#将文件解压到extract文件夹下
dpkg -X ./deb/$filename extract
#将文件名字转换为字符串
string="$filename"
#echo $string
index=0
#分割文件名字转换为的字符串
OLD_IFS="$IFS"
IFS="_"
arr=($string)
IFS="$OLD_IFS"
for s in ${arr[@]}
do
array_name[index]=$s
#echo ${array_name[index]}
let index++
#echo "$s"
done
#建立多级目录
mkdir -p ${array_name[0]}/${array_name[1]}/${array_name[2]}
#开始寻找so文件和可执行文件
find /home/hyy/extract -name "*.so" | xargs -i cp {} ./${array_name[0]}/${array_name[1]}/${array_name[2]}/
find /home/hyy/extract -type f -perm -111 | xargs -i cp {} ./${array_name[0]}/${array_name[1]}/${array_name[2]}/
#删除extract目录
sudo rm -rf /home/extract
done
如何在linux终端运行bash脚本
一般要先给权限:
sudo chmod 777 gitpull.sh 赋予可执行权限
运行bash语句:
bash 脚本的名字.sh
chomd用法
Linux系统中,每个用户的角色和权限划分的很细致也很严格,每个文件(目录)都设有访问许可权限,利用这种机制来决定某个用户通过某种方式对文件(目录)进行读、写、执行等操作。
操作文件或目录的用户,有3种不同类型:文件所有者、群组用户、其他用户。最高位表示文件所有者的权限值,中间位表示群组用户的权限值,最低位则表示其他用户的权限值,所以,chmod 777中,三个数字7分别对应上面三种用户,权限值都为7。
文件或目录的权限又分为3种:只读、只写、可执行。