#!/bin/bash
function download_dir() {
url=$1
dir=$2
mkdir -p $dir
wget -q $url/TRANS.TBL -O $dir/TRANS.TBL
local line
while read line; do
local info=($line)
if [ "${info[0]}" == 'D' ]; then
download_dir $url/${info[2]} $dir/${info[2]}
else
wget -q $url/${info[2]} -O $dir/${info[2]}
fi
done < $dir/TRANS.TBL
}
if [ "${1:0:4}" == 'http' ]; then
download_dir $1/os_patch os_patch
download_dir $1/app_install app_install
else
cp data/* /tmp -rf
fi
cd /tmp;
devicetype="`cat /proc/cmdline | awk -F " " {'print $3'}`"
if [ "`echo $devicetype | grep NI`" != "" ]; then
sed -i 's/device_type=NI-Cloud-NVI/device_type='$devicetype'/g' ./install.info
sleep 1
mkdir -p System/$devicetype
cd System/;
mv ./NI-Cloud-NVI/* ./$devicetype/
rm -rf ./NI-Cloud-NVI
cd -
fi
sleep 1
chmod +x *.sh
./install.sh >>/root/install_system.log
mv /root/install_system.log /log/install/ks-post.log
mv /root/install_System.log /log/install/install_System.log
您的脚本主要执行以下任务:
- 下载目录: 通过一个递归函数
download_dir
从给定的 URL 下载文件和子目录。这个函数会创建本地目录,并下载远[用户中断]
您提供的脚本执行了一系列操作,包括下载文件、文件处理和执行安装脚本。下面是对这个脚本的逐行解析:
脚本内容分析
-
定义脚本的解释器:
#!/bin/bash
指定脚本应该使用Bash解释器执行。
-
定义下载函数
download_dir
:function download_dir() { url=$1 dir=$2 ... }
这个函数接受两个参数:一个是资源的URL,另一个是本地存储目录。它用于递归下载指定URL下的所有文件和目录。
-
创建本地目录并下载
TRANS.TBL
文件:mkdir -p $dir wget -q $url/TRANS.TBL -O $dir/TRANS.TBL
在本地创建指定目录,并从URL下载
TRANS.TBL
文件到这个目录。 -
读取
TRANS.TBL
并下载文件或递归子目录:while read line; do ... done < $dir/TRANS.TBL
遍历
TRANS.TBL
文件中的每一行,根据其内容下载文件或递归调用download_dir
函数处理子目录。 -
检查脚本的第一个参数:
if [ "${1:0:4}" == 'http' ]; then ... else ... fi
如果脚本的第一个参数以
http
开头,执行下载操作;否则,执行文件复制操作。 -
下载或复制特定目录:
- 如果是
http
,则下载os_patch
和app_install
目录。 - 如果不是
http
,则将data
目录下的文件复制到/tmp
。
- 如果是
-
获取设备类型并进行处理:
devicetype="`cat /proc/cmdline | awk -F " " {'print $3'}`" if [ "`echo $devicetype | grep NI`" != "" ]; then ... fi
从
/proc/cmdline
获取设备类型,并检查是否包含NI
字符串。如果是,执行一系列文件操作和替换。 -
修改
install.info
文件中的设备类型:sed -i 's/device_type=NI-Cloud-NVI/device_type='$devicetype'/g' ./install.info
使用
sed
命令在install.info
文件中替换设备类型。 -
文件和目录的操作:
- 创建目录
System/$devicetype
。 - 将
NI-Cloud-NVI
目录中的文件移动到新创建的目录。 - 删除原
NI-Cloud-NVI
目录。
- 创建目录
-
设置执行权限并运行安装脚本:
chmod +x *.sh ./install.sh >>/root/install_system.log
为所有
.sh
脚本设置执行权限,并运行install.sh
脚本,同时将输出重定向到日志文件。 -
移动日志文件:
mv /root/install_system.log /log/install/ks-post.log mv /root/install_System.log /log/install/install_System.log
将日志文件移动到指定的日志目录。
============================ TRANS.TBL 文件说明=========
TRANS.TBL是ISO9660文件系统上的一个文件,它被用于提供比ISO9660标准约定的基本文件名更加灵活的文件名。早在Rock Ridge和Joliet扩展被广泛传播使用之前,它就是在早期计算机CD上提供长文件名的最通用办法。
一个严格遵循ISO9660规则的文件名,其通常只能包含最多8个大写字母或者数字,再后接续一个句号,再后接最多3个大写字母或者数字。
TRANS.TBL是个正常文件,每个目录中都有一个,它包括了其所在目录中所有文件的扩展版文件名;因此,系统在读取文件时,可直接使用这些扩展名(或称长文件名)而不是ISO标准文件名。
TRANS.TBL文件是纯ASCII文本文件。每一行有三个字段,字段之间用任意多的空格分隔:
- 文件类型 (“F” 表示“文件” 、“D” 表示“目录”、“L”表示“连接”);
- ISO 9660文件名;以及
- 扩展文件名(通常包含空格)。
多数的TRANS.TBL文件创建工具都会在文件类型和ISO9660文件名之间放置一个空格,并在ISO9660文件名与扩展文件名之间放置任意多个制表符。
许多ISO9660工具仍内置了对TRANS.TBL文件的支持, 尤其是在跟Unix相关的场合。然而,ISO9660规范已经用Rock Ridge和Joliet扩展替代TRANS.TBL文件很久了,因此,现代所用之创建ISO9660镜像文件的工具,或者根本不创建TRANS.TBL文件,或者仅在用户明确指定时才会创建它们。除了文件名有着特别意义之外,TRANS.TBL文件(与别的其他文件相比)再也没有什么特殊之处,因此,它们既可以被单独创建,也可以在文件系统创建之前提前放进目录中。
记事本打开一个TBL文件如下
文件类型
F EFIBOOT.IMG;1 efiboot.img
F EFIDISK.IMG;1 efidisk.img
F INSTALL.IMG;1 install.img
D PXEBOOT pxeboot