エラー:「sh -c」のみを使用してシェルスクリプトを呼び出すときに「予期しない演算子」が発生する

エラー:「sh -c」のみを使用してシェルスクリプトを呼び出すときに「予期しない演算子」が発生する

次のスクリプトがあります。

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現在サポートされている機能をサポートしたいと思いますshbash

ベストアンサー1

これはこのオプションの目的ではありません-c。通常、ファイルを提供せずにシェルコマンドを提供します。その目的は、次のことを行うことです。

$ 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"'

おすすめ記事