1

我写了一个小 BASH 脚本,它接受一个简单的配置并获取预配置的 3rd 方存储库,并从中下载某些包。

我目前遇到的问题是,当我在配置中使用星号时,它会在执行脚本时采用我所在的目录,并将目录中的所有文件作为参数展开。我了解单引号和双引号之间的区别,但似乎无论我做什么,我都无法让它工作。也许有人可以帮我解决这个问题。这是脚本:

#!/bin/bash

CONFIGS="/opt/configs/repos/.repos/configs"
REPOS="/opt/configs/repos"
MASTER_REPO=extras
SYNCAPPS=(mysql)

for APP in ${SYNCAPPS[@]};do
    . $CONFIGS/$APP
    echo "$APP"
    for RELEASE in {5..6};do
        if [ $RELEASE == "5" ];then
            for ARCH in {x86_64,i386};do
                CMD="yumdownloader --disablerepo='*' --enablerepo=$UPSTREAM-$RELEASE-$ARCH -c $REPOS/.repos/$UPSTREAM-$RELEASE.repo --destdir=$REPOS/$MASTER_REPO/$RELEASE/$GEN_NAME/ $PACKAGES"
                $CMD
                echo ${CMD}
            done
        elif [ $RELEASE == "6" ];then
            for ARCH in {x86_64,i386};do
                                CMD="yumdownloader --disablerepo='*' --enablerepo=$UPSTREAM-$RELEASE-$ARCH -c $REPOS/.repos/$UPSTREAM-$RELEASE.repo --destdir=$REPOS/$MASTER_REPO/$RELEASE/$GEN_NAME/ $PACKAGES"
                $CMD
                echo ${CMD}
                        done
        fi
    done
done

示例配置 (/opt/configs/repos/.repos/configs/mysql:

GEN_NAME=MySQL
UPSTREAM=mysql
PACKAGES=*

PACKAGES当该选项设置为其他任何内容时,我对软件包的下载没有任何问题*,因此我不会发布任何回购配置(因为我知道存储库工作)。

我从当前目录运行它:

# ls
mysql  salt  sysutils  zabbix

当我运行脚本时:

# ./myscript.sh
mysql
yumdownloader --disablerepo='*' --enablerepo=mysql-5-x86_64 -c /opt/data/build/repos/.repos/mysql-5.repo --destdir=/opt/data/build/repos/extras/5/MySQL/ mysql salt sysutils zabbix
yumdownloader --disablerepo='*' --enablerepo=mysql-5-i386 -c /opt/data/build/repos/.repos/mysql-5.repo --destdir=/opt/data/build/repos/extras/5/MySQL/ mysql salt sysutils zabbix
yumdownloader --disablerepo='*' --enablerepo=mysql-6-x86_64 -c /opt/data/build/repos/.repos/mysql-6.repo --destdir=/opt/data/build/repos/extras/6/MySQL/ mysql salt sysutils zabbix
yumdownloader --disablerepo='*' --enablerepo=mysql-6-i386 -c /opt/data/build/repos/.repos/mysql-6.repo --destdir=/opt/data/build/repos/extras/6/MySQL/ mysql salt sysutils zabbix

我想要的输出是:

mysql
yumdownloader --disablerepo='*' --enablerepo=mysql-5-x86_64 -c /opt/data/build/repos/.repos/mysql-5.repo --destdir=/opt/configs/repos/extras/5/MySQL/ *
yumdownloader --disablerepo='*' --enablerepo=mysql-5-i386 -c /opt/data/build/repos/.repos/mysql-5.repo --destdir=/opt/configs/repos/extras/5/MySQL/ *
yumdownloader --disablerepo='*' --enablerepo=mysql-6-x86_64 -c /opt/data/build/repos/.repos/mysql-6.repo --destdir=/opt/configs/repos/extras/6/MySQL/ *
yumdownloader --disablerepo='*' --enablerepo=mysql-6-i386 -c /opt/data/build/repos/.repos/mysql-6.repo --destdir=/opt/configs/repos/extras/6/MySQL/ *

这次运行的调试输出在这里:

mysql
+ for RELEASE in '{5..6}'
+ '[' 5 == 5 ']'
+ for ARCH in '{x86_64,i386}'
+ CMD='yumdownloader --disablerepo='\''*'\'' --enablerepo=mysql-5-x86_64 -c /opt/configs/repos/.repos/mysql-5.repo --destdir=/opt/configs/repos/extras/5/MySQL/ *'
+ echo yumdownloader '--disablerepo='\''*'\''' --enablerepo=mysql-5-x86_64 -c /opt/configs/repos/.repos/mysql-5.repo --destdir=/opt/configs/repos/extras/5/MySQL/ mysql salt sysutils zabbix
yumdownloader --disablerepo='*' --enablerepo=mysql-5-x86_64 -c /opt/configs/repos/.repos/mysql-5.repo --destdir=/opt/configs/repos/extras/5/MySQL/ mysql salt sysutils zabbix
+ for ARCH in '{x86_64,i386}'
+ CMD='yumdownloader --disablerepo='\''*'\'' --enablerepo=mysql-5-i386 -c /opt/configs/repos/.repos/mysql-5.repo --destdir=/opt/configs/repos/extras/5/MySQL/ *'
+ echo yumdownloader '--disablerepo='\''*'\''' --enablerepo=mysql-5-i386 -c /opt/configs/repos/.repos/mysql-5.repo --destdir=/opt/configs/repos/extras/5/MySQL/ mysql salt sysutils zabbix
yumdownloader --disablerepo='*' --enablerepo=mysql-5-i386 -c /opt/configs/repos/.repos/mysql-5.repo --destdir=/opt/configs/repos/extras/5/MySQL/ mysql salt sysutils zabbix
+ for RELEASE in '{5..6}'
+ '[' 6 == 5 ']'
+ '[' 6 == 6 ']'
+ for ARCH in '{x86_64,i386}'
+ CMD='yumdownloader --disablerepo='\''*'\'' --enablerepo=mysql-6-x86_64 -c /opt/configs/repos/.repos/mysql-6.repo --destdir=/opt/configs/repos/extras/6/MySQL/ *'
+ echo yumdownloader '--disablerepo='\''*'\''' --enablerepo=mysql-6-x86_64 -c /opt/configs/repos/.repos/mysql-6.repo --destdir=/opt/configs/repos/extras/6/MySQL/ mysql salt sysutils zabbix
yumdownloader --disablerepo='*' --enablerepo=mysql-6-x86_64 -c /opt/configs/repos/.repos/mysql-6.repo --destdir=/opt/configs/repos/extras/6/MySQL/ mysql salt sysutils zabbix
+ for ARCH in '{x86_64,i386}'
+ CMD='yumdownloader --disablerepo='\''*'\'' --enablerepo=mysql-6-i386 -c /opt/configs/repos/.repos/mysql-6.repo --destdir=/opt/configs/repos/extras/6/MySQL/ *'
+ echo yumdownloader '--disablerepo='\''*'\''' --enablerepo=mysql-6-i386 -c /opt/configs/repos/.repos/mysql-6.repo --destdir=/opt/configs/repos/extras/6/MySQL/ mysql salt sysutils zabbix
yumdownloader --disablerepo='*' --enablerepo=mysql-6-i386 -c /opt/configs/repos/.repos/mysql-6.repo --destdir=/opt/configs/repos/extras/6/MySQL/ mysql salt sysutils zabbix

在此先感谢 - 这真的让我陷入了困境......

4

2 回答 2

2

尝试将完整的命令嵌入到单个变量中并不是一个好主意。至少,将参数分成一个数组,并自行指定命令名称。此外,循环中的if语句RELEASE似乎没有必要,因为两个分支之间的唯一区别是RELEASE.

CONFIGS="/opt/configs/repos/.repos/configs"
REPOS="/opt/configs/repos"
MASTER_REPO=extras
SYNCAPPS=(mysql)

for APP in "${SYNCAPPS[@]}"; do
    . "$CONFIGS/$APP"
    echo "$APP"
    for RELEASE in 5 6; do
        for ARCH in x86_64 i386; do
            arguments=( "--disablerepo=*"
                        "--enablerepo=$UPSTREAM-$RELEASE-$ARCH"
                        "-c"
                        "$REPOS/.repos/$UPSTREAM-$RELEASE.repo"
                        "--"
                        "destdir=$REPOS/$MASTR_REPO/$RELEASE/$GEN_NAME/"
                        "$PACKAGES"
                       )
            echo "yumdownloader ${arguments[@]}"
            yumdownloader "${arguments[@]}"
        done
    done
done

这确保了PACKAGES(以及所有参数,实际上)的值在任何使用的地方都保持正确引用。

于 2014-04-07T13:22:45.000 回答
1

在您的脚本中,而不是:

echo ${CMD}

你需要使用:

echo "${CMD}"

避免外壳膨胀*

*打印不带引号时,它会扩展到当前目录中存在的文件和目录。

于 2014-04-07T13:01:39.600 回答