Linux

僅使用“sh -c”呼叫 shell 腳本時出錯:“意外運算符”

  • February 3, 2022

我有以下腳本:

installRequiredFiles=$1

install_with_pkg()
{
   arg1=$1
       echo $arg1
   echo "[+] Running update: $arg1 update."
}

if [ $installRequiredFiles = "true" ]; then
   if [ -x "$(command -v apt)" ]; then
         install_with_pkg "apt"
       elif [ -x "$(command -v yum)" ]; then
         install_with_pkg "yum"
       elif [ -x "$(command -v apk)" ]; then
         install_with_pkg "apk"
       else
         echo "[!] Can't install files."
   fi
fi

當我直接執行它時,它工作正常:

root@ubuntu:/# ./myscript.sh "true"
apt
[+] Running update: apt update.
Printing installRequiredFiles: true
Printing arg1: apt

但是當我使用時,sh -c我收到以下錯誤:

root@ubuntu:/# sh -c ./myscript.sh "true"
./c.sh: 11: [: =: unexpected operator
Printing installRequiredFiles:
Printing arg1:

我希望能夠正確執行它,sh -c並且我希望它支持sh並且bash目前支持。

這不是-c選項的用途。你通常不給它一個文件,你給它shell命令。它用於執行以下操作:

$ sh -c 'echo hello'
hello

現在你給了它一個文件,它正在嘗試讀取它並執行在其中找到的命令,但是參數沒有傳遞給腳本(myscript.sh),參數只提供給sh命令本身,你可以看到只需列印參數:

$ cat script.sh
echo "ARGS: $@"

$ sh ./script.sh true
ARGS: true
$ sh -c ./script.sh true
ARGS: 

您需要做的就是不使用-c它,它會按預期工作:

sh ./myscript.sh "true"

或者,如果您-c出於某種原因絕對必須使用,請將腳本腳本的參數作為單個帶引號的參數傳遞給sh

sh -c './myscript.sh "true"'

引用自:https://unix.stackexchange.com/questions/688976