我的 Bash 脚本中有一个行列表,如下所示
if [ ! -z "$clone01" ]; then git clone "$clone01"; fi
if [ ! -z "$clone02" ]; then git clone "$clone02"; fi
if [ ! -z "$clone03" ]; then git clone "$clone03"; fi
# $clone01 .... through to ... $clone60
if [ ! -z "$clone60" ]; then git clone "$clone60"; fi
当数字小于 10 时,变量末尾的前导零很重要。
我尝试过各种替换和循环等。这段代码非常重复,有60行。
如何动态创建此代码并使其成为我执行的脚本的一部分?解决这个问题的最佳方法是什么?
答案1
好吧,别这样做,太丑了。将 URL 放入数组中并对其进行循环:
urls=( http://this.git http://that.git )
for url in "${urls[@]}" ; do
git clone "$url"
done
或者将它们放入一个文件中,每行一个,然后循环读取这些行。在这里,像您一样,防止空行可能很有用。我们还可以忽略以#
as 注释开头的行:
while read -r url ; do
if [ -z "$url" ] || [ "${url:0:1}" = "#" ]; then continue; fi
git clone "$url"
done < file.with.urls
如果您也想要行计数器,很容易添加算术展开式。
答案2
不要用来eval
这样做。更好的工具是变量间接:
for i in clone{01..60}; do
[[ ${!i} ]] && git clone "${!i}"
done
[[ $var ]]
与 的作用相同[ ! -z "$var" ]
。请注意,在 60 个变量中存储 60 个值并不是最好的方法,您可能需要使用数组来执行此操作。
答案3
您是否尝试过将 if 包装在像这样的 for 循环中?
for i in clone{01..60}; do echo $i; done
这会产生以下输出:
clone01
clone02
clone03
... clipped for length ...
clone60
所以像这样的事情似乎可以解决问题:
for i in clone{01..60}; do if [ ! -z $i ]; then git clone $i; fi; done
对此有用的资源: