1

我有一个文件(FreshPIN.txt),每行包含很多密码;我需要一个 bash 脚本来选择一个引脚,将其打印出来,然后将其从源文件中删除,将其添加到另一个文件的末尾(usedPIN.txt)。

FreshpPIN.txt 就像:

========
1111111111111111
2222222222222222
3333333333333333
....
nnnnnnnnnnnnnnnn
========

在它打印之前,我应该被要求输入一个从 0 到 31 的数字并将该数字放在下面的命令中:

at&g**00**=xtd*788*1111111111111111#

在上面的示例中at&g ,并且=xtd*788*在所有输出命令中都应该是稳定的。

4

2 回答 2

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,因此您可以将标题、评论等留在其中。

于 2013-01-01T12:09:30.493 回答
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"
于 2013-01-01T11:37:26.883 回答