Shell脚本的Zip函数

3 投票
3 回答
3039 浏览
提问于 2025-04-16 00:38

我正在尝试写一个脚本,这个脚本可以把多个目标编译到不同的路径上。我会传入一个用空格分开的路径列表和一个用空格分开的目标列表,然后脚本会对每一对路径和目标执行 make DESTDIR=$path $target。如果用Python来写,我的脚本大概是这样的:

for path, target in zip(paths, targets):
    exec_shell_command('make DESTDIR=' + path + ' ' + target)

不过,这是我现在的shell脚本:

#! /bin/bash

packages=$1
targets=$2
target=

set_target_number () {
    number=$1
    counter=0
    for temp_target in $targets; do
        if [[ $counter -eq $number ]]; then
            target=$temp_target
        fi
        counter=`expr $counter + 1`
    done 
}

package_num=0
for package in $packages; do
    package_fs="debian/tmp/$package"
    set_target_number $package_num
    echo "mkdir -p $package_fs"
    echo "make DESTDIR=$package_fs $target"
    package_num=`expr $package_num + 1`
done

有没有类似于Python中zip函数的Unix工具,或者有没有更简单的方法可以通过索引从空格分开的列表中获取元素?谢谢。

3 个回答

0

在bash中是无法直接做到这一点的。你需要从输入中创建两个数组,然后用这两个数组的值来循环计数。

3

这里是解决方案

paste -d ' ' paths targets | sed 's/^/make DESTDIR=/' | sh

paste 在命令行中相当于 zipsed 用来在命令前面加上制作命令(使用正则表达式),然后结果会传给 sh 来执行。

4

使用一个数组:

#!/bin/bash
packages=($1)
targets=($2)
if (("${#packages[@]}" != "${#targets[@]}"))
then
    echo 'Number of packages and number of targets differ' >&2
    exit 1
fi
for index in "${!packages[@]}"
do
    package="${packages[$index]}"
    target="${targets[$index]}"
    package_fs="debian/tmp/$package"
    mkdir -p "$package_fs"
    make "DESTDIR=$package_fs" "$target"
done

撰写回答