2014-05-22 74 views
0

我想創建一個藍圖出這個shell腳本來安裝不同系統上的不同rpms並匹配系統類型。在這個例子中,我有2個名爲centos1和suse1的系統。每個系統都有一個相應的資源ID存儲在變量「ID」中,並且應該運行匹配每個命令的命令。所有系統名稱都從名爲vm.txt的文本文件中讀取。如果其他條件多次安裝

~]# cat vm.txt 
centos1 
suse1 

~]# ./myscript.sh vm.txt 

     #!/bin/bash 
     for node in `cat $1` 
     do 
      # id is the resource id for each system listed in vm.txt 
      id=`./test.sh get resource id --platform=$node` 
      if [ $node == centos1 ] 
      then 
      echo `./install.sh resource $id centos1-httpd` 
      echo `./install.sh resource $id centos1-gcc` 
      elif [ $node == suse1 ] 
      then 
      echo `./install.sh resource $id suse1-httpd` 
      echo `./install.sh resource $id suse1-gcc` 
      else 
      echo "No packages found" 
      fi 
     done 

未來我將不得不將幾百個系統添加到腳本文件和安裝標準中。我不確定在這個腳本中使用if-else條件會導致更多的代碼行導致以後難以管理。有沒有更好的方法來處理這個問題?我應該使用與if-else不同的條件來完成此操作嗎? PS:對於這個基本問題抱歉。我仍然試圖讓我的實踐成爲腳本。

+0

'對於'cat $ 1''中的節點':不要這樣做。 [請參閱此鏈接瞭解更多信息](http://mywiki.wooledge.org/DontReadLinesWithFor)。另外,去抱怨給那些給你可怕信息的傢伙或網站。做到這一點。認真。 –

回答

0

什麼:

#!/bin/bash 
    while read -d $'\n' -r node; 
    do 
     # id is the resource id for each system listed in vm.txt 
     id=`./test.sh get resource id --platform=$node` 
     echo `./install.sh resource $id ${node}-httpd` 
     echo `./install.sh resource $id ${node}-gcc` 
    done < "$1" 

爲了取悅@choroba

#!/bin/bash 
    known_nodes=" centos1 suse1 " # leading and final space are important 

    while read -d $'\n' -r node 
    do 
     if [[ " $node " =~ "$known_nodes" ]]; then 
     # id is the resource id for each system listed in vm.txt 
     id=`./test.sh get resource id --platform=$node` 

     echo `./install.sh resource $id ${node}-httpd` 
     echo `./install.sh resource $id ${node}-gcc` 
     else 
     echo "Don't know node ${node}. Skipping." 
     fi 
    done < "$1" 
+0

我會添加驗證$節點具有有效值。 \'cat $ 1 \''中的節點' – choroba

+0

'。請不要這樣做。看到我對蒂亞戈的回答的評論。 –

+0

@gniourf_gniourf是的,你是對的,但它是如此誘人。他的文件只是完美的格式:) – RedX

0

您可以使用case會更容易添加發行版,你走比elseif

[email protected]:/tmp$ cat myscript.sh 
#! /bin/bash 

for node in $(cat $1); do 
    id=$(./test.sh get resource id --platform=$node) 
    case $node in 
     centos1) 
      echo "./install.sh resource $id centos1-httpd" 
      echo "./install.sh resource $id centos1-gcc"  
     ;; 

     suse1) 
      echo "./install.sh resource $id suse1-httpd" 
      echo "./install.sh resource $id suse1-gcc" 
     ;;  

     *) 
      echo "No Packages found" 
     ;; 
    esac 
done 

執行:

[email protected]:/tmp$ bash myscript.sh <(echo -e 'centos1\nsuse1\nfedora') 
./install.sh resource centos1-httpd 
./install.sh resource centos1-gcc 
./install.sh resource suse1-httpd 
./install.sh resource suse1-gcc 
No Packages found 
+0

謝謝蒂亞戈。我還有一個資源id映射到每個節點,它存儲在變量「id」中。這個ID需要被識別並添加到install.sh命令中。我應該在哪裏指定這個腳本?編號='。/ test.sh獲取資源編號 - 平臺= $節點' – user3331975

+0

好吧,我會編輯我的答案來添加它。 – Tiago

+0

我把它放在正確的地方。請注意,'echo「./install.sh資源$ id suse1-httpd」'應該是'echo $(./ install.sh resource $ id suse1-httpd)'。我把它放在引號之間,所以我可以打印而不是執行。在$(cat $ 1)中爲節點添加' – Tiago