2017-05-01 82 views
0

在Bash中,我試圖從文本字符串中增加一個計數器變量(數字)。如果我獨自調用計數器變量,它會成功遞增,但如果我在循環的每次迭代中都回顯字符串變量,則計數器變量不會遞增。Bash:增加一個字符串中的計數器變量

#!/bin/bash 

number=1 

yes="number$number/" 

for i in 1 2 3 
do 
    echo $number 

    echo $yes 

    ((number++)) 

done 

我得到這樣的輸出:

1 
number1/ 
2 
number1/ 
3 
number1/ 

儘管我希望這樣的:

1 
number1/ 
2 
number2/ 
3 
number3/ 

我也試過這樣:

yes="number${number}/" 

..這給出了相同的錯誤的結果。

感謝

+2

'是=「號$號/」 '被分配一次。當'$ number'的值改變時它不會更新。 –

+0

你知道如何在字符串中獲取$ number變量來更新$ number變化嗎? – Jon

+1

@Jon:你不行。擴展只在分配時發生。您必須將作業移至「$ number」中具有正確值的地方。 – Dolda2000

回答

2
for i in 1 2 3 
do 
    echo $number 
    yes="number$number/" 
    echo $yes 

    ((number++)) 

done 
1

正如你在評論被告知,擴張發生在分配的時間。變量$yes包含一個字符串,其中包含賦值時的值$number。分配後,$yes的內容中沒有任何內容表示與變量$number的任何連接。

有兩種常見的方法來獲得這種功能。您可以使用eval

#!/usr/bin/env bash 

number=1 

yes='number$number/' # note the single quotes 

for i in 1 2 3; do 

    echo "$number" 
    eval "echo \"$yes\"" 
    ((number++)) 

done 

注意的$yes值不爲這裏正在更新 - 它只是被用來擴大是什麼echo打印。

你會發現許多人不鼓勵使用eval,因爲它可能會有意外的安全相關後果。

其次,您每次運行循環時都可以更新yes

#!/usr/bin/env bash 

number=1 

for i in 1 2 3; do 

    echo "$number" 

    yes="number$number/" 
    echo "$yes" 

    ((number++)) 

done 

如果你正在尋找使用這個格式化,然後printf是你的朋友:

#!/usr/bin/env bash 

number=1 

yesfmt='number%d\n' 

for i in 1 2 3; do 

    echo "$number" 
    printf "$yesfmt" "$number" 
    ((number++)) 

done 

不知道的大局觀還是你想達到什麼目的,就很難推薦戰略。

0

使用的功能(我從yes更名爲report因爲yes是一個標準的POSIX實用,反正它是不是在所有的描述。)

#!/bin/bash 
number=1 
report() { echo "number$number/"; } 
for i in 1 2 3; do 
    echo $number 
    report 
    ((number++)) 
done