繁体   English   中英

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

[英]Better bash script to read two entries of each line of file into two variables

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

是否有更好的实施方案? 任何指针或技巧表示赞赏。 谢谢。

基于@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
}

您将在第一次失败时退出循环。 您想要一路修复疣

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 || return

我看到几个怪癖:

  1. 不需要cat /etc/fstab | grep xfs cat /etc/fstab | grep xfs ,grep可以采用文件参数: grep xfs /etc/fstab
  2. 不需要放$? 转换为变量,然后将该变量与测试命令进行比较; 您可以这样做: if command;then echo success;else echo failure;ficommand && echo success || echo failure command && 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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM