18

我想通过 for 循环浏览目录中的文件,但这出现了。

echo: bad interpreter: No such file or directory

代码:

#!/bin/bash
count=0
dir=`pwd`
echo "$dir"
FILES=`ls $dir`
for file in $FILES
do
 if [ -f $file ]
 then
  count=$(($count + 1))
 fi
done
echo $count
4

11 回答 11

25

我有同样的问题。删除#!/bin/bash对我有用。似乎没有必要添加 bash 所在的位置,因为它位于系统路径上。

我在这里找到了另一个解决方案。改变

#!/bin/bash

为了

#!/usr/bin/bash

于 2013-10-27T04:39:31.043 回答
8

更好的做法:

#!/bin/bash
count=0
dir="$PWD"
echo "$dir"

for file in "$dir"/*
do
 if [[ -f $file ]]
 then
  ((count++))
 fi
done
echo $count

或最简单/最短的解决方案:

#!/bin/bash

echo "$PWD"

for file; do
 [[ -f $file ]] && ((count++))
done

echo $count
于 2013-03-31T23:10:34.957 回答
8

echo: bad interpreter: No such file or directory有可能来自第一行,#!...称为shebang line

关于#!...线路

这一行提示 shell 使用什么解释器来运行文件。这可以是例如bash,或者sh(它是(大致)一个子集,所以很多事情都不起作用),或者基本上任何可以执行文件内容的东西——Perl、Python、Ruby、Groovy ......

在脚本可执行时直接调用脚本等情况下,该行指向系统:

./myScript.sh

当文件没有后缀时,编辑器也经常使用它来识别正确的语法突出显示——例如,Gedit 就是这样做的。

解决方案

要覆盖该行,请将脚本作为参数提供给 Bash:

bash myScript.sh

或者,您可以“获取”它,这意味着,在 Bash shell 中,执行以下任一操作

source myScript.sh
. myScript.sh

这将(大致)起作用,就像您自己粘贴命令一样。

于 2018-05-02T22:17:57.003 回答
5

在我的例子中,bash 脚本是在 Windows PC 上创建的,它在每个换行符前添加了一个回车符。\x0D\x0A 而不仅仅是 \x0A。我用 LF 替换了所有的 CRLF,sed我的脚本现在可以工作了。

sed -i 's//\r/\n//\n/g' /path/to/file.sh
于 2017-12-17T18:04:44.010 回答
5

我刚刚遇到同样的问题,发现我的错误在我的第一行,有

#!bin/bash

代替

#!/bin/bash
于 2019-09-02T00:29:43.580 回答
1

这是一个奇怪的错误。我建议尝试找到错误的根源。

一件事是检查 pwd 命令。

type pwd

确保它是 /usr/bin/pwd 或 /bin/pwd,并验证它不是脚本:

file /usr/bin/pwd

如果它是一个脚本,我敢打赌它以

#!echo
于 2013-08-22T19:27:54.853 回答
1

如果您确实使用 Homebrew 安装 BASH,

删除 #!/bin/bash 意志就足够了。

于 2016-12-11T07:54:58.957 回答
1

您可以使用命令找到 bash 所在的位置

whereis bash

您可以将 bash 路径复制到您看到错误解释器错误的路径。

于 2017-07-27T04:14:10.067 回答
0

我已按照以下链接中的步骤操作,问题已解决。

参考链接:脚本错误 - 错误的解释器实际上,每行末尾都有 一个额外的^M符号。因此,在删除它之后,它对我来说效果很好。

希望能帮助到你!

于 2019-06-07T08:18:15.037 回答
0

当文件不是 unix 格式时,也可能出现此问题。尝试重新运行 dos2unix 文件并重试。

于 2019-12-10T09:17:34.903 回答
0

因此,如果您将用户名组优先级从用户名更改为 root,您应该更改

#!/user/bin/bash

#!/bin/bash

检查您的用户组(我的用户名是 rommi)

$ groups rommi

此命令将输出:

rommi : root adm cdrom sudo dip plugdev lxd lpadmin sambashare

由于我的用户名组优先级设置为 root,我应该将我的脚本更改为

#!/bin/bash

我使用以下方法更改优先级组:

sudo usermod -g root rommi

如果groups rommi命令输出:

rommi : rommi adm cdrom sudo dip plugdev lxd lpadmin sambashare

那么我的脚本应该使用#!/usr/bin/bash

使此更改失败将导致bad interpreter: No such file or directory错误

于 2020-05-11T03:45:32.840 回答