2012-01-18 51 views
1

簡單的打擊+1請很短的if,else,fi腳本。我在某處失去了某些東西。請伸出手

嘿那裏。我知道我在這個腳本中錯過了一些簡單的東西。但是它是什麼?出口?科幻? 當我使用名稱 - 在線我從最後一節得到回聲「Bool Changed offline2」。在線代碼不應與離線衝突。幫助,我已經在這裏好幾個小時了。

if [ "$1" == "-online" ]; then 
     if [ "$Check" == "com.company.package1" ]; then 
      plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null 
      echo "Bool Changed online1" 
      exit 
     fi 
    else 
     if [ "$Check" == "com.company.package2" ]; then 
      plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null ////EDITED TO com.company.package2 
      echo "Bool Changed online2" 
      exit   
     fi 
    fi 


if [ "$1" == "-offline" ]; then 
     if [ "$Check" == "com.company.package1" ]; then 
      plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null 
      echo "Bool Changed offline1" 
      exit 
     fi 
    else 
     if [ "$Check" == "com.company.package2" ]; then 
      plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null //EDITED TO com.company.package2 
      echo "Bool Changed offline2" 
      exit   
     fi 
    fi 
+0

您的代碼看起來不錯,雖然張貼,它缺乏一個家當線。你確定它是由Bash執行的嗎?嘗試'bash -x名字-online',一開始可能沒有'-x'。 – tripleee 2012-01-18 18:10:21

+0

'plutil'命令似乎在所有分支中都是相同的,這是故意的嗎? – tripleee 2012-01-18 18:15:07

+0

縮進一旦調整,問題可能會更清楚。 – MRAB 2012-01-18 18:06:18

回答

4

假設$Check被設置爲「 com.company.package2「(其中,很遺憾你不會顯示),這是你的腳本正在做的事情:

  • 第一個if是真實的,因爲命令參數是「-online」。
  • 第二if爲假(「包2」!=「包1」)
  • 第一else由於第一if是真正被跳過
  • 的「-offline」 if是假的,那麼它的else路徑被取
  • 最終if爲真( 「包2」!= 「包2」),從而該消息是呼應

else if是不一樣的elif

由於您用fi關閉了內部if語句,因此else針對外部語句if進行了評估。

你可能想:

#!/bin/bash 

Check=com.company.package2 

if [[ $1 == "-online" ]]; then 
     if [[ $Check == "com.company.package1" ]]; then 
      plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null 
      echo "Bool Changed online1" 
      exit 
     elif [[ $Check == "com.company.package2" ]]; then 
      plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null ////EDITED TO com.company.package2 
      echo "Bool Changed online2" 
      exit 
     fi 
elif [[ $1 == "-offline" ]]; then 
     if [[ $Check == "com.company.package1" ]]; then 
      plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null 
      echo "Bool Changed offline1" 
      exit 
     elif [[ $Check == "com.company.package2" ]]; then 
      plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null //EDITED TO com.company.package2 
      echo "Bool Changed offline2" 
      exit 
     fi 
fi 
+0

很好的答案。我還建議改變第二個外部,如果對elif。沒有必要檢查「$ 1」是否等於「-offline」,如果它等於「-online」。 – 2012-01-18 21:47:03

+0

@JasonDay:好的建議,我正在更新我的答案。 – 2012-01-18 21:52:01

-1

難道是';'在你的if子句之後?

if [ "$1" == "-online" ]**;** then 
+0

沒有。這是合法和慣用的。 – tripleee 2012-01-18 18:08:07

+1

這不是問題。仍然得到「布爾變離線2」 – CokePokes 2012-01-18 18:09:16

0

其他的內容如果對吧?我認爲這是問題! 使用ELIF代替

if [ "$Check" == "com.company.package1" ]; then 
    ... 
elif [ "$Check" == "com.company.package2" ]; then 
    ... 
fi 
+0

'elif'只是一個簡寫; 'else if'也是合法的。 – tripleee 2012-01-18 18:12:32

+0

這沒有奏效。仍然只是Bool更改了offline2回顯。運行聯機命令時甚至不應執行脫機。我必須錯過一個if,fi或退出。但是哪裏? – CokePokes 2012-01-18 18:36:01

+0

@tripleee:'elif'(不需要自己的'fi')不僅僅是'else if'(這個_does_需要它自己的'fi')的簡寫。 – 2012-01-18 21:43:58

0

取代你else通過elif

if [ "$1" == "-online" ]; then 
    if [ "$Check" == "com.company.package1" ]; then 
     echo "Bool Changed online1" 
     exit 
    elif [ "$Check" == "com.company.package2" ]; then 
     echo "Bool Changed online2" 
     exit 
    fi 
fi 

if [ "$1" == "-offline" ]; then 
    if [ "$Check" == "com.company.package1" ]; then 
     echo "Bool Changed offline1" 
     exit 
    elif [ "$Check" == "com.company.package2" ]; then 
     echo "Bool Changed offline2" 
     exit 
    fi 
fi 

echo "Combination [Check=$Check/param1=$1] did not match any case" 

編輯:哎呀我剛纔瞭解@ v01pe意味着相同的: -/

0

這似乎$Check等於com.company.package2

你支到第一if語句,因爲你的說法是「 - 線上」,那麼$檢查不到com.company.package1相等,所以你如果不幹這個不撒手......

談到第二個if語句對於-offline檢查這是不是你的情況真實的說明,那麼在else分支...

最後$Check等於com.company.package2和打印您的echo命令...

0

我已經清理你的代碼:

  • 我用 =代替 ==字符串等於。較新版本的Bash將採用其中一種。但是,早期版本只會在 [[]]測試中執行 ==,有時候根本就沒有達到您的預期。
  • 將您的if語句與 語法或 [ ... ] && [ ... ]語法或 [ ... -a ... ]語法組合使用。這將簡化你的邏輯。 [[ ... && ... ]]
  • 使用elif而不是在else子句中添加if子句。再一次,它簡化了你的語法。
  • 刪除退出。整個邏輯結構現在只執行四個條件之一。此內容無需退出。
  • $Check在哪裏設置?它是你程序外的變量集嗎?如果是這樣,請確保它是exported,因此它在子shell和shell腳本中定義。

我做了更改後,腳本似乎工作。我必須在運行腳本之前設置$Check,因爲我的系統上沒有這個命令,所以我不得不放棄plutil命令,但邏輯運行正常。

您可以做的最大的事情是在運行shell腳本時設置set -xv。這打開了調試。 -x在展開後打印出命令行並顯示設置的內容。 -v顯示正在寫入的命令行。

例如:

$ set -v 
$ ls f* 
ls f* 
foo.txt foobar.txt 
$ set -x 
ls f* 
ls foo.txt foobar.txt 
foo.txt foobar.txt 

關閉調試,簡單地做一個set +xv。事實上,你可以在你遇到問題的長shell腳本的章節中執行set -xvset +xv。這樣,你就不會被調試信息所淹沒。

這是你的程序:

#! /bin/bash 

#set -xv 

if [[ "$1" == "-online" ]]; then 
    if [[ "$Check" == "com.company.package1" ]]; then 
     plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null 
     echo "Bool Changed online1" 
    elif [[ "$Check" == "com.company.package2" ]]; then 
     plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null ////EDITED TO com.company.package2 
     echo "Bool Changed online2" 
    fi 
elif [[ "$1" == "-offline" ]]; then 
    if [[ "$Check" == "com.company.package1" ]]; then 
     plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package1 &> /dev/null 
     echo "Bool Changed offline1" 
    elif [[ "$Check" == "com.company.package2" ]]; then 
     plutil -key settingsOfflineMode -value 0 -type bool /the/dir/ect/ory/com.company.package2 &> /dev/null //EDITED TO com.company.package2 
     echo "Bool Changed offline2" 
    fi 
fi 
+0

在你的第一個要點中,你引用了雙方括號,但在你的答案的其餘部分中,你使用單括號(就像OP一樣)。所有版本的Bash至少2.05b可以在'[[]]'(也包括ksh93和zsh)中接受'='或'=='。一些Bourne派生的shell(例如最初的'sh'和Dash)不支持雙方括號,因此不支持double equals。在Bash中,首選的連接詞將是'[[... && ...]]',而不是將外接符號或使用'-a'。當然,那些需要或堅持可移植性的人不希望使用Bash特有的功能。 – 2012-01-19 14:47:02

+0

@DennisWilliamson - 我在一大堆不同的Bourne類型的shell中工作,所以我傾向於編程到最低公分母。在Kornshell中,[[$ foo == $ bar]]不一定是平等,而是模式匹配。出於習慣,我傾向於使用單括號和單個等號,因爲我知道它與兩者兼而有之。不過,我會更新我的答案以使用'[[]]',因爲這是真正的首選。 – 2012-01-19 19:11:51

+0

在Bash中,它也是模式匹配。以下內容適用於Bash和ksh:如果右側的項目是未加引號的字符串或未加引號的變量,並且包含通配符,則使用通常的通配符規則比較左側的字符串。如果右側的項目被引用,則通配符字符將被直接替換。使用'=='或'='沒有區別。 – 2012-01-19 20:04:03

相關問題