在 macOS Monterey 上不使用“sh”运行 shell 脚本时出现的问题

在 macOS Monterey 上不使用“sh”运行 shell 脚本时出现的问题

我对 shell 脚本和终端的使用还不熟悉。我最近创建了一个script.sh,我想通过只输入其名称而不输入完整路径来使用它。因此,我将目录的路径写入.zprofile如下:

export "PATH=$PATH:/path/to/scriptdirectory"

并使用以下命令更改文件权限:

% chmod +x script.sh

如果我使用脚本:

% sh myscript.sh

一切都按预期顺利进行。但如果我尝试省略sh并输入:

% myscript.sh

脚本开始运行其第一部分,即读取一个变量,但是一旦我插入该值,就会弹出以下行:

/path/to/scriptdirectory/script.sh:11: = not found

这是脚本:

#!/bin/zsh
echo "Do you want to set or change the backup location? (type y/n)"
read SET_BACKUP
while [ "$SET_BACKUP" != "y" ] && [ "$SET_BACKUP" != "n" ]
do
    echo "Please, write y or n:"
    read SET_BACKUP
done
if [ "$SET_BACKUP" == "y" ]
then
    echo "Write the absolute path of the desired backup location:"
    read BACKUP_FOLDER
    echo "Starting backup..."
    cp -R "/fileslocation" "$BACKUP_FOLDER"
    echo "Backup completed."
else
    echo "Starting backup..."
    cp -R "/fileslocation" "$BACKUP_FOLDER"
    echo "Backup completed."
fi

答案1

不同之处在于您使用两个不同的 shell 解释器运行脚本。

当你使用时sh myscript.sh,你正在运行/bin/sh并且不是 zshsh运行时它会读取您的脚本myscript.sh并使用 sh/bash shell 规则作为其语法。

当您仅使用 时myscript.sh,用于运行脚本的命令由第一行决定:(#!/bin/zsh也称为 shebang)。因此,它使用 运行zsh并使用其语法规则。

我发现有两个解决方案可以实现这一目标:

  1. 更改第一行以使用 bash,因此它将是#!/bin/bash
  2. 阅读有关条件语句在 zsh 中的工作原理的更多信息,并修复损坏的行(看起来是带有 的行if [ "$SET_BACKUP" == "y" ]

答案2

这实际上不是一个答案,而是一个格式化的问题。

我想到三件事:

  1. =变量赋值在:周围不能有空格answer=42
  2. $仅用于-引用变量,而不是分配:不要这样做$answer=42
  3. 引用你的变量:if [ "$answer" = 42 ]

这是我试图读懂你的想法。在你的问题中添加一些代码。

另外,使用https://shellcheck.net验证你的 shell 代码。

相关内容