bash 中 while 循环的意外文件结尾

Unexpected end of file in while loop in bash

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

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

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

这是我目前拥有的:

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

是的,它不完整,但我对 bash 不是那么精通,所以我一次只做一点。我确定我的命令也不能正常工作,但现在我得到一个 "unexpected end of file",我不知道为什么。

这里有很多问题:

  • 如果这是您 "unexpected end of file" 使用的实际代码,您应该将文件保存为 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