首页 > 解决方案 > 谁能帮我理解这个 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 中的变量,但我不知道这些变量引用的是什么。谢谢您的考虑!

标签: bashshellfirmware

解决方案


我将尝试逐行解释这一点。

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) 并在完成一次后立即退出。


推荐阅读