我有一个文件(FreshPIN.txt),每行包含大量的密码;我需要一个bash脚本来选择其中一个引脚,将其打印出来,然后将其从源文件中删除,将其添加到另一个文件的末尾(usedPIN.txt)。
FreshpPIN.txt就像:
========
1111111111111111
2222222222222222
3333333333333333
....
nnnnnnnnnnnnnnnn
========
在打印之前,我应该被要求输入0到31之间的数字并将数字放在下面的命令中:
at&g**00**=xtd*788*1111111111111111#
上面示例中的 at&g
和=xtd*788*
应该在所有输出命令中都是稳定的。
答案 0 :(得分:0)
fresh=FreshPIN.txt
used=usedPin.txt
echo "Please key in"
read key
pin=`head -1 "$fresh"`
printf '%s\n' "$pin" >>"$used"
sed -i~ 1d "$fresh"
printf 'at&g%s=xtd*788*%s\n' "$key" "$pin"
答案 1 :(得分:0)
这个怎么样?
#!/bin/bash
fresh=FreshpPIN.txt
used=usedPIN.txt
max=31
die() {
echo >&2 "$@"
exit 1
}
# Get a random pin
pin=$(sed -n '/[[:digit:]]\+/p' -- "$fresh" | shuf -n1)
[[ "$pin" ]] || die "No more pins in file \`$fresh'"
echo "Pin chosen: $pin"
# Prompt user:
while read -e -r -p "Enter a number between 0 and $max (q to quit): " n; do
if [[ "$n" = q ]]; then
echo "Aborting. Pin $pin remains in file \`$fresh'."
exit 0
elif [[ "$n" != +([[:digit:]]) ]]; then
echo "Not a valid number. Try again."
elif ((10#$n>max)); then
echo "Number must be between 0 and $max. Try again."
else
break
fi
done
# Guard if read fails (e.g., if user presses Ctrl-D)
[[ "$n" ]] || die "Something went wrong."
# Delete this pin from file
ed -s -- "$fresh" <<EOF
/^$pin\$/d
wq
EOF
# Save pin in file
printf >> "$used" "%s\n" "$pin"
# Output:
printf "at&g**%02d**=xtd*788*%s\n" "$((10#$n))" "$pin"
它非常强大(用户必须真正输入0到31之间的数字,如果用户输入,例如09
),它就不会被搞砸。使用ed
删除文件FreshpPIN.txt
中的旧引脚:效率非常高(没有使用sed -i
的辅助文件或丑陋的东西)。整体上使用良好的bash练习。使用shuf
得到一个随机引脚(不需要计算行数并破解丑陋的东西以获得随机引脚)。 sed
用于仅选择文件FreshpPIN.txt
中的图钉,因此您可以将标题,评论等留在那里。