如何在POSIX Shell中解析作为命令行参数传入的整数
实现方案
你最初的伪代码无法直接运行,是因为POSIX Shell的算术扩展仅支持数值运算,不能直接通过乘法生成重复字符串。以下是100%兼容POSIX标准的实现,无需依赖Bash等扩展Shell的特性:
完整脚本代码
#!/bin/sh # 校验是否传入参数 if [ $# -eq 0 ]; then echo "用法:$0 正整数1 正整数2 ..." >&2 exit 1 fi # 第一步:校验所有参数都是正整数,同时计算最大值用于生成分割线 max_num=0 for num in "$@"; do # 校验是否为正整数 if ! [ "$num" -gt 0 ] 2>/dev/null; then echo "错误:参数 '$num' 不是合法的正整数" >&2 exit 1 fi # 更新最大值 if [ "$num" -gt "$max_num" ]; then max_num="$num" fi done # 打印顶部的^符号 echo "^" # 第二步:遍历每个参数打印对应的星号行 for num in "$@"; do # 生成指定数量的* 字符串,纯内置循环实现,无需外部工具 star_str="" i=0 while [ "$i" -lt "$num" ]; do star_str="${star_str}* " i=$((i + 1)) done # 输出带前缀的行 echo "| $star_str" done # 第三步:生成分割线,长度匹配最长的输出行 printf '%*s\n' $((max_num * 2 + 2)) "" | tr ' ' '-'
关键逻辑说明
- 参数遍历:使用
"$@"遍历所有传入的命令行参数,而非$#($#仅代表参数的总个数) - 星号生成:采用纯Shell内置的循环拼接字符串,避免调用sed、tr等外部工具,兼容性和性能更好
- 自动适配:提前计算参数的最大值,分割线长度会自动适配输出内容,不会出现过长或过短的问题
- 异常处理:加入了参数合法性校验,避免非法输入导致脚本运行异常
运行效果
执行命令 ./script 3 4 1 5 即可得到你给出的示例输出:
^ | * * * | * * * * | * | * * * * * ------------
内容的提问来源于stack exchange,提问作者user14854027
相关产品推荐
相关产品推荐

