以冒号作为分隔符的全局/路径名扩展

mjs*_*mjs 19 bash shell glob path expansion

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

/var/lib/gems/*/bin
Run Code Online (Sandbox Code Playgroud)

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

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

/var/lib/gems/1.8/bin /var/lib/gems/1.9.1/bin
Run Code Online (Sandbox Code Playgroud)

我想要

/var/lib/gems/1.8/bin:/var/lib/gems/1.9.1/bin 
Run Code Online (Sandbox Code Playgroud)

代替.

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

Sea*_*ean 20

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

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

mystring=$(join ':' /var/lib/gems/*/bin)
Run Code Online (Sandbox Code Playgroud)


Pau*_*ce. 11

这应该为你做:

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
Run Code Online (Sandbox Code Playgroud)


小智 5

PATH="$(printf "%s:" /usr/*/bin)"
PATH="${PATH%:}"
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但我会使用不同的变量。你也可以这样进行初始赋值:`printf -v varname "%s:" /var/lib/gems/*/bin` (2认同)