我對 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 規則作為其語法。
當您使用 just 時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 程式碼。