POSIX 数组和循环

POSIX array and loop

我按如下方式制作了一组文件,然后“获取”这些文件。我也在尝试制作一个尽可能接近 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/.

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

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

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

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

我会在循环中使用 realpath

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

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