如何将sbcl作为单个参数传递给字符串

时间:2012-08-22 11:49:06

标签: bash common-lisp sbcl

我想使用bashcript将sbcl作为单个参数传递给sbcl,但sbcl将字符串拆分为列表。

bashscript

#!/bin/bash

    sbcl --noinform --eval "(progn (FORMAT t \"~{~a~%~}\" sb-ext:*posix-argv*)(eval (read-from-string (second sb-ext:*posix-argv*))))" $1

执行:

>sh bashsrcipt.bs "\"(FORMAT t \"YEAH\")\""
sbcl
"(FORMAT
t
"YEAH")"

debugger invoked on a END-OF-FILE in thread
#<THREAD "initial thread" RUNNING {1002999833}>:
  end of file on #<SB-IMPL::STRING-INPUT-STREAM {100443F523}>

但结果应该是

>sh bashcript.bs "\"(FORMAT t \"YEAH~%\"\")"
sbcl
"(FORMAT t \"YEAH\")"
YEAH

manual没有提到这种行为。

2 个答案:

答案 0 :(得分:8)

您需要在脚本中引用$1,我认为:

sbcl --noinform --eval "..." "$1"

--eval的论点为了清晰而省略)

答案 1 :(得分:2)

$1如果希望在包含空格字符时将其作为单个参数传递,则应附加""

#!/bin/bash
sbcl --noinform --eval "(progn (format t \"~{~a~%~}\" sb-ext:*posix-argv*) (eval (read-from-string (second sb-ext:*posix-argv*))))" "$1"

此外,应该删除命令行参数中\"之前和之后的(FORMAT ...),这使得read-from-string返回一个字符串,而不是列表,它会自行计算。也就是说,两个\"阻止了参数中的FORMAT被执行:

$ sh bashscript.bs "\"(FORMAT t \"YEAH~%\")\""
sbcl
"(FORMAT t "YEAH~%")"
$ sh bashscript.bs "(FORMAT t \"YEAH~%\")"
sbcl
(FORMAT t "YEAH~%")
YEAH