表示された 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

問題は、後で比較したいので、改行を使用して返し、ジャンプせずに1行で返したいということです。

/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}'

関連情報