1

ファイル (FreshPIN.txt) には、各行に多くの PIN コードが含まれています。ピンの 1 つを選択して印刷し、ソース ファイルから削除して別のファイル (usedPIN.txt) の末尾に追加するには、bash スクリプトが必要です。

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 に答える