在文本文件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中的变量是无类型的,为什么?
答案 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将永远不会从标准输入中读取。)”