bash - zsh 循环多个参数

标签 bash shell zsh variable-expansion

在我的旧.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

这样可以使其在 zshbash 中更加兼容。在两个 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/

相关文章:

bash - 通过 grep 查找文本并用 sed 替换该文本的路径

linux find 命令没有采用正确的参数

ZSH:在终端中隐藏计算机名称

Linux:这是并行运行脚本的正确方法吗?

regex - sed:更改 .yml 文件中环境属性的值

regex - bash 中的@(...|...|...) 语法是什么?

bash - 如何将数据通过管道传输到交互式 bash 脚本并将输出通过管道传输到另一个命令?

shell - 子shell中对$RANDOM的引用都返回相同的值

java - 从 java 代码运行 shell 脚本并传递参数

Zsh 无法识别函数内的别名