我写了一个bash脚本。它基本上根据输入参数获取三个路径,然后获取路径中的imagename / filename。
类似的东西:
我提供:
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提供完整的路径并切断它们的工作。但我不想为脚本中的所有命令执行此操作。如果我删除最后一行并回显PATH变量,那就完全没问题了。只有在添加了最后一个命令后,才会看到问题 如果我做了任何明显的错误,请帮助并告诉我。
答案 0 :(得分:14)
问题在于,如果在调用时没有使用完整路径,则重新定义bash查找的PATH变量以查找二进制文件。
你应该将bash脚本中的PATH更改为MYPATH或类似的东西,这样它就不会破坏已经存在的环境变量。
如果您不知道PATH变量的用途,可以查看wikipedia's article
答案 1 :(得分:2)
$PATH
变量是一个特殊的环境变量,它包含一个目录列表,当你键入命令时,你的shell(在本例中为bash)应该会查看(例如find
和{{ 1}}。)只需在脚本或shell中尝试ls
即可了解它的外观(通常会有echo $PATH
,/bin
和/usr/bin
在那里列出,也许更多。)
由于您不需要在此特定脚本中重新定义此变量,因此您应使用除/usr/local/bin
之外的其他名称。
答案 2 :(得分:1)
$PATH
是一个预定义变量,它在查找可执行文件时提供搜索目录。为您的脚本选择一个不同的变量名称,你会没事的。
答案 3 :(得分:0)
使用与PATH
不同的变量名称。 $PATH
是环境变量,它告诉您的shell在哪里查找可执行文件(例如,您可以运行ls
而不是/bin/ls
)。
答案 4 :(得分: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`"
答案 5 :(得分:0)
我有这个问题,结果是使用Notepad ++编辑一个bash脚本是添加DOS行结尾而不是UNIX行结尾。在Linux环境中运行脚本导致找不到'命令'要抛出的错误。
通过运行我的脚本来管理诊断问题:
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。