コマンド出力の各行を格納する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)

これを達成する方法に関するガイダンスを提供してもらえますか?

PS。二重引用符は"$(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)」です。この2行を変数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)

関連情報