Bash:增加字符串中的计数器变量

时间:2017-05-01 02:04:39

标签: bash shell

在Bash中,我试图从文本字符串中增加一个计数器变量(数字)。如果我单独调用counter var它会成功递增,但如果我在循环的每次迭代中回显字符串变量,则计数器变量不会递增。

#!/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}/"

..给出了同样不正确的结果。

由于

3 个答案:

答案 0 :(得分:3)

function dailyclear(e)
{
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheet = ss.getSheetByName('Today');

  sheet.copyTo(ss)
  var nusheet = ss.getSheetByName('Copy of Today')
  var value = nusheet.getRange("B2").getCell(1,1).getValue()
  SpreadsheetApp.setActiveSheet(nusheet)
    
  Logger.log("Current index of sheet: %s", nusheet.getIndex())
  ss.moveActiveSheet(2);
  nusheet.setName(value);
  
  //Clear "Today"
  var lastrow = sheet.getLastRow()
  sheet.deleteRows(8, lastrow-7);
  
  //Set Date Value for "Today"
  var dd = Utilities.formatDate(new Date(), "GMT-5", "MM/dd/yy");
  sheet.getRange("B2").getCell(1,1).setValue(dd);
}

答案 1 :(得分: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

如果不了解更大的情况或您想要实现的目标,推荐策略就很困难。

答案 2 :(得分: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