bash赋值 - shell:-



用冒号作为分隔符的全局/路径名扩展 (4)

如果你放入Perl,这是相当微不足道的:

perl -e 'print join ":", @ARGV' /var/lib/gems/*/bin

或Python:

python -c 'import sys; print ":".join(sys.argv[1:])' /var/lib/gems/*/bin

或者任何其他流行的脚本语言。

如何转换一个包含glob字符的字符串,例如

/var/lib/gems/*/bin

成冒号分隔的字符串(即PATH兼容)匹配模式的文件名?

echo /var/lib/gems/*/bin将返回

/var/lib/gems/1.8/bin /var/lib/gems/1.9.1/bin

我想要

/var/lib/gems/1.8/bin:/var/lib/gems/1.9.1/bin 

代替。

显而易见的方法是简单地用tr替换空格字符':',但如果文件名本身包含空格字符,则不起作用。


Answer #1

这应该为你做:

dirs=(/var/lib/gems/*/bin)    # put filenames (dirnames) in an array
saveIFS=$IFS IFS=':'          # set the Internal Field Separator to the desired delimiter
dirs=("${dirs[*]}")           # convert the array to a scalar with the new delimiter
IFS=$saveIFS                  # restore IFS

Answer #2
printf "%s\n" /var/lib/gems/*/bin | tr "\n" ":"

Answer #3

其实,我想到了一个更好的解决方案:使用shell函数。

function join() {
    local IFS=$1
    shift
    echo "$*"
}

mystring=$(join ':' /var/lib/gems/*/bin)




expansion