2014-10-10 65 views
0

假設我想編寫一個工具,需要接受輕微結構化的數據,使用json作爲命令行參數並且在它的環境中合理嗎?用於命令行參數的JSON

例如

fudge_files "['file1', 'file2']" # here list of files could be used 
fudge_files --dirs "['dir1', 'dir2']" pattern.* another*.foo 

或者更令人費解的例子

fudge_files --dst "{'txt': ['/foo', '/bar'], 'pdf': ['/foo']}" pattern.* 

這是好還是壞主意?

有哪些缺陷?

回答

1

大多數(所有)shell將看到單引號和dbl引號,並按照其標準過程處理它們。

爲了保持引號,使他們獲得通過的數據,你需要轉義,即

\"[\'file1\', \'file2\']\" 

一旦你的數據開始包含合法的「\」字符,它變得非常難看。你可以拿出黑客,但它會很痛苦,你可以花費很多時間嘗試調試與這種引用相關的問題。並且,如果你堅持並且使其工作,那麼在2-3個月後,你可能會認爲「我可以將其中的一部分放在變量中,並使用eval」或其他瘋狂將變量擴展爲字符串。現在你真的在進行調試噩夢。

而且,我做了快速測試使用shell ANSI字符串,看看是否會有所幫助,但

$ var=$'"['file1', 'file2']"' 
$ echo $var 
"[file1, file2]" 
$ echo "$var" 
"[file1, file2]" 
$ var=$""['file1', 'file2']"" 
-ksh: file2]: not found [No such file or directory] 

ANSI字符串是像$'My Static ANSI String'$"myANSIString with $var input" 註定義字符串如何,即使在第一個例子中,外殼匹配第一時間引用單引號,並將它們從輸入字符串中剝離出來。希望這是剝去它們的echo,我用了第二條echo行上的最佳做法,引用了"$var"。不,單引號消失了。 :-(

我沒有那麼多的經驗與ANSI字符串工作,所以其他人可以提供一個解決方案,將保持單引號DBL完整。

否則,我沒有看到這方面的工作。


您的工作流程是不是很清楚,但是猜測的東西是發射這些值(我希望你不必鍵入它們),我覺得你好得多讓他們到一個文件。如果一個單獨的程序將它們打印到終端,那麼只需重定向到一個文件中

json_emitting_program --args .... > $tmpFile 

或者使用設計用於消除tmp文件的管道工具|,然後編寫工具從std-in讀取其數據,而不是作爲命令行參數。

然後你會說要麼

json_emitting_program --args .... | fudge_files 

OR,使用tmp文件

fudge_files < "$tmpFile" 

如果您的數據源是在AA微軟Windows輸出(例如),您可以創建臨時上的文件使用的Unix here-documents,像

cat - > $tmpFile << EOS 
paste your input here 
and here 
etc 
EOS 

注意,EOS有文件在它自己的一條線上,沒有尾隨的空白。

如果正確完成,shell應該會將提示返回給您。

確認該文件是存在的,跟上時代的

ls -l $tmpFile 

,並在上述,運行程序

fudge_files < "$tmpFile" 

在你不知道的情況下,您可以創建TMPFILE用簡單分配給任何路徑/文件你照顧名稱:

tmpFile=/path/to/myTempFile 

IHTH

+0

關於shell腳本中複雜參數重用的好處。我有點困惑於你的例子'$'「[...]」'',它有一層額外的引號;也是由你的斷言,所有的報價必須逃脫。是不是使用不同的引號來換取足夠的內容和內容? – 2014-10-13 07:36:04

+0

是的,'$'「[']」''示例是shell的高級功能(ANSI字符串,它有兩種形式,'$',str.''和'$'。strW $ vars。 「')。不幸的是,我沒有很多與他們有關的經驗,除了我知道我所包含的例子是有效的。我的觀點是,當使用'$'...''表單時,來自示例字符串的內部單引號將丟失AND與ANSI字符串中的'$'「...」',您的示例字符串將會當shell嘗試評估該行時會導致錯誤。 – shellter 2014-10-13 12:11:06

+1

請參閱http://stackoverflow.com/questions/25436988/how-to-remove-an-element-from-a-bash-array-without-flattening-the-array/25437057#25437057關於bash shell版本的'printf'及其特性''%q'可能對你有幫助....但是...再次嘗試在命令行上讀取這樣的字符串是錯誤的方法, fudge_files',所以它可以讀取std-in,(管道或重定向),並且你將擁有一個更加靈活和穩定的解決方案; ;-)祝你好運 – shellter 2014-10-13 12:17:36