实例化函数后,Bash脚本丢失了shebang路径

时间:2017-08-18 18:59:01

标签: linux bash shell sh shebang

我正在编写一个带有迭代菜单的脚本来运行命令行。但是,在创建迭代菜单后,当我想运行命令时出现错误。 错误是[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 个答案:

答案 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; 循环中所做的那样);他们可以更容易地说出正在发生的事情。