我正在编写一个带有迭代菜单的脚本来运行命令行 . 但是,在创建迭代菜单后,当我想运行命令时出现错误 . 错误是[COMMAND]没有这样的文件或目录linux .
#!/bin/bash
ATESTS=("TEST NAME 1" "TESTE NAME 2")
PATH=("test1.xml" "text2.xml")
menu () {
for i in ${!ATESTS[@]}; do
printf "%3d%s) %s\n" $((i+1)) "${OPT[i]:- }" "${ATESTS[i]}"
done
[[ "$msg" ]] && echo "$msg"; :
}
prompt="Check an ATEST (again to uncheck, ENTER when done): "
while menu && read -rp "$prompt" num && [[ "$num" ]]; do
/usr/bin/clear;
[[ "$num" != *[![:digit:]]* ]] &&
(( num > 0 && num <= ${#ATESTS[@]} )) ||
{ msg="Invalid ATEST: $num"; continue; }
((num--)); msg="${ATESTS[num]} was ${OPT[num]:+un}checked"
[[ "${OPT[num]}" ]] && OPT[num]="" || OPT[num]="+"
done
for i in ${!ATESTS[@]}; do
[[ "${OPT[i]}" ]] && { printf "%s " "${ATESTS[i]}"; msg=""; }
done
echo "$msg"
for i in ${!ATESTS[@]}; do
if [[ "${OPT[i]}" ]] && [[ $PWD = /repo/$USER/program ]]; then
find . -iname ${PATH[i]} -exec cat {} \;
fi
done
我想找到一个* .xml文件,然后使用已经存在且属于/ usr / bin的脚本执行 . 但是,在这个例子中,find命令不执行,也是cat命令,得到以下错误([COMMAND]没有这样的文件或目录linux . )
如果我尝试在函数之前运行一个bash命令,该命令执行没有任何问题,但在该函数之后命令失败 .
我为脚本创建了一个别名,用于在/ repo / $ USER / program中运行,而不包含脚本的路径 .
1 回答
这个问题与shebang或函数无关 . 问题是你正在使用变量
$PATH
. 这个变量告诉系统要搜索可执行命令的目录,所以当你将它设置为数组时......它将开始在${PATH[0]}
指定的位置查找命令,这些命令是"test1.xml",甚至不是目录更不用说包含您需要的所有可执行文件的目录 .解决方案:不要将变量名称
PATH
用于搜索命令的目录列表以外的任何内容 . 事实上,由于这是具有特殊功能的大量全大写变量之一,因此最好在脚本中使用小写(或混合大小写)变量,以避免像这样的奇怪冲突 .顺便说一句,我不知道脚本的其余部分是否有意义;你使用短路布尔值进行条件执行(例如
this && that || do something
)使得很难遵循逻辑 . 我强烈建议使用if
块进行条件执行(就像你在最后的for
循环中所做的那样);他们让人们更容易分辨出发生了什么 .