我对 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
并且不是 zsh。sh
运行时它会读取您的脚本myscript.sh
并使用 sh/bash shell 规则作为其语法。
当您仅使用 时myscript.sh
,用于运行脚本的命令由第一行决定:(#!/bin/zsh
也称为 shebang)。因此,它使用 运行zsh
并使用其语法规则。
我发现有两个解决方案可以实现这一目标:
- 更改第一行以使用 bash,因此它将是
#!/bin/bash
- 阅读有关条件语句在 zsh 中的工作原理的更多信息,并修复损坏的行(看起来是带有 的行
if [ "$SET_BACKUP" == "y" ]
)
答案2
这实际上不是一个答案,而是一个格式化的问题。
我想到三件事:
=
变量赋值在:周围不能有空格answer=42
$
仅用于德-引用变量,而不是分配:不要这样做$answer=42
- 引用你的变量:
if [ "$answer" = 42 ]
这是我试图读懂你的想法。在你的问题中添加一些代码。
另外,使用https://shellcheck.net验证你的 shell 代码。