2014-04-07 60 views
1

我寫了一個小BASH腳本,它需要一個簡單的配置並抓取預配置的第三方存儲庫,並從它們下載某些軟件包。BASH:星號作爲參數

我現在遇到的問題是,當我在配置中使用星號時,它在執行腳本時需要任何目錄,並將我目錄中的所有文件作爲參數展開。我理解單引號和雙引號之間的區別,但似乎不管我做什麼,我都無法使其工作。也許有人可以幫我一個這個。這裏的腳本:

#!/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 

謝謝提前 - 這真的把我扔了一圈...

+2

它拼寫星號。 –

+1

閱讀:http://mywiki.wooledge.org/BashFAQ/050。 – chepner

回答

2

試圖將完整的命令嵌入到單個變量中很少是一個好主意。至少,將參數分隔到一個數組中,並自己指定命令名稱。此外,RELEASE循環內的if聲明似乎不必要,因爲兩個分支之間的唯一區別是值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值(和所有的參數,真)保持適當地引用任何地方使用。

+0

關於你對'if'語句的推薦;這只是腳本的初始階段。我已經發布了將要進入的特定項目,我將需要'if'語句。基本解決方案的+1: – drewrockshard

+1

;也許說「變成一個包含單個字符串的變量」 - 而不是_array_變量; (它們都是單個變量)。 – mklement0

+1

@ mklement0 True;在這種情況下,一個簡單的命令仍然可以包含在一個數組中,並使用'「{{CMD [@]}」'執行。但只要你嘗試更復雜的東西 - 「FOO = bar cmdname arg1','cmd1 | cmd2'等等 - 你又回到了單個變量不足的問題。最好堅持只將參數存儲在數組中,並留下命令名稱和更高級的語法,不論是硬編碼還是用函數包裝。 – chepner

1

在你的腳本,而不是:

echo ${CMD} 

您需要使用:

echo "${CMD}" 

爲了避免外殼擴展*

*不帶引號打印時,它展開爲當前目錄中存在的文件和目錄。