2016-05-17 25 views
1

在CentOS Linux的,我有/etc/fstab這包括以下項目:更好的bash腳本讀取文件的每一行的兩個條目分爲兩個變量

/dev/dsk/xfsvold00  /mnt/00vol xfs defaults 0  2 
/dev/dsk/xfsvold01  /mnt/01vol xfs defaults 0  2 
/dev/dsk/xfsvold02  /mnt/02vol xfs defaults 0  2 
/dev/dsk/xfsvold03  /mnt/03vol xfs defaults 0  2 
/dev/dsk/xfsvold04  /mnt/04vol xfs defaults 0  2 
/dev/dsk/xfsvold05  /mnt/05vol xfs defaults 0  2 
/dev/dsk/xfsvold06  /mnt/06vol xfs defaults 0  2 

我開發一個bash腳本,做文件系統安裝。我正在嘗試 ,以便將/etc/fstab中每行的前兩條輸入到兩個變量 中,並在裝入時使用這些變量。例如,我需要:

dev/dsk/xfsvold00  /mnt/00vol 
dev/dsk/xfsvold01  /mnt/01vol 
dev/dsk/xfsvold02  /mnt/02vol 
dev/dsk/xfsvold03  /mnt/03vol 

我有下面的工作原型代碼。

mountall() { 
    # TODO: find a neat trick to get mntvol and mntpt. 
    cat /etc/fstab | grep xfs > /tmp/tmpfstab 
    while read mntvol mntpt var3; do 
    mount -t xfs $mntvol $mntpt; 
    rc=$? 
    [ $rc -ne 0 ] && return $rc || echo "mount successful on $mntpt" 
    done < /tmp/tmpfstab 
    /bin/rm -rf /tmp/tmpfstab 
    } 

有更好的實施嗎?任何指針或提示表示讚賞。謝謝。

+4

爲什麼不只是''mount -a'作爲條目在'/ etc/fstab'中 – heemayl

+0

是的,我試過mount -a。它沒有工作(出於某種原因)。 – GRaj

+0

我在那裏看到'cat'的無用用... – Jahid

回答

1

您正在退出第一次失敗時的循環。固定沿途的疣,你想

mountall() { 
    grep xfs /etc/fstab | 
    while read -r mntvol mntpt var3; do 
     mount -t xfs $mntvol $mntpt && 
     echo "mount successful on $mntpt" 
    done 
} 

如果意圖是真的中止在第一次失敗,切換&& echo|| return

1

我看到幾個怪癖:

  1. 沒有必要爲cat /etc/fstab | grep xfs,grep的可以採取文件的說法:grep xfs /etc/fstab
  2. 沒有必要把$?到一個變量,然後比較與測試命令中的變量;你可能只是這樣做:if command;then echo success;else echo failure;ficommand && echo success || echo failure

我會做這樣的:

mountall(){ 
    while read -r mntvol mntpt var3; do 
    if mount -t xfs $mntvol $mntpt; then 
     echo "mount successful on $mntpt" 
    else 
     echo "mount failed on $mntpt" 
     return $? # comment this out if you don't want to stop here. 
    fi 
    done < <(grep xfs /etc/fstab) 
} 
2

基於@tripleee@Jahid(謝謝你們),代碼與文件系統類型稍微嚴格的檢查:

mountall() { 
    awk '$3=="xfs"' /etc/fstab | 
    while read -r mntvol mntpt var3; do 
     mount -t xfs $mntvol $mntpt && 
     echo "mount successful on $mntpt" || 
     echo "mount failed on $mntpt" 
    done 
} 
+0

你可以避免額外的子shell(通過管道):'完成< Jahid

+0

謝謝,它也可以。儘管如此,它似乎需要#!/ bin/bash才能起作用。 – GRaj

相關問題