bash

时间:2016-06-20 17:30:02

标签: bash while-loop unexpectendoffile

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

  1. 将目录或文件作为输入(将始终以/ mnt / user /开头)
  2. 搜索其他挂载点以查找相同的文件或目录(始终以/ mnt / diskx开头)
  3. 返回值
  4. 因此,例如,输入将是" /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,所以我一次做一点。我确定我的命令也不会正常工作,但是现在我得到一个"意外的文件结束"我无法弄清楚原因。

1 个答案:

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