为什么这个循环不能在 rc.local 中执行?

为什么这个循环不能在 rc.local 中执行?

我想在我的 raspi 的 rc.local 中使用此循环来初始化一些 GPIO 引脚,但它没有执行。但是当我通过 ssh 运行代码时,它就可以正常工作。

for i in {4,17,27,22,5,6,13,26}; do 
    echo "$i" > /sys/class/gpio/export; 
    sleep 0.1; 
    echo "out" > /sys/class/gpio/gpio"$i"/direction;  
    echo 0 > /sys/class/gpio/gpio"$i"/value;
done;

此外,此代码在 rc.local 中仍然有效:

echo 4 > /sys/class/gpio/export;
echo out > /sys/class/gpio/gpio4/direction;
echo 0 > /sys/class/gpio/gpio4/value;

为何循环不起作用?

答案1

括号扩展{x,y,z,t}不是标准的 /bin/sh 功能;它是 bash/ksh/zsh 的扩展。

然而,在某些 Linux 发行版中,/bin/sh 实际上是或者短跑shell — 一种速度更快但功能更有限的变体,仅支持“标准 POSIX shell”功能,但通常不支持任何特定于 bash 的扩展。

这意味着循环只运行一次,以整个字符串“ {4,17,27,22,5,6,13,26}”作为 的文字值$i

在您的特定情况下,括号扩展完全没用。您可以直接列出项目:

for i in 4 17 27 22 2 6 13 26; do 

在其他情况下,您可以使用例如“seq”来替换{a..z},或者更改为使用整个脚本#!/bin/bash(即专门调用 Bash)而不是 /bin/sh。

相关内容