更好的bash脚本将每行文件的两个条目读入两个变量

时间:2016-05-17 05:18:23

标签: linux bash

在CentOS linux上,我有/etc/fstab,其中包含以下条目:

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

有更好的实施吗?任何指针或提示赞赏。感谢。

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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

答案 2 :(得分: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
  3. 我会这样做:

    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)
    }