我想要提取的变量看起来像这样
ttyACM0
ttyACM1
我想迭代这个变量并发出命令:
echo disconnect > /dev/ttyACM0
进而
echo disconnect > /dev/ttyACM1
我当前不起作用的代码如下所示:
MCCI=`ls /dev | grep "ttyACM[0-9]" | grep -v "$all_dongles"`
while IFS= read -r line
do
echo disconnect > /dev/"$line"
sleep 1
echo disconnect > /dev/"$line"
sleep 1
echo disconnect > /dev/"$line"
done <<< "$MCCI"
该代码当前正在覆盖 ttyACM0,这显然不是我想要的。我发出相同的断开代码 3 次,因为建议这样做,在断开循环之后,我还必须发出连接代码,这与上面的代码相同。整个代码是通过 SSH 执行的
更新 我正在通过 ssh 连接到计算机,并尝试验证提示用户输入的加密狗的序列号。我需要断开与用户提供的序列号不匹配的不必要的加密狗。为此,我必须验证哪个 MCCI 对应于哪个加密狗。所有加密狗和 MCCI 都是 /dev/ttyACM[0-9] 我的想法是断开所有 MCCI(由于 MCCI 变量,我知道这些数字),然后一次将它们重新打开,检查哪个加密狗是现在已连接,grep 加密狗序列号并将其连接到相应的 MCCI ttyACM#,并将其添加到数组中,再次断开连接然后我计划迭代该数组并搜索序列号,删除相关的 ttyACM# 并连接加密狗
我有 3 个变量加密狗和 MCCI - ls /dev | grep "ttyACM[0-9]"
加密狗 - 一个类似的变量,返回有关加密狗的信息,例如序列号和 ttyACM[0-9]
MCCI 只是从加密狗和 MCCI 变量中排除已知的加密狗
答案1
除了您的设置方式之外MCCI
,您对变量中每行文本进行迭代的方法也是合理的,但您可能会发现根本不使用该变量更简单。相反,只需迭代通配符/dev/
文件规范:
all_dongles='
/dev/ttyACM4
/dev/ttyACM9
/dev/ttyACM7
'
for line in /dev/ttyACM[0-9]
do
if grep -Fqx "$line" <<<"$all_dongles"
then
: # skip
else
# ... do something with $line
fi
done
答案2
老实说,因为您知道输入除了分隔条目的“换行符”之外不能包含任何其他类似空格的字符,一个简单的方法
for device in /dev/ttyACM{0..9}*; do
{echo $(basename "$device") | grep "$alldongles"} && continue
for run in {1..3}; do
echo disconnect > "$device"
sleep 1
done
done
会做。无法解析ls
输出, 曾经!
答案3
假设与[237]
与加密狗关联的任何设备名称末尾的数字匹配(也可以写成2|3|7
):
shopt -s extglob
dongle='[237]'
for device in /dev/ttyACM!($dongle); do
printf '%s\n' disconnect disconnect disconnect >"$device"
done
扩展的通配模式/dev/ttyACM!([237])
与任何以 开头/dev/ttyACM
但不以数字 2、3 或 7 结尾的路径名相匹配。
循环体将字符串打印disconnect
到设备三次。