如果我做:
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
),您也应该取消设置checkIFS
和saveIFS
。