在我的旧.bashrc
,我有一个简短的部分如下:
PATH2ADD_SCRIPTBIN="/home/foo/bar/scriptbin"
PATH2ADD_PYTHONSTUFF="/home/foo/bar/pythonprojects"
PATH2ADDLIST="$PATH2ADD_SCRIPTBIN $PATH2ADD_PYTHONSTUFF"
for PATH2ADD in $PATH2ADDLIST; do
if [ -z `echo $PATH | grep "$PATH2ADD"` ]; then
export PATH=$PATH:$PATH2ADD
echo "Added '$PATH2ADD' to the PATH."
fi
done
在 Bash 中,这正如预期的那样工作:它附加了我在 $PATH2ADDLIST
中包含的路径。如果它们还没有出现在路径中(在意识到每次我获取 .bashrc
时我的路径变得有多大之后,我必须这样做)。输出(当提供的路径尚不存在时)如下:
Added '/home/foo/bar/scriptbin' to the PATH.
Added '/home/foo/bar/pythonprojects' to the PATH.
然而,我最近切换到了Zsh
的神奇土地。 ,并且完全相同的文本行现在产生以下结果:
Added '/home/foo/bar/scriptbin /home/foo/bar/pythonprojects' to the PATH.
现在我很确定这是因为 Zsh
的方式存在一些差异。是否进行参数扩展,或者它与如何Zsh
有关更改 for
循环,但我不太确定如何解决这个问题。
可能有人有一些见解吗?
最佳答案
使用数组来存储这些变量,即
PATH2ADD_SCRIPTBIN="/home/foo/bar/scriptbin"
PATH2ADD_PYTHONSTUFF="/home/foo/bar/pythonprojects"
# Initializing 'PATH2ADDLIST' as an array with the 2 variables
# to make the looping easier
PATH2ADDLIST=("${PATH2ADD_SCRIPTBIN}" "${PATH2ADD_PYTHONSTUFF}")
# Looping through the array contents
for PATH2ADD in "${PATH2ADDLIST[@]}"
do
# Using the exit code of 'grep' directly with a '!' negate
# condition
if ! echo "$PATH" | grep -q "$PATH2ADD"
then
export PATH=$PATH:$PATH2ADD
echo "Added '$PATH2ADD' to the PATH."
fi
done
这样可以使其在 zsh
和 bash
中更加兼容。在两个 shell 上进行试运行示例,
# With interpreter set to /bin/zsh
zsh script.sh
Added '/home/foo/bar/scriptbin' to the PATH.
Added '/home/foo/bar/pythonprojects' to the PATH.
和bash
bash script.sh
Added '/home/foo/bar/scriptbin' to the PATH.
Added '/home/foo/bar/pythonprojects' to the PATH.
关于bash - zsh 循环多个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048054/