2017-02-21 91 views
0

我想運行一個shell腳本:shell腳本 - 意外令牌'然後」

#!/bin/bash 
if [[ -z "$KAFKA_BROKER_ID" ]]; then 
    export KAFKA_BROKER_ID=$KAFKA_ADVERTISED_PORT 
fi 
if [[ -z "$KAFKA_LOG_DIRS" ]]; then 
    export KAFKA_LOG_DIRS="/kafka/kafka-logs-$KAFKA_BROKER_ID" 
fi 
if [[ -n "$KAFKA_HEAP_OPTS" ]]; then 
    sed -r -i "s/(export KAFKA_HEAP_OPTS)=\"(.*)\"/\1=\"$KAFKA_HEAP_OPTS\"/g" $KAFKA_HOME/bin/kafka-server-start.sh 
    unset KAFKA_HEAP_OPTS 
fi 

for VAR in `env` 
do 
  if [[ $VAR =~ ^KAFKA_ && ! $VAR =~ ^KAFKA_HOME ]]; then 
    kafka_name=`echo "$VAR" | sed -r "s/KAFKA_(.*)=.*/\1/g" | tr '[:upper:]' '[:lower:]' | tr _ .` 
    env_var=`echo "$VAR" | sed -r "s/(.*)=.*/\1/g"` 
    if egrep -q "(^|^#)$kafka_name=" $KAFKA_HOME/config/server.properties; then 
      sed -r -i "[email protected](^|^#)($kafka_name)=(.*)@\2=${!env_var}@g" $KAFKA_HOME/config/server.properties 
    else 
      echo "$kafka_name=${!env_var}" >> $KAFKA_HOME/config/server.properties 
    fi 
  fi 
done 

#$KAFKA_HOME/bin/kafka-server-start.sh $KAFKA_HOME/config/server.properties 

我曾嘗試以下:

  • 試圖改變#/斌/慶典來! #!/ bin/sh的
  • 試圖與./file.sh,SH file.sh和bash file.sh執行文件
  • 試過代碼的縮進

但是要得到相同的錯誤:

start-kafka.sh: line 15: syntax error near unexpected token `then' 
start-kafka.sh: line 15: `  if [[ $VAR =~ ^KAFKA_ && ! $VAR =~ ^KAFKA_HOME ]]; then' 

也見過類似的問題,但不能找到解決這個。

在這一行
+6

請編輯您的代碼以將其減少到您的問題的[mcve]。您當前的代碼包含很多與您的問題相關的代碼 - 通常,最小樣本看起來與單元測試相似:只執行一項任務,輸入值指定爲可重現性。也就是說,當我用無害的命令替換命令時(例如用'echo'加前綴),我就不會在代碼中出現語法錯誤。也許你的環境中存在某些特殊的價值觀? –

+0

你在linux上運行這個bash嗎? –

+0

@avihoo - 標籤會提示。 –

回答

0

它終於奏效了。代碼沒有錯誤。正如Toby Speight 所說,我通過在echo前加前綴來重新編寫整個代碼,以查找任何語法錯誤。

但是,當檢查第20行其他存在時,我得到了一些錯誤。但是,它最終解決了。

看上去好像這是一個問題與其他屬於如果語句(第18行或第15行)。我認爲使用IDE的縮進問題將是一個不錯的選擇。

-2

if egrep -q "(^|^#)$kafka_name=" $KAFKA_HOME/config/server.properties; then 

缺少括號[]

或許這能夠解決您的問題。

+1

'if'不需要括號,它執行一個命令並評估它的返回碼。括號只是編寫測試的簡短形式,'['通常是shell內建或符號鏈接'/ usr/bin/[ - >/usr/bin/test' – mata