如何检查文件系统是否已通过脚本安装


19

我是脚本新手,我可以做一些非常基础的事情,但是现在我需要帮助。

我有一个本地文件系统,仅在需要执行备份时才会挂载。

我从这个开始。

#!/bin/bash
export MOUNT=/myfilesystem

if grep -qs $MOUNT /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."; then
  mount $MOUNT;
fi

如我所说,我在脚本编写方面非常基础。听说您可以mount通过查看返回码来检查命令的状态。

RETURN CODES
       mount has the following return codes (the bits can be ORed):
       0      success
       1      incorrect invocation or permissions
       2      system error (out of memory, cannot fork, no more loop devices)
       4      internal mount bug
       8      user interrupt
       16     problems writing or locking /etc/mtab
       32     mount failure
       64     some mount succeeded

我不知道该怎么检查。有指导吗?


2
; then的脚本中有一个有趣的悬空。
席子2012年

为什么我们要导出MOUNT变量并删除“;”
Mike Q

服务器故障堆栈溢出以及Unix和Linux堆栈交换也存在类似的问题。
sasha

Answers:


19

您可以mount使用shell special参数来检查大多数可执行文件的状态代码?

来自man bash

? Expands to the exit status of the most recently executed foreground pipeline.

运行mount命令后,立即执行echo $?将打印先前命令的状态代码。

# mount /dev/dvd1 /mnt
  mount: no medium found on /dev/sr0
# echo $?
  32

并非所有可执行文件都具有定义明确的状态代码。至少,它应该以成功代码(0)或失败代码(1)退出,但并非总是如此。

为了扩展(并更正)示例脚本,if为清楚起见,我添加了一个嵌套结构。这不是测试状态码和执行操作的唯一方法,而是学习时最容易阅读的方法。

#!/bin/bash
mount="/myfilesystem"

if grep -qs "$mount" /proc/mounts; then
  echo "It's mounted."
else
  echo "It's not mounted."
  mount "$mount"
  if [ $? -eq 0 ]; then
   echo "Mount success!"
  else
   echo "Something went wrong with the mount..."
  fi
fi

有关“退出和退出状态”的更多信息,您可以参考《高级Bash脚本指南》


1
无需出口$MOUNT。如果文件系统具有任何会进行单词拆分的字符(空格等),则此脚本也会中断。您应该始终引用您的扩展。
克里斯·

@ChrisDown你是对的。我只删除了明显的悬垂的'; then'。将来,请随时编辑我的答案以使其更正确。
乔治M

嗯...这仍然会中断。您仍未引用这些扩展。根据您的建议,我现在开始。
克里斯·

我也不建议链接到臭名昭著的“高级” Bash脚本指南,该指南包含很多错误,并且会教人们编写错误,而不是脚本。BashGuide是更好的选择。
克里斯·唐尼

2
@ChrisDown“如果不正确地引用,分词会吃掉你的孩子。” 生活的话。
乔治M

35

许多Linux发行版都有该mountpoint命令。它可以显式用于检查目录是否为挂载点。就这么简单:

#!/bin/bash    
if mountpoint -q "$1"; then
    echo "$1 is a mountpoint"
else
    echo "$1 is not a mountpoint"
fi

1
如果您尝试检查encfs,则此方法将失败,因为当由非root用户运行时,您会遇到权限被拒绝的错误。
Denys S.

我的解决方案适用于encfs。
西奥多·R·史密斯,

3

另一种方式:

if findmnt ${mount_point}) >/dev/null 2>&1 ; then
  #Do something for positive result (exit 0)
else
  #Do something for negative result (exit 1)
fi

你好@sungtm; 看来您使用新的单独帐户登录。由于您的“ Sun”帐户没有太多活动,因此建议您继续使用新的“ sungtm”帐户,因为这很简单。但是,如果您想合并这些帐户,请标记此评论告知我,我们将与Stack Exchange小组联系。谢谢!
杰夫·

请注意,对于encfs,findmnt必须提供参数--source encfs,否则它将始终考虑要挂载的目录,因为它会退回到父挂载。
Burkart

2

不需要root的最简单方法是:

if $(df | grep -q /mnt/ramdisk); then

fi

或查看是否未安装:

if ! $(df | grep -q /mnt/ramdisk); then

fi

mount命令不需要root用户访问权限,df而是专注于磁盘空间而不是安装点上……
Philippe Gachoud

1

简短陈述

检查是否安装

mount|grep -q "/mnt/data" && echo "/mnt/data is mounted; I can follow my job!"

检查是否未安装

mount|grep -q "/mnt/data" || echo "/mnt/data is not mounted I could probably mount it!"

0

我尝试了以下脚本

#!/bin/bash
echo "enter the file system to check whether its mounted or not"
read p
echo $p
for i in `cat /proc/mounts`
do
if [[ $p =~ $i ]]
then
echo "$p is mounted"
else
echo "$p is not mounted"
fi
done

您只需输入文件系统名称即可

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.