Bash

將帶有雙引號的參數從一個 bash 腳本傳遞到另一個

  • February 5, 2017

像這樣呼叫 bash 腳本:

$./script 25 "str1 str2"

它應該啟動一個終端,該終端執行另一個接收兩個參數的腳本,與上面的完全一樣(包括引號)。我試過這個:

lxterminal --command=$"./script2 "$"$@"

但這似乎省略了引號,因此呼叫最終會為./script2 25 str1 str2. 複製原始命令行中的參數的正確符號是什麼?

問題是lxterminal‘s的參數--command只是一個字元串,它不能像其他一些終端一樣接受命令及其參數xterm

lxterminal使用自己的規則解析該字元串以確定執行其參數的命令。這與 Bourne shell 解析類似但不完全相同。

它確實將'...'強引號和空格辨識為參數分隔符,因此您可以為它實現引用:

lxquote() {
 awk -v q="'" '
   function lxquote(s) {
     gsub(q, q "\\" q q, s)
     return q s q
   }
   BEGIN {
     for (i = 1; i < ARGC; i++) {
       printf sep "%s", lxquote(ARGV[i])
       sep = " "
     }
   }' "$@"
}

並呼叫lxterminal為:

lxterminal --command="$(lxquote ./script2 "$@")"

或者,如果script的解釋器是bash,您可以執行以下操作:

printf -v code '%q ' ./script2 "$@"
CODE=$code lxterminal --command="bash -c 'eval \"\$CODE\"'"

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