在 bash 脚本中分割工作目录

在 bash 脚本中分割工作目录

如果我做:

IFS="/" read -ra PARTS

并手动输入路径,它会按希望创建数组“PARTS”,但是:

IFS="/" read -ra PARTS <<< $(pwd)

创建一个包含单个元素的数组,并将斜杠转换为空格

如何将当前工作目录拆分为数组?

答案1

如果你引用该命令,它就会起作用。

IFS="/" read -ra PARTS <<< "$(pwd)"
for i in "${PARTS[@]}"
do
  printf '%s\n' "$i"
done

home
user1

答案2

既然问题是

如何将当前工作目录拆分为数组?

(而不是“我怎样去 上班?”),我给你IFS="something" read -a arrayname <<< $(command)

saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); IFS="$saveIFS"

是的,我知道;它很丑。我试过

IFS=/ PARTS=($(pwd))

即使我将整个命令括在...中或使用,它仍然IFS设置为。当然,将其包含在...中会导致 不将其设置在主外壳中。/{;}eval()PARTS

IFS=/ declare PARTS=($(pwd))

更失败了。

第一个代码块(带有saveIFS)保存 IFS 的旧值并恢复它(更改后)。但是,如果之前未设置 IFS,则上述代码会将其设置为空字符串(通常称为空字符串)。如果您的环境中存在这种情况,并且您希望能够将 IFS 恢复为未设置,则可以执行以下操作:

checkIFS="${IFS+1}"
saveIFS="$IFS"
IFS=/ PARTS=($(pwd))
if [ "$checkIFS" ]
then
    IFS="$saveIFS"
else
    unset IFS
fi

(或者全部排成一行)

checkIFS="${IFS+1}"; saveIFS="$IFS"; IFS=/ PARTS=($(pwd)); if [ "$checkIFS" ]; then IFS="$saveIFS"; else unset IFS; fi

这里,checkIFS如果没有设置IFS则设置为1,如果IFS设置为null放。然后它进行明显的测试,将 IFS 恢复到其先前的(设置)/(未设置)状态,并恢复其先前的值(如果有)。

当然,如果您非常关心保持环境不变(变量除外PARTS),您也应该取消设置checkIFSsaveIFS

相关内容