编写Bash脚本:根据指定长度从字典中输出随机单词
实现指定长度的随机字典单词脚本
问题解决核心:正确给awk传递参数
你之前用awk失败的原因是没掌握正确的传参方式,awk可以通过-v选项直接把shell变量传入,这样就能在awk脚本里使用命令行参数了。
完整脚本实现
#!/bin/bash # 校验参数数量 if [ $# -ne 1 ]; then echo "用法: $0 <单词长度>" exit 1 fi # 校验参数是否为正整数 if ! [[ "$1" =~ ^[1-9][0-9]*$ ]]; then echo "错误: 请传入正整数作为单词长度" exit 1 fi # 系统默认字典文件路径(多数Linux发行版通用) DICT="/usr/share/dict/words" # 检查字典文件是否存在 if [ ! -f "$DICT" ]; then echo "错误: 未找到字典文件,请修改DICT变量指定正确路径" exit 1 fi # 筛选指定长度单词并随机输出一个 awk -v target_len="$1" 'length($0) == target_len' "$DICT" | shuf -n 1
关键部分说明
- awk传参:
-v target_len="$1"把命令行第一个参数赋值给awk内部的target_len变量,之后在awk脚本里用length($0) == target_len判断每行单词的长度是否符合要求。 - 随机选择:用
shuf -n 1把筛选后的单词列表随机打乱,取第一行结果,实现随机输出。 - 参数校验:避免用户不传参、传非正整数的情况,同时检查字典文件是否存在,提升脚本健壮性。
替代方案(不用awk)
如果不想用awk,也可以用grep正则匹配指定长度的单词:
grep "^.\{$1\}$" "$DICT" | shuf -n 1
这里^.\{$1\}$表示匹配长度恰好为$1的行(^是行首,$是行尾,.\{N\}表示任意字符重复N次)。
内容的提问来源于stack exchange,提问作者coder for life
相关产品推荐
相关产品推荐

