我正在编写一个带有迭代菜单的脚本来运行命令行。但是,在创建迭代菜单后,当我想运行命令时出现错误。 错误是[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中运行,而不包含脚本的路径。
答案 0 :(得分:0)
问题与shebang或功能无关。问题是您正在使用变量$PATH
。此变量告诉系统要搜索可执行命令的目录,因此当您将其设置为数组时......它将开始在${PATH[0]}
指定的位置查找命令,该命令由PATH
指定。是&#34; test1.xml&#34;,它甚至不是一个包含所有可执行文件的目录。
解决方案:不要将变量名this && that || do something
用于搜索命令的目录列表以外的任何内容。事实上,由于这是大量具有特殊功能的全大写变量之一,因此最好在脚本中使用小写(或混合大小写)变量,以避免像这样的奇怪冲突。
if
)使得很难遵循逻辑。我强烈建议使用for
块进行条件执行(就像你在最后的 try {
$this->pdo->beginTransaction();
$result = $this->pdo->prepare(
"INSERT INTO `users`(`id`, `fn`, `sn`, `email`, `city`, `cdatet`, `ldatet`, `active`, `hash`) VALUES (0, :fn, :sn, :email, :city, now(), now(), 0, :hash)");
$result->bindParam(':fn', $fn);
$result->bindParam(':sn', $sn);
$result->bindParam(':email', $mail);
$result->bindParam(':city', $city);
$result->bindParam(':hash', $hash);
$result->execute();
$lastId = $this->pdo->lastInsertId();
$result2 = $this->pdo->prepare(
"UPDATE `codes` SET `id_user`=:uid WHERE `id_user`=0 ORDER BY `class` DESC LIMIT 1");
$result2->bindParam(':uid', $lastId);
$result2->execute();
$this->pdo->commit();
return $lastId;
} catch (PDOException $e) {
$this->logError($e->getCode(), $e->getMessage());
$this->pdo->rollBack();
}
return 0;
循环中所做的那样);他们可以更容易地说出正在发生的事情。