次のコードがあります。
#!/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
パイプする代わりに:grep
awk
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/fstab
awk
、現在スクラップしている出力に必要な操作を正確に実行する、より複雑なスクリプトを使用して直接解析する方が良いかもしれません。
答え3
ただ牛に似た一種の栄養 egrep
:
egrep -v "^#|swap|UUID" /etc/fstab | egrep -o '^(\S*\s*){1,3}'