2012-08-22 74 views
2

我想將sbcl作爲單個參數傳遞給一個bashcript,但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沒有提到這樣的行爲。

回答

8

你需要在你的腳本引用$1,我想:

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

(參數--eval省略掉了清晰)

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返回一個字符串,而不是一個列表,其自身評估。也就是說,兩個\" s的防止FORMAT在參數被執行:

$ sh bashscript.bs "\"(FORMAT t \"YEAH~%\")\"" 
sbcl 
"(FORMAT t "YEAH~%")" 
$ sh bashscript.bs "(FORMAT t \"YEAH~%\")" 
sbcl 
(FORMAT t "YEAH~%") 
YEAH 
相關問題