Bash
複雜情況下的引用規則
在編寫程式碼行時,我們有時需要考慮轉義一些字元。
我遇到了一個我自己無法回答的情況
在 PHP 中,exec 命令需要用引號 (’) 括起來的字元串。我們想呼叫命令 /bin/bash -c ,它還需要一個用引號 (’) 括起來的字元串
這個問題的解決方法如下:
$line = exec('/bin/bash -c \'read -e -p "Check to confirm string: " -i "'.$preFill.'" input; echo $input\'');
只要您不想在向使用者建議的文本中插入字元 (’),就沒有問題。我們可以看到一些使用 php -a 進行互動模式的範例:
php > $preFill = 'I m reach'; php > $line = exec('/bin/bash -c \'read -e -p "Check to confirm string: " -i "'.$preFill.'" input; echo $input\''); Check to confirm string: I m reach php >
問題是:我必須考慮哪些轉義規則才能以正確的方式將“我到達”放入 $preFill?
您需要對傳遞給
bash
的程式碼和傳遞給的程式碼sh
(由php
‘s開始exec()
)做一些引用:$preFill = 'I m reach'; $prompt = 'Check to confirm string: '; $bash_code = 'IFS= read -re -p ' . escapeshellarg($prompt) . ' -i ' . escapeshellarg($preFill) . ' input; printf "%s\n" "$input"'; $sh_code = 'exec /bin/bash -c ' . escapeshellarg($bash_code); $output = exec($sh_code); echo $output;
您還忘記了
IFS=
and-r``read
和一些圍繞 shell 參數擴展的引號,記住echo
不能用於任意數據。同時啟動
sh
並bash
提示使用者似乎有點矯枉過正。