2014-03-30 97 views
1

我有以下.sh文件我拼湊出了我在互聯網上找到的東西。
目標是讀取CSV文件中的第二行第二項並使用它發送刪除命令給elasticsearch。在腳本內部運行curl時出錯(沒有這樣的文件或目錄)

#!/bin/sh 
OLDIFS=$IFS 
IFS=, 


function quit { 
     echo "Quitting Script" 
     IFS=$OLDIFS 
    exit 1 
} 
function fileExists { 
    if [ ! -f "$1" ] 
     then 
      echo "File $1 does not exists" 
       quit 
     fi 
echo "File Name: $1" 
} 
function work { 
     linesToSkip=1 
     { 
      for ((i=$linesToSkip;i--;)) ;do 
       read 
      done 
       #Read 2nd item of the 2nd line of CSV file to get PROGRAMURL 
      read INDEX PROGRAMURL JUNK 
       echo "$PROGRAMURL" 
       QUERY="curl -XDELETE http://127.0.0.1:9200/cj/_query -d '{ \"query\" : { \"match\" : { \"PROGRAMURL\" : "$PROGRAMURL" } } }'" 
       $("$QUERY") 
       #RESPONSE=`$QUERY` 
       #echo $RESPONSE 

     } < $1 

} 

fileExists $1 
work $1 
IFS=$OLDIFS 

除了執行curl腳本以外的所有東西都可以使用。我已經用$(),backtics,exec來試用它,我無法使它工作。

以下是錯誤當我運行的bash -vx script.sh:

bash -vx ./deleteExisting.sh catalog.csv 
#!/bin/sh 
OLDIFS=$IFS 
+ OLDIFS=' 
' 
IFS=, 
+ IFS=, 


function quit { 
    echo "Quitting Script" 
    IFS=$OLDIFS 
    exit 1 
} 
function fileExists { 
    if [ ! -f "$1" ] 
    then 
     echo "File $1 does not exists" 
     quit 
    fi 
echo "File Name: $1" 
} 
function work { 
    linesToSkip=1 
    { 
     for ((i=$linesToSkip;i--;)) ;do 
      read 
     done 
     #Read 2nd item of the 2nd line of CSV file to get PROGRAMURL 
     read INDEX PROGRAMURL JUNK 
     echo "$PROGRAMURL" 
     QUERY="curl -XDELETE http://127.0.0.1:9200/cj/_query -d '{ \"query\" : { \"match\" : { \"PROGRAMURL\" : "$PROGRAMURL" } } }'" 
     $("$QUERY") 
     #RESPONSE=`$QUERY` 
     #echo $RESPONSE 

    } < $1 

} 

fileExists $1 
+ fileExists catalog.csv 
+ '[' '!' -f catalog.csv ']' 
+ echo 'File Name: catalog.csv' 
File Name: catalog.csv 
work $1 
+ work catalog.csv 
+ linesToSkip=1 
+ ((i=1)) 
+ ((i--)) 
+ read 
+ ((1)) 
+ ((i--)) 
+ read INDEX PROGRAMURL JUNK 
+ echo '"http://www.website.com"' 
"http://www.website.com" 
+ QUERY='curl -XDELETE http://127.0.0.1:9200/cj/_query -d '\''{ "query" : { "match" : { "PROGRAMURL" : "http://www.website.com" } } }'\''' 
"$QUERY") 
"$QUERY" 
++ 'curl -XDELETE http://127.0.0.1:9200/cj/_query -d '\''{ "query" : { "match" : { "PROGRAMURL" : "http://www.website.com" } } }'\''' 
./deleteExisting.sh: line 29: curl -XDELETE http://127.0.0.1:9200/cj/_query -d '{ "query" : { "match" : { "PROGRAMURL" : "http://www.website.com" } } }': No such file or directory 
IFS=$OLDIFS 
+ IFS='  
' 

例CSV文件將

INDEX, PROGRAMURL, other, info 
"1", "http://website.com", "other info", "information" 
+0

不要試圖形成一個命令串出和變量的作品。使用*功能*。 –

+0

你能詳細解釋一下嗎? – Brad

+0

@ n.m。即使使用函數,在shell腳本中的某個時刻,通常也必須將事物粘合在一起......這通常可能是一個指示器,可能是考慮Python等另一種語言的時候了 – 6EQUJ5

回答

4

運行$("$QUERY")實際上是嘗試在子shell中運行,一個叫<the expanded value of $QUERY>的命令,因此你的'(bunch of stuff) No such file or directory'錯誤。

你可能想是這樣的:

CURLURL="http://127.0.0.1:9200/cj/_query" 
CURLDATA='{ "query" : { "match" : { "PROGRAMURL" : "'$PROGRAMURL'" } } }' 
RESPONSE=`curl -XDELETE "$CURLURL" -d "$DATA"` 

這裏的技巧是,你如何嵌套的單引號和雙引號。它有點難以簡明地解釋,但這裏有:

  • 殼變量不在外部單引號內部擴展。
  • 但是你不需要在單引號內跳過雙引號
  • 因此,我們如何得到$PROGRAMURL以上展開,立即將它連接在一對閉合開啓的單引號之間。
  • 隨後要使用的變量CURLDATA它必須得到傳遞給curl命令雙引號
  • 一個非常簡單的例子裏面:
VARIABLE1="Hello, world" 
VARIABLE2='This is "$verbatim" stuff"'$VARIABLE1'" More stuff' 
  • 由此產生的This is "$verbatim" stuff"Hello, World" More stuff
  • $VARIABLE2

其他注意事項:

  • 以上將把curl命令的整個標準輸出到變量RESPONSE
  • 您需要檢查$?之後,看看是否捲曲實際上設法交談的主機等 - 這將是0,如果一切正常
  • 你不妨進度條關閉

跳過線:

  • 一種更好的方式來跳過線是使用:
tail -n +$(($linesToSkip +1)) 
+0

看起來像是行得通的,謝謝你的解釋。 – Brad

+0

我用你剛纔所說的更新了腳本,我又遇到了同樣的問題,我想我正確地做了它..你介意看看它嗎? http://stackoverflow.com/questions/22759076/bash-script-not-running-propperly謝謝 – Brad

相關問題