Bash脚本出现问题:“声明:未找到”


23

我的脚本运行得很好,但是今天运行时,它说declare: not found。我正在使用bash shell,脚本开头的路径正确。

我的脚本中的两个标记行如下:

declare -a RESPONSE
RESPONSE=($RESULT)

它也说(是意外的,但我想这是因为第一个错误。值得一提的是,当我输入声明时,可以直接使用。

declare | grep USER 表演

USER=ashfame
USERNAME=ashfame
           values="$SVN_BASH_USERNAME";

那么,这怎么了?

Answers:


27

您使用sh代替bash吗?sh(链接到dash)不支持declare关键字,也不支持语法

VAR=(list) 

用于初始化数组。


我的shebang行是#!/bin/bash。你是说我怎么执行吗?我只是尝试按原样执行它,./script.sh而且效果很好。但是它不能像script.shor 那样工作sh script.sh,我可以肯定的是,我一周前创建它时只使用了后两种方法。有什么可以解释的?
Ashfame 2011年

@Ashfame:也许一个星期前,它错过了您现在拥有的bash特有的功能,所以它也可以与sh script.sh一起使用
enzotib

不,我的意思是确切地说,该脚本在一两个星期前就可以使用。还是您说某些更新可能已进行了更改?
Ashfame

@Ashfame:我不知道,正如您现在所展示的,此脚本无法与sh script.sh一起使用。
enzotib

11

我怀疑您的“ shebang”行(文件的可选第一行)正在引用sh而不是bash。它应该是

#!/bin/bash

用于bash脚本。如果脚本的第一行是

#!/bin/sh

则表明将使用严格的本恩兼容外壳;如果是Ubuntu,dash则使用。在许多其他发行版中,这不会引起问题,因为它们链接/bin/sh/bin/bash;。但是,ubuntu链接到/bin/dash该链接以允许系统脚本更快地运行。

declare内置是一个bash的许多扩展到Bourne shell脚本规范; dash只是实现该规范而没有扩展。


我的家当线是#!/bin/bash唯一的
Ashfame

@Ashfame:您如何运行脚本?如果仅通过键入脚本名称来调用它,则shebang行将确定运行该解释器的解释器。但是,如果您通过明确地调用它sh thescript.sh,则sh外壳程序dash即将对其进行解释。
直觉

1
@intuited我正在运行它sh script.sh。我理解您的意思,但是我在某处已经读到这种方法bash可以解释它。为什么要dash在这里扮演角色?仅适用于Ubuntu吗?大概是我读到的关于linux的内容。
Ashfame

2
@Ashfame与sh script您一起运行sh带有参数的命令script,这使sh可以读取并执行该文件中的命令。sh不会读取shebang,它以开头#,因此被视为注释。如果您改为运行./script,则内核将读取shebang,在您的情况下为shebang,#!/bin/bash因此它将执行/bin/bash ./script
geirha 2011年

@geirha是的,这就是我所知道的原理,但是dash将使用@intuited提及,所以我需要澄清一下
Ashfame 2011年

3

如何重现以上错误:

我正在使用Ubuntu 14.04 64位。将此代码放在文件中:

#!/bin/sh 
declare -i FOOBAR=12; 
echo $FOOBAR; 

像这样运行它:

el@apollo:~$ ./06.sh 
./test.sh: 2: ./test.sh: declare: not found

要解决此问题,请执行以下操作:

#!/bin/bash
declare -i FOOBAR=12;
echo $FOOBAR;

印刷品:

el@apollo:~$ ./06.sh 
12

1

我遇到了同样的问题,然后我想起您需要分配正确的权限才能执行Shell脚本。

更改脚本的权限,例如:

chmod 755 script.sh

1

尝试/bin/bash在命令行中使用脚本来代替,如果sh(:

代替 :

    sh script.sh

尝试:

    / bin / bash script.sh

1

在Ubuntu上,您可能有一个脚本正在执行其中的其他脚本,而我已经遇到了该脚本。

some_dir/  
        | main.sh  
        | shhh.sh

#!/bin/bash -e

echo "file? $0"
# file? ./main.sh

echo "shell? $SHELL" 
# shell? /bin/bash

# sh shhh.sh
# file? shhh.sh
# shell? /bin/bash
# shhh.sh: 5: shhh.sh: declare: not found

$SHELL shhh.sh
# file? shhh.sh
# shell? /bin/bash
# foo? bar

#!/bin/bash -e

echo "file? $0"
# shhh.sh

echo "shell? $SHELL"
# shell? /bin/bash

declare foo="bar"

echo "foo? $foo"

全部更改sh some_script.sh$SHELL some_script.sh修复它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.