迭代多行变量并提取特定行并将其用作命令

迭代多行变量并提取特定行并将其用作命令

我想要提取的变量看起来像这样

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到设备三次。

相关内容