【问题标题】:POSIX array and loopPOSIX 数组和循环
【发布时间】:2021-03-14 17:55:50
【问题描述】:

我如下创建一个文件数组,然后“获取”这些文件。我也在尝试制作一个尽可能接近 POSIX 的脚本,这样在不同的 shell 中运行它就不会出现问题。

set -- path alias function
for file in "${@}"; do
    [ -r "${SELF_PATH_DIR}.${file}" ] && [ -f "${SELF_PATH_DIR}.${file}" ] && . "${SELF_PATH_DIR}.${file}";
done

它有效,但我不喜欢我必须多次指定${SELF_PATH_DIR}.,以便字符串采用文件的真实路径(/Users/karlsd/dotfiles/.path 等)。

有什么方法可以让它更简单吗?例如,要在循环前的每一项中添加/Users/karlsd/dotfiles/.

【问题讨论】:

    标签: bash loops posix


    【解决方案1】:

    只需将"${SELF_PATH_DIR}.${file}" 分配给一个临时变量或修改同一个变量。

    顺便说一句:如果循环是您使用set --/$@ 的唯一位置,那么您可以直接遍历列表:

    for file in path alias function; do
        file="${SELF_PATH_DIR}.${file}"
        [ -r "$file" ] && [ -f "$file" ] && . "$file";
    done
    

    【讨论】:

      【解决方案2】:

      你实际上有一个比仅仅重复变量更大的问题:如果$@ 中的条目之一恰好是某个文件的绝对路径,你的代码就会中断。

      我会在循环中使用realpath

      absfile=$(realpath "$file")
      [ -r "$absfile" ] && [ -f "$absfile" ] && . "$absfile" 
      

      当然,这会静默跳过file 的“错误”条目,例如,如果名称表示目录而不是普通文件,或者您没有读取权限。除非这是所需的行为,否则我会省略测试并仅获取文件。如果事情不正确,您至少会收到一条明确的错误消息。

      【讨论】:

        猜你喜欢
        • 2014-12-19
        • 2020-10-28
        • 2021-02-13
        • 2022-11-29
        • 2017-06-13
        • 1970-01-01
        • 2012-07-09
        • 2015-09-03
        相关资源
        最近更新 更多