如何在Bash/shell中将所有数字转换?
VAR=00005
VAR=00010
VAR=00601
VAR=00550
to
echo $VAR #5
echo $VAR #10
echo $VAR #601
echo $VAR #550
VAR=00005
VAR=00010
VAR=00601
VAR=00550
to
echo $VAR #5
echo $VAR #10
echo $VAR #601
echo $VAR #550
$> cat text
00005
00010
00601
00550
$> sed -r 's/0*([0-9]*)/\1/' text
5
10
601
550
使用 printf
:
$> while read n; do printf "%0d\n" $((10#$n)); done < text
5
10
601
550
注意,当数字格式期望一个数字时,内部printf命令将使用基于Bash算术规则的通用计数法。为了强制使用十进制表示,并同时删除Bash变量中的任何前导零,我们应该使用$((10#$n))
或者像这样:
kent$ echo "00005
00010
00601
00550"|awk '$0*=1'
5
10
601
550
针对您更新后的问题(带有VAR),首先,您应该使用不同的变量名称,而不是全部使用VAR。
请参考以下示例:
kent$ VAR=00601
kent$ VAR=$((VAR+0))
kent$ echo $VAR
601
编辑:
关于评论(08、09 不能工作):
这里 08、09 可以工作,可能与我的 Shell 有关。我使用的是 Zsh。我在 Bash 下测试了以下内容,它们可以工作。希望能帮到你:
在 Zsh 中:
kent$ v=08
kent$ v=$((v+0))
kent$ echo $v
8
kent@7PLaptop:/tmp$ bash -version
GNU bash, version 3.2.48(1)-release (i486-pc-linux-gnu)
Copyright (C) 2007 Free Software Foundation, Inc.
kent@7PLaptop:/tmp$ v=08
kent@7PLaptop:/tmp$ v=$(sed 's/^0*//'<<< $v)
kent@7PLaptop:/tmp$ echo $v
8
使用extglob
,您无需任何外部进程:
shopt -s extglob # Enable extended globbing
for i in 00005 00010 00601 00550; do
echo ${i##+(0)}
done
VAR="08"
let "VAR=10#${VAR}"
echo $VAR
移除前导零。
收件人:ДМИТРИЙ МАЛИКОВ
printf "%d\n" 0000
printf "%d\n" 0001
printf "%d\n" 0002
printf "%d\n" 0003
printf "%d\n" 0007
printf "%d\n" 0008
printf "%d\n" 0009
printf "%d\n" 0010
printf "%d\n" 0011
printf "%d\n" 0012
结果
0
1
2
3
7
0 line 8: printf: 0008: invalid octal number
0 line 9: printf: 0009: invalid octal number
8 !error - correctly 10
9 !error - correctly 11
10 !error - correctly 12
15
- ДМИТРИЙ МАЛИКОВ您可以使用printf
来添加或删除前导零:
$ printf "%05d\n" 5
00005
$ printf "%d\n" 00005
5
$ printf "%010d\n" 00005
0000000005
printf "%d\n" 00010
的结果是 8
,因为它将其解析为八进制。 - allada