我想在我的 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。