표시된 for 루프의 모양 변경

표시된 for 루프의 모양 변경

다음 코드가 있습니다.

#!/bin/bash

FSTAB=` grep -vE "^#|swap|UUID" /etc/fstab  | awk '{print $1,$2,$3}'`

for i in $FSTAB
do

   echo "$i"

done

다음을 반환합니다.

/dev/mapper/centos-root
/
xfs
/dev/sdb2
/hdos
xfs

문제는 나중에 비교하고 싶어서 줄 바꿈을 사용하여 반환하고 점프하지 않고 한 줄로 반환하기를 원한다는 것입니다.

/dev/mapper/centos-root / xfs
/dev/sdb2 /hdos xfs

답변1

변수를 어떻게 채우든 상관없이 FSTAB루프에서 따옴표가 없는 변수 확장은 for다양한 유형의 공백 간의 구별을 제거합니다. (바라보다:언제 큰따옴표가 필요합니까?그리고공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?)

이 문제를 해결하려면 줄 바꿈으로만 분할하도록 설정하거나 IFS루프를 사용하여 줄을 반복할 수 있습니다 while read.

$ fstab=$(grep /etc/fstab ...)
$ while IFS= read -r line; do 
    printf "$line\n"
  done <<< "$fstab"

while read -r dev mnt fs; do ...이는 필드를 별도의 변수에 넣으려는 경우에도 작동합니다.

답변2

출력 을 다음으로 awk파이핑하는 대신 :grepawk

FSTAB=` grep -v "^#" /etc/fstab | grep . | grep -v "swap" | grep -v "UUID"   | awk '{print $1,$2,$3}'`

로 변경될 수 있습니다

FSTAB="$(awk 'NF && $0 !~ /^#|swap|UUID/ {print $1, $2, $3}' /etc/fstab)"

개행 문자가 변수에 포함되므로 아무것도 반복할 필요가 없습니다 echo "$FSTAB".

그러나 /etc/fstab변수로 구문 분석한 다음 구문 분석하는 대신저것/etc/fstabawk, 현재 스크랩 중인 출력에 필요한 작업을 정확하게 수행하는 더 복잡한 스크립트를 사용하여 직접 구문 분석하는 것이 더 나을 수 있습니다 .

답변3

오직암소 비슷한 일종의 영양 egrep:

egrep -v "^#|swap|UUID" /etc/fstab  | egrep -o '^(\S*\s*){1,3}'

관련 정보