2017-08-10 60 views
1

我也有if一個腳本,需要幾百行,因爲它列出了所有的可能性,我想知道是否有可能它的尺寸縮小到只有幾行,因爲我發現自己在所有這些方面都失敗了。這裏是一個例子的代碼:緊湊的「如果」在bash腳本

if [ "$player_position" = 1 ]; then 
    echo "Player is on the tile 1" 
elif [ "$player_position" = 2 ]; then 
    echo "Player is on the tile 2" 
elif [ "$player_position" = 3 ]; then 
    echo "Player is on the tile 3" 
fi 

依此類推。我想擺脫所有的elif但保留一切準備

PS:每個瓷磚有一個名字是在像「tile_1_name」一個變量,數量也有可能改變

+0

瓦片號碼是否總是與'$ player_position'的值完全相同的值?有效值的範圍是什麼? –

回答

1

,您可以使用a "nameref"

# first check the bounds of the position 
if ((1 <= player_position && player_position <= max_upper_position)); then 
    declare -n tile="tile_${player_position}_name" 
    echo "Player is on the tile ${tile:-with no name}" 
else 
    echo "Invalid player position: $player_position" 
fi 

但是,您應該停止使用「動態」變量名稱,如「tile_1_name」。取而代之的是使用一個數組:

tile_names[4]="Fourth tile" 
... 
echo "Player is on the tile ${tile_names[$player_position]:-with no name}" 
+0

謝謝!但我不明白數組 – Quozul

+0

你不明白數組的語法或概念嗎? –

+0

我覺得一方面是因爲我不知道如何設置瓷磚的名字,我總是得到「玩家是沒有名字的瓷磚」:/ – Quozul

0
if [ "$player_position" -ge 1 -a "$player_position" -le 3 ]; then 
    echo "Player is on the tile $player_position" 
fi 

說明:

  • -ge:大於或等於
  • -le:小於或等於
  • -a:邏輯AND
0

您需要通過循環來完成。 例如:

player_position=0 
tile_1_name=0 

for ((i=0; i<=100; i++)) 
do 
    if [ "$player_position" == $i ];then 
     echo "Player is on the tile $i" 
     echo $tile_1_name 
    fi 
tile_1_name+=1 
done 
+0

我忘了指定每個圖塊都有一個名稱在像「$ tile_1_name」這樣的變量中,該數字也必須更改,我該怎麼做?用for循環可能嗎? 當我嘗試你的腳本時,它給了我'語法錯誤:壞循環變量' – Quozul

+0

我已經在我的答案中保存了正確的腳本,但我不知道$ tile_1_name需要聲明的位置。 –

0

您可以使用case聲明:如果您使用的是最新的bash的版本(4.4我相信)

case "$player_position" in           
[0-9]) 
    echo "Player is on the tile $player_position" 
    ;; 
esac