명령 출력의 각 줄을 저장하는 bash 스크립트

명령 출력의 각 줄을 저장하는 bash 스크립트

#mount | grep ^\/dev/명령 출력의 각 줄을 변수에 저장하는 bash 스크립트를 작성하는 데 문제가 있습니다 .

아래는 내 bash 스크립트입니다.

#!/bin/bash
mount | grep ^\/dev/ > tempoary
input=$(cat tempoary)
x=0
while IFS= read -r line
do
  x=$((x+1))
  echo "$line" > /tmp/directory/$x
  for file in $(echo "$line"); do
  eval "var$x=$file";
  echo "$file"
  done
done <<< "$input"

출력은 다음과 같습니다.

[root@localhost tmp]# sh script
/dev/mapper/rhel-root
on
/
type
xfs
(rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda1
on
/boot
type
xfs
(rw,relatime,seclabel,attr2,inode64,noquota)

다음과 같은 출력 형식을 갖고 싶습니다.

[root@localhost tmp]# sh script
/dev/mapper/rhel-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

이를 달성하는 방법에 대한 지침을 제공해 주시겠습니까?

추신. 큰따옴표는 "$(echo "$line")"도움이 되지 않으며 다음 구문 오류만 표시합니다.

[root@localhost tmp]# sh script
script: eval: line 14: syntax error near unexpected token `('
script: eval: line 14: `var1=/dev/mapper/rhel-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)'

답변1

파일을 다음으로 직접 리디렉션 while ... done:

mount | grep ^\/dev/ > tempoary
while IFS= read -r line
do
...
done < temporary

또는 프로세스 대체를 사용하여 임시 파일을 생략합니다.

while IFS= read -r line
do
...
done < <(mount | grep ^\/dev/)

또는 유사하게 파이프로 while

mount | grep ^\/dev/ |
while IFS= read -r line
do
...
done

답변2

for 루프 앞에 IFS를 추가하고 파일 변수를 참조하면 모든 것이 작동합니다. 다음을 확인하세요.

#!/bin/bash
mount | grep ^\/dev/ > tempoary
input=$(cat tempoary)
x=0
while IFS= read -r line
do
  x=$((x+1))
  echo "$line" > /tmp/tmp/$x
  IFS=
  for file in $(echo "$line"); do
  eval "var$x='$file'";
  echo "$file"
  done
done <<< "$input"

답변3

댓글에 따르면

출력은 "/dev/mapper/rhel-root on /type xfs (rw,relatime,seclabel,attr2,inode64,noquota)" 및 "/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2, inode64, noquota)”입니다. 이 두 줄을 변수 1과 변수 2에 저장한 후

기준 변수가 반드시 최선의 답은 아닙니다. 반대로,대량으로당신이 원하는 것이 될 가능성이 더 높습니다.

예를 들어:

#!/bin/bash

typeset -A mounts

let index=0

m=$(mount | grep "^/dev/")

while read line
do
  mounts[$index]="$line"
  let index=index+1
done <<< "$m"

echo There were $index lines
let a=0
while [ $a -lt $index ]
do
  echo Line $a was ${mounts[$a]}
  let a=a+1
done

내 컴퓨터에서 이것을 실행하면

There were 4 lines
Line 0 was /dev/vda3 on / type ext4 (rw,relatime,data=ordered)
Line 1 was /dev/vda1 on /boot type ext4 (rw,relatime,data=ordered)
Line 2 was /dev/vdb on /news type ext3 (rw,relatime,data=ordered)
Line 3 was /dev/vdc1 on /brick type ext3 (rw,relatime,data=ordered)

관련 정보