在Bash脚本中出现“command not found”错误

8

我已经编写了一个Bash脚本,根据输入参数获取了三个路径,然后获取这些路径中的图像名称/文件名。类似于:
我提供:

AA=/home/user

然后它使用find命令获取
/home/user/dir2/images/dir/tellmeimage1fun.bin

最终,我需要获得tellmeimage1fun.bin作为输出。

脚本:

#!/bin/bash  

echo "arg0 n/k/d"  

AA=$1  
CC=$3  

PATH1="`find $AA/dir2/images/dir/ -name *image1*.bin`"  
PATH2="`find $AA/dir2/images/dir/ -name *bimage2*.bin`"  
PATH3="`find $AA/dir2/images/dir/ -name *cimage3*.bin`"  

if [ $CC = "n" ] ; then  
    PATH=$PATH1  
elif [ $CC = "k" ] ; then  
    PATH=$PATH2  
else  
    PATH=$PATH3  
fi  

#Getting filename name from path:  
IMG="`ls $PATH | cut -d "/" -f6`"

OUTPUT:  
/users/prasapat/bin/sl5: line 22: ls: command not found  
/users/prasapat/bin/sl5: line 22: cut: command not found  

如果我给ls和cut命令提供完整路径,它们就可以工作。但我不想在脚本中为所有命令都这样做。如果我删除最后一行并echo PATH变量,它完全正常。只有在添加最后一个命令后,我才看到问题。
我做错了什么?
6个回答

18

问题在于您正在重新定义PATH变量,而bash在寻找二进制文件时会查找该变量,如果您没有使用完整路径进行调用,则会出现问题。

您应该在bash脚本中将PATH更改为MYPATH或类似的内容,以便它不会干扰已有的环境变量。

如果您不知道PATH变量的作用,可以查看维基百科文章


5
更好的解决方案是永远不要为任何私有变量使用大写字母。大写字母保留给系统变量;使用小写字母可以确保您不会意外地覆盖其他系统变量与下一个变量名称。另请参见https://dev59.com/anRB5IYBdhLWcg3wSVYI。 - tripleee

3

我曾遇到这个问题,结果发现使用Notepad ++编辑bash脚本时添加了DOS行尾符而非UNIX行尾符。在Linux环境中运行该脚本会导致“command not found”错误。

通过以下方式运行我的脚本成功诊断出该问题:

bash -x testscript.sh

这将输出编译器的所有输出。抛出的错误消息是:

bash -x testscript.sh
+ $'\r'
: command not found 2:
'estscript.sh: line 3: syntax error near unexpected token `{

我通过在Notepad++中更改行尾格式为UNIX而非DOS来解决了这个问题,具体步骤是:编辑 -> EOL转换 -> UNIX。


这也是一个常见的FAQ,但与此处的问题不同。有关更详细的处理,请参见https://dev59.com/iFkS5IYBdhLWcg3wu4rL - tripleee

2

$PATH是一个特殊的环境变量,它包含了一个目录列表。当你输入一个命令(比如findls)时,你的shell(在这个例子中是bash)会在这个列表中查找。可以在脚本或者shell中尝试一下echo $PATH,就能感受到它是什么样子的(通常会列出/bin/usr/bin/usr/local/bin等目录,也可能会有更多)。请注意,由于你不需要在这个特定的脚本中重新定义这个变量,所以你应该使用除$PATH之外的其他名称。


1

$PATH 是一个预定义变量,它提供了在查找可执行文件时要搜索的目录。为您的脚本选择不同的变量名称,就可以避免问题。


0

您正在使用特殊的PATH,用于定位命令,这就是为什么无法解析ls的原因。请使用其他名称替代PATH

if [ $CC = "n" ] ; then  
    MY_PATH=$PATH1  
elif [ $CC = "k" ] ; then  
    MY_PATH=$PATH2  
else  
    MY_PATH=$PATH3  
fi 

export MY_PATH

IMG="`ls $MY_PATH | cut -d "/" -f6`"

0

使用与PATH不同的变量名。 $PATH是环境变量,它告诉您的shell在哪里查找可执行文件(因此,例如,您可以运行ls而不是/bin/ls)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接