2013-07-19 124 views
1

我寫包含類似的命令的bash腳本:模式字符串中的匹配

echo Configure with --with-foo=\"/tmp/foo-*\" 

我想這個命令生成的輸出如:

Configure with --with-foo="/tmp/foo-1.3.2" 

但圖案WASN」由於它被嵌入到字符串中,因此被擴展。我把它通過使用命令替換工作:

echo Configure with --with-foo=\"$(echo /tmp/foo-*)\" 

我覺得這是標準的/ bin/sh的解決方案,但是它的bash支持,不需要派生一個子shell的解決方案,以同樣的方式$((6 * 7))可以代替$(expr 6 \* 7)嗎?另外,是否有辦法將結果限制爲單個匹配?

+2

也許之前'printf「使用--foo = \」%s \「配置配置\ n」/ tmp/foo- *'?雖然整個想法似乎有些脆弱,因爲'/ tmp/foo- *'可能不匹配,或者不止一個,這可能會導致奇怪的問題... – twalberg

+0

@twalberg如果一切都很好,應該有一個匹配,所以如果沒有,我實際上想要生成一個錯誤。 –

+0

是的,如果我所指的是「如果一切都不好」,所以你可能需要在'printf'之前使用一些邏輯來確保所有的都是,實際上...... – twalberg

回答

1

要檢查你的模式多少文件擴展到,存儲擴展到一個數組使用它

shopt -s nullglob 
foo=(/tmp/foo-*) 
if ((${#foo[@]} == 0)); then echo "no foo files" 
elif ((${#foo[@]} > 1)); then echo "too many foo files" 
else do something with "${foo[0]}" 
fi 
1

作爲替代方案,使用for環和break一次迭代後:

shopt -s nullglob 
for f in /tmp/foo-*; do 
    echo "Configure with --with-foo=\"$f\"" 
    break 
done 
+0

注意,這取決於bash' nullglob'選項被設置:如果未設置,則f將爲''/ tmp/foo - *'' - 添加'shopt -s nullglob' –

+0

@glennjackman:謝謝。添加到答案中。 – Birei