使用变量开发 bash 脚本

使用变量开发 bash 脚本

每次重新启动时,所连接扫描仪的 USB 端口分配都不正确。我的目标是创建一个在重新启动时运行的脚本,消除我的交互。

以下是我手动纠正端口分配的方法。

    1) lsusb -d 04f9:0272  #the output identifies the correct ports of the scanner       
    2) sudo chmod a+w /dev/bus/usb/001/002 #scanner now works

以下脚本创建变量,但 chmod 失败报告“没有这样的文件或目录”。

    buss=$(lsusb -d 04f9:0272 |awk '{print $2}')
    devis=$(lsusb -d 04f9:0272 |awk '{print $4}')
    sudo chmod a+w /dev/bus/usb/$buss/$devis

当我回显 $buss 或 $devis 时,会显示正确的值。我知道我需要做更多的事情来自动化这个过程。

答案1

问题可能是lsusb输出的特定格式:

% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ print "/dev/bus/usb/" $2 "/" $4 }'
/dev/bus/usb/001/001:

注意末尾额外的冒号。幸运的是,您可以轻松地在 awk 或 shell 中删除它,这是一个 awk 示例:

% usbid=1d6b:0001
% lsusb -d $usbid | awk '{ a = $4; sub(/:$/, "", a); print "/dev/bus/usb/" $2 "/" a }'
/dev/bus/usb/001/001

答案2

看起来应该可以工作,只是 的输出lsusb在设备号后面包含一个冒号:

$ lsusb -d 1d6b:0002
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

因此devis变量将包含该内容,最终结果将是您尝试使用/dev/bus/usb/001/001:冒号访问 , 。

您可以使用后缀删除扩展来删除尾随冒号,如下所示:

devis=${devis%:}

仅在 shell(不带awk)中执行此操作的另一种方法是仅read输出lsusb.这只需要第一行lsusb输出,如果有多个设备匹配,可能会有更多。

在具有进程替换的 shell 中:

read x buss x devis x < <(lsusb -d 04f9:0272)
devis=${devis%:}
chmod +w "/dev/bus/usb/$buss/$devis"

或者用管道:

lsusb -d 04f9:0272 | {
   read x buss x devis x
   devis=${devis%:}
   chmod +w "/dev/bus/usb/$buss/$devis"
}

答案3

ls -l在评论中,您提供设备的输出:

crw-rw-r-- 1 root lp 189, 1 Jul 24 18:48 /dev/bus/usb/001/002

您可以看到该用户和组已经具有读/写访问权限。因此,如果您将用户添加到组中,lp则不需要任何脚本内容。

相关内容