0

我正在尝试编写一个 bash 脚本来执行以下操作:

  1. 将目录或文件作为输入(总是以 /mnt/user/ 开头)
  2. 搜索相同文件或目录的其他挂载点(将始终以 /mnt/diskx 开头)
  3. 返回值

因此,例如,输入将是“/mnt/user/my_files/file.txt”。它将搜索“/mnt/disk1/my_files/file.txt”是否存在,并将逐步查找每个磁盘(disk2、disk3 等),直到找到它或 disk20。

这是我到目前为止所拥有的:

#/user/bin/bash
var=$1
i=0
while [ -e $check_var = echo $var | sed 's:/mnt/user:/mnt/disk$i+1:']
do
final=$check_var
done

是的,这是不完整的,但我对 bash 不是那么精通,所以我一次只做一点。我确定我的命令也不能正常工作,但现在我得到一个“意外的文件结尾”,我不知道为什么。

4

1 回答 1

2

这里有很多问题:

  • 如果这是您得到“文件意外结尾”的实际代码,您应该将文件保存为 Unix 格式,而不是 DOS 格式。
  • shebang 应该是#!/usr/bin/bash#!/bin/bash取决于您的系统
  • 您必须check_var在运行之前分配[ .. ]
  • 您必须使用$(..)来扩展命令
  • 像这样的变量$i不在单引号中展开
  • sed不能添加数字
  • i永远不会增加
  • 循环逻辑是反转的,它应该循环直到匹配,而不是在匹配时循环。
  • 您想final在循环之后 - 而不是在 - 中分配。

sed 's:/mnt/user:/mnt/disk$i+1:'考虑在更小的部分中进行,例如单个语句比整个while循环更容易调试。

这是一种更规范的方法:

#!/bin/bash
var="${1#/mnt/user/}"
for file in /mnt/disk{1..20}/"$var"
do
  [[ -e "$file" ]] && final="$file" && break
done

if [[ $final ]]
then
  echo "It exists at $final"
else
  echo "It doesn't exist anywhere"
fi
于 2016-06-20T17:52:48.403 回答