여러 줄 변수를 반복하고 특정 줄을 추출하여 명령으로 사용합니다.

여러 줄 변수를 반복하고 특정 줄을 추출하여 명령으로 사용합니다.

추출하려는 변수는 다음과 같습니다.

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]"

dongle - 일련번호, 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

확장된 와일드카드 패턴은 숫자 2, 3 또는 7로 /dev/ttyACM!([237])시작 하지만 끝나지 않는 /dev/ttyACM모든 경로 이름과 일치합니다 .

루프의 본문은 문자열을 disconnect장치에 세 번 인쇄합니다.

관련 정보