bash 中 while 循环的意外文件结尾
Unexpected end of file in while loop in bash
我正在尝试编写一个 bash 脚本来执行以下操作:
- 将目录或文件作为输入(将始终以 /mnt/user/ 开头)
- 搜索相同文件或目录的其他挂载点(将始终以 /mnt/diskx 开头)
- 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
我正在尝试编写一个 bash 脚本来执行以下操作:
- 将目录或文件作为输入(将始终以 /mnt/user/ 开头)
- 搜索相同文件或目录的其他挂载点(将始终以 /mnt/diskx 开头)
- 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