将带双引号的参数从一个 bash 脚本传递到另一个 bash 脚本

将带双引号的参数从一个 bash 脚本传递到另一个 bash 脚本

bash 脚本的调用方式如下:

$./script 25 "str1 str2"

它应该启动一个终端,该终端运行另一个接收两个参数的脚本,与上面的参数完全相同(包括引号)。我试过这个:

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

但这似乎省略了引号,因此调用最终会成为./script2 25 str1 str2.复制原始命令行中的参数的正确表示法是什么?

答案1

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

相关内容