如何使用循环动态创建 Bash 代码并在创建时执行它

如何使用循环动态创建 Bash 代码并在创建时执行它

我的 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

对此有用的资源:

http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html

http://tldp.org/LDP/abs/html/varsubn.html

相关内容