bash - 谁能帮我理解这个 bash 脚本?
问题描述
我正在尝试对 SSD 固件进行一些分析,并发现了一个名为 firmware.sh 的 bash 脚本,这对我来说似乎很有趣。但是,我真的不知道我在看什么。
如果有人可以帮助我了解此代码的用途或用途,我将不胜感激!
这是重击:
#!/bin/sh -e
FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware"
err() {
echo "$@" >&2
if [ -x /usr/bin/logger ]; then
/usr/bin/logger -t "${0##*/}[$$]" "$@"
fi
}
if [ ! -e /sys$DEVPATH/loading ]; then
err "udev firmware loader misses sysfs directory"
exit 1
fi
for DIR in $FIRMWARE_DIRS; do
[ -e "$DIR/$FIRMWARE" ] || continue
echo 1 > /sys$DEVPATH/loading
cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
echo 0 > /sys$DEVPATH/loading
exit 0
done
echo -1 > /sys$DEVPATH/loading
err "Cannot find firmware file '$FIRMWARE'"
exit 1
我特别感兴趣的是 for 循环...我想我知道 $NAME 语法用于 bash 中的变量,但我不知道这些变量引用的是什么。谢谢您的考虑!
解决方案
我将尝试逐行解释这一点。
FIRMWARE_DIRS="/lib/firmware /usr/local/lib/firmware"
FIRMWARE_DIRS
设置有两个由空格分隔的目录。for
这是稍后在脚本中为循环设置的。
...
for DIR in $FIRMWARE_DIRS; do
对于每个循环,DIR
设置为存储在每个目录中FIRMWARE_DIRS
[ -e "$DIR/$FIRMWARE" ] || continue
[
表示测试的开始,很像if
,并]
标记该测试的结束。-e
检查传递的参数是否是存在的文件或目录。||
如果左侧的测试失败,则表示or
和右侧的任何内容都将执行。continue
停止从下一次迭代开始的循环的当前迭代。FIRMWARE
大概是在此脚本运行之前设置的环境变量。您可以通过在命令行上执行命令来查看其值是否已在登录时设置echo $FIRMWARE
。
echo 1 > /sys$DEVPATH/loading
/sys$DEVPATH/loading
如果文件存在,则截断该文件,然后将数字输出1
到该文件。
cat "$DIR/$FIRMWARE" > /sys$DEVPATH/data
如果文件存在则截断文件/sys$DEVPATH/data
,然后将文件的内容输出$DIR/$FIRMWARE
到/sys$DEVPATH/data
. 如果FIRMWARE
包含通配符*
,它将复制所有匹配文件的内容。
echo 0 > /sys$DEVPATH/loading
sys$DEVPATH/loading
如果文件存在,则截断该文件,然后将数字输出0
到该文件。
exit 0
以返回状态 0 退出脚本(意味着它完成了 OK)。for
对于通过上述测试的任何迭代(检查文件或目录是否存在),这具有在此时结束循环中的脚本的效果。
总体而言,它似乎正在检查 中存在的第一个目录,将FIRMWARE_DIRS
一个或多个固件文件从那里复制到另一个位置 ( /sys$DEVPATH/data
) 并在完成一次后立即退出。
推荐阅读
- python - 迭代行并从上面的行中添加值 - Python
- python - 如何将 python api 端点传递给 Kubernates CronJob
- c# - 如何在 C# 中基于 KeyValuePair.Value 进行二进制堆比较?
- constraints - 带有线性约束的 Scipy 最小化试图在 nan 调用目标函数
- devops - ServcieNow 和 DevOps 集成问题
- javascript - 如何在我的 firebase 数据库中显示使用 javascript 在 php 网页中格式化的列表?
- python - 用于在另一个列表的任何值的列表中查找最高位置的单行
- android - 取消运行协程的 Job 并重用 Job 对象
- javascript - 在循环内重新声明块范围的循环变量
- asp.net - 如何将 ASP.NET Web 服务配置为不将端口号附加到请求 URL