zsh 循环遍历多个参数
zsh Looping through multiple parameters
在我的旧 .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
更兼容。两个壳上的样品干燥 运行,
# 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.
zsh
有一些功能可以让您更轻松地更新您的路径。第一,有一个镜像 PATH
的数组参数 path
:对任何一个的更改都会反映在另一个中。第二,声明该变量以消除重复项。你可以简单地写
path+=("/home/foo/bar/scriptbin" "/home/foo/bar/pythonprojects")
并且每个新路径都将附加到 path
(如果尚不存在)。
如果你想更好地控制它们的添加顺序(例如,如果你想放在前面),你可以使用以下样式:
path=( "/home/foo/bar/scriptbin"
$path
"/home/foo/bar/pythonprojects"
)
(请注意,数组参数的扩展包括 所有 个元素,而不仅仅是 bash
中的第一个元素。)
在我的旧 .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
更兼容。两个壳上的样品干燥 运行,
# 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.
zsh
有一些功能可以让您更轻松地更新您的路径。第一,有一个镜像 PATH
的数组参数 path
:对任何一个的更改都会反映在另一个中。第二,声明该变量以消除重复项。你可以简单地写
path+=("/home/foo/bar/scriptbin" "/home/foo/bar/pythonprojects")
并且每个新路径都将附加到 path
(如果尚不存在)。
如果你想更好地控制它们的添加顺序(例如,如果你想放在前面),你可以使用以下样式:
path=( "/home/foo/bar/scriptbin"
$path
"/home/foo/bar/pythonprojects"
)
(请注意,数组参数的扩展包括 所有 个元素,而不仅仅是 bash
中的第一个元素。)