[解決済み] Bashでコマンド内のシングルクォート内の変数を展開する
質問
からのコマンドを実行したいのですが バッシュスクリプト は、シングルクォートと、シングルクォートの中にあるいくつかの他のコマンドと、変数を持っています。
例
repo forall -c '....$variable'
この形式では
$
はエスケープされ、変数は展開されません。
以下のバリエーションを試しましたが、拒否されました。
repo forall -c '...."$variable" '
repo forall -c " '....$variable' "
" repo forall -c '....$variable' "
repo forall -c "'" ....$variable "'"
変数の代わりに値を代入すると、コマンドは正常に実行されます。
どこが間違っているのか教えてください。
解決方法は?
一重引用符の中では、すべてが例外なく文字通りに保存されます。
つまり、引用符を閉じてから何かを挿入し、もう一度入力し直さなければならないのです。
'before'"$variable"'after'
'before'"'"'after'
'before'\''after'
単語の連結は単純に並列化で行われます。確認できるように、上の行はそれぞれシェルにとっては1つの単語です。引用符(状況に応じて一重引用符や二重引用符)は単語を分離するものではありません。それらは、空白文字のような様々な特殊文字の解釈を無効にするためにのみ使用されます。
$
,
;
... 引用の良いチュートリアルは、Mark Reedの回答を参照してください。また、関連する
bashでエスケープする必要がある文字は?
シェルが解釈する文字列を連結してはいけない
変数を連結してシェルコマンドを構築することは絶対に避けるべきです。これはSQLの断片を連結するのと同じような悪い考えです(SQLインジェクション!)。
通常、コマンドにプレースホルダーを持たせ、呼び出し側が呼び出し引数リストから受け取ることができるように、コマンドを変数と一緒に提供することが可能です。
例えば、次のようなものは非常に安全ではありません。これをやってはいけません
script="echo \"Argument 1 is: $myvar\""
/bin/sh -c "$script"
の内容が
$myvar
が信頼できない場合、以下のような悪用が可能です。
myvar='foo"; echo "you were hacked'
上記の呼び出しの代わりに、位置引数を使用します。以下の呼び出しの方が良い -- 悪用されない。
script='echo "arg 1 is: $1"'
/bin/sh -c "$script" -- "$myvar"
への代入では、シングルテックを使用していることに注意してください。
script
これは、変数の展開や他の形式の解釈をせずに、文字通りに解釈することを意味します。
関連
-
[解決済み] configureコマンドが見つからない cygwin
-
[解決済み] Bashで文字列変数を連結する方法
-
[解決済み] Bashでコマンドライン引数を解析するには?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] Bashで変数で定義された数値の範囲を反復処理するにはどうすればよいですか?
-
[解決済み] 一重引用符で囲まれた文字列の一重引用符をエスケープするには
-
[解決済み] Bashのシングルクォートとダブルクォートの違い
-
[解決済み] MySQLでシングルクォート、ダブルクォート、バックスティックを使用する場合
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み】bashで1つのコマンドでシェル変数にデフォルト値を割り当てる。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 '\r': コマンドが見つかりません - .bashrc / .bash_profile [重複].
-
[解決済み] Cp: ターゲットはディレクトリではありません
-
[解決済み] bash スクリプトの "${BASH_SOURCE[0]}" と $( cd $( dirname "xxx" && pwd )) の意味について
-
[解決済み] zip警告 - 名前が一致しない
-
[解決済み] awk で行を飛ばすにはどうしたらいいですか?
-
[解決済み] bashで::演算子は何をするのですか?
-
[解決済み] シンプルなAsciiテーブルをCSVに変換する【終了】。
-
[解決済み] IPアドレスのまとめ方
-
[解決済み] 環境変数を表示/エコーするには?
-
[解決済み] bashの"-ne "はどういう意味ですか?