Shell脚本的Zip函数
我正在尝试写一个脚本,这个脚本可以把多个目标编译到不同的路径上。我会传入一个用空格分开的路径列表和一个用空格分开的目标列表,然后脚本会对每一对路径和目标执行 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
在命令行中相当于 zip
。sed
用来在命令前面加上制作命令(使用正则表达式),然后结果会传给 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