我在 ksh 中有一个变量,它不能包含超过 2 个逗号分隔的数字(允许空格)。就像是:
a="1,2"
a="1 ,2"
a="1,"
a="0,0"
我想要一个循环
- 通读
$a
- 如果有多个则退出
,
- 分配
m=a[1]
和n=a[2]
答案1
for a in "1,2" "1 ,2" "1," "0,0" "0,0,0" "2,3"; do
case "$a" in
*,*,*) printf 'Too many commas: "%s"\n' "$a" >&2
exit 1
esac
IFS=', ' read m n <<<"$a"
printf 'm = %d, n = %d\n' "$m" "$n"
done
这会产生
m = 1, n = 2
m = 1, n = 2
m = 1, n = 0
m = 0, n = 0
Too many commas: "0,0,0"
ksh93
当在(或bash
或)下运行时zsh
。
在前面设置IFS
一个空格和一个逗号read
会使这两个字符(或多个字符)read
的内容分开。$a
剩余数据分配给m
和n
。
如果字符串类似于"2,3 4"
,n
则将被分配该值3 4
。
另请注意,在输出的第三行(解析"1,"
)中,m
仅显示为零,因为我们将%d
格式说明符与 一起使用printf
。如果解释为字符串,则该变量m
为空。