bash导出表达式没有扩展?

时间:2015-02-18 16:53:42

标签: bash cygwin

我想做以下

export LOGS=//server/log_files/2014_*/server_{1,2,3}

所以我可以做类似

的事情

grep 'Exception' $LOGS/log.txt

我也尝试了别名,但我不能让它不扩展。

我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

如果没有export,作业的右侧不会通过路径也不会支持扩展。

但是,使用export,执行大括号扩展。您可以通过引用值来阻止它:

export LOGS='//server/log_files/2014_*/server_{1,2,3}'

但是,如果要使用此类值,则必须使用eval

eval grep 'Exception' $LOGS/log.txt

答案 1 :(得分:1)

你是想要扩展球的情况。这是最干净,最语义正确的,因为你想匹配文件名。由于我过于迂腐,我认为大括号扩展不适合你的任务。

# This defines a string that will glob
# No pathname expansions are performed at this step
logs_glob='//server/log_files/2014_*/server_@(1|2|3)'

# You need to activate extended globs with extglob
# To have a failure when no files match the glob, you need failglob
shopt -s failglob extglob

# Unquoted variable $logs_glob, as pathname expansion is desirable
grep 'Exception' $logs_glob

有人会说,使用glob技术,你无法正确处理名称中的空格。实际上,您有两种方法:使用?作为通配符(这将匹配任何字符,特别是空格)或使用字符类[[:space:]]。此字符类将匹配任何空格(常规空格,换行符,制表符等)


另一种技术是使用数组,仍然使用扩展的globs。我认为这更清洁了。

shopt -s extglob nullglob

# This will populate array with all matching filenames.
# If no matches, array is empty (since we shopted nullglob)
logs_array=( //server/log_files/2014_*/server_@(1|2|3) )

# Before you launch you command with the array, make sure it's not empty:
if ((${#logs_array[@]}!=0)); then
    # Observe the quotes for the expansion of the array
    grep 'Exception' "${logs_array[@]}"
fi