在bash脚本中将字符串转换为整数

时间:2012-10-10 14:23:47

标签: bash

在文本文件test.txt中,我有下一个信息:

sl-gs5 desconnected Wed Oct 10 08:00:01 EDT 2012 1001

我想通过下一个命令行提取事件的小时:

hour=$(grep -n sl-gs5 test.txt | tail -1 | cut -d' ' -f6 | awk -F ":" '{print $1}')

我得到了“08”。当我尝试添加1时,

 14 echo $((hour+1))

我收到下一条错误消息:

./test2.sh: line 14: 08: value too great for base (error token is "08")

如果Bash中的变量是无类型的,为什么?

8 个答案:

答案 0 :(得分:83)

请参阅man bash中的算术评估

  

前导0的常量被解释为八进制数。

您可以通过参数展开删除前导零:

hour=${hour#0}

或强制基础-10解释:

$((10#$hour + 1))

答案 1 :(得分:12)

我称之为黑客,但鉴于你只处理小时值,你可以做

 hour=08
 echo $(( ${hour#0} +1 ))
 9
 hour=10 
 echo $(( ${hour#0} +1))
 11

风险很小。

IHTH。

答案 2 :(得分:8)

您也可以使用bc

hour=8
result=$(echo "$hour + 1" | bc)
echo $result
9

答案 3 :(得分:1)

sed怎么样?

hour=`echo $hour|sed -e "s/^0*//g"`

答案 4 :(得分:1)

由于小时数总是正数,且总是2位数,因此您可以在它前面设置1并减去100:

using (var authService = HostContext.ResolveService<AuthenticateService>())
{
    //authenticate with servicestack
    var response = authService.Authenticate(new Authenticate
    {
        provider = CredentialsAuthProvider.Name,
        UserName = model.Username,
        Password = model.Password,
        RememberMe = model.RemeberMe
    });

    ...

相当于

container.Register<IDbConnectionFactory>(
    new OrmLiteConnectionFactory(connStr, //ConnectionString in Web.Config
        SqlServerDialect.Provider)
    {
        ConnectionFilter = x => new ProfiledDbConnection(x, Profiler.Current)
    });

一定要评论这样的体操。 :)

答案 5 :(得分:0)

这是一种简单的方法,虽然不是获取字符串int值的最漂亮的方法。

hour=`expr $hour + 0`

实施例

bash-3.2$ hour="08"
bash-3.2$ hour=`expr $hour + 0`
bash-3.2$ echo $hour
8

答案 6 :(得分:0)

前导0导致bash尝试将您的号码解释为八进制数,但八进制数为0-7,因此8是无效令牌。

如果我是你,我会添加一些逻辑来删除前导0,添加一个,并重新添加前导0如果结果是&lt; 10。

答案 7 :(得分:0)

简而言之::为了处理bash中的“ 前导零”数字(第一个非零之前的任何0数字)  -使用bc任意精度的计算器语言

示例:

a="000001"
b=$(echo $a | bc)
echo $b
  

输出:1

从Bash手册中:

  

“ bc是一种支持交互式执行任意精度数字的语言          的陈述。语法与C编程语言有一些相似之处-          规矩。可通过命令行选项使用标准数学库。如果要求,          数学库是在处理任何文件之前定义的。公元前开始处理来自          按照列出的顺序在命令行上列出的所有文件。所有文件都有后          经过处理后,bc从标准输入中读取。所有代码均在读取时执行。          (如果文件包含暂停处理器的命令,则bc将永远不会从标准输入中读取。)”