スクリプトから位置パラメータを印刷できません。

スクリプトから位置パラメータを印刷できません。

私はそれを使用していますこの方法Gnomeターミナルウィンドウを開き、次のコマンドを実行します。この場合、簡単な通知メッセージを送信します(予約済みat)。

#!/bin/sh
gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash'

シェルはremember:文字列だけを印刷し、remind.sh "pick up the package"またはを実行したときなど、私が指定した値は印刷しませんremind.sh "buy groceries X and Y"

スクリプトをコアまで削除すると、すべてが期待どおりに機能します(もちろん、前景には何も表示されないため、cronまたはsystemdによる自動化には役に立ちません)。

#!/bin/sh
echo "remember: $1"

答え1

分析する

gnome-terminalあなた(またはあなたの場合)が提供するコードは、/bin/sh -cコードの後に​​提供されている位置パラメータを見ることができます。たとえば、

gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash' zeroth first second …

印刷されますremember: first

コードの後に​​何も指定しないと、$1コードが最終的に解釈されると空の文字列に展開されます(何かが異なりますが、ここでは重要ではありません)。それがあなたがそれを得る理由です。 run byは、明示的に渡さない限り、基本スクリプトの位置引数について何も知りません。$2$3$0remember:/bin/shgnome-terminal


解決策

内部コードの位置パラメータをスクリプトの位置パラメータで埋めるには、次の"$@"代わりに使用しますfirst second …

gnome-terminal -- /bin/sh -c 'echo "remember: $1"; exec bash' sh "$@"

欲しいものは何でも通過できます。ここではすべての引数を渡しますが(すべての位置引数"$@"に展開します)、通常は次のものを使用できます"$1"(内部コードが最初の引数を知りたい場合)ただ)または"$2"(内部コードを表示するには第二基本スクリプトの位置パラメータは次のとおりです。それ $1)。


ノート

  • sh0番目のパラメータは次のように記述されます。の2番目のshは何ですかsh -c 'some shell code' sh

  • 元のスクリプト(つまり、変更なし)で提供したいシェルコードがsh -c二重引用符で囲まれている場合、シェルで解釈されたスクリプトが拡張され、$1結果が内部コードに含まれます。しかし、これをしないでください。

    #バギー  
     GNOME端末 - /bin/sh -c "echo 'remember: $1'; exec bash"

    ほとんどの場合、これは期待どおりに機能しますが、通常はそうではありません。一般に、欠点は次のとおりです。含める{}。一重引用符コードの後に​​パラメータが続くのが正しいアプローチです。

  • コードを一重引用符で囲むと、そのまま動作します/bin/sh -c内部二重引用符は重要ではありません。)。これにより、shコードが次のように表示されます。

    echo "remember: $1"; exec bash
    

    そして二重引用符が良い$1ここで。

関連情報