0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZを使用して変数を生成する簡単な方法

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZを使用して変数を生成する簡単な方法

スクリプトは、目的のために(この質問の範囲を超えて)bash変数を使用します。Q

Q=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

このスクリプトは、すべてのバイトが計算される環境で使用されるため、これは無駄です。しかし、いくつかの解決策は次のとおりです。

Q=0$(seq -s "" 9)$(echo {A..Z}|tr -d " ")

Cロケールの場合)もっと悪いです。このような単純なシーケンスを簡潔に生成する明白なトリックを見るには、私はあまりにも目が遠くなるでしょうか?

答え1

支柱の拡張が可能なすべてのシェルの場合:

使用printf:

$ printf %s {0..9} {A..Z}
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

-->

Q=$(printf %s {0..9} {A..Z})

代わりに、バックティックは$()バイトを格納します。特にBashでは、printf -v varprintfを変数に書き込むのが良いですが、バックティックよりも短くはありません。

printf -vQ %s {0..9} {A..Z}
Q=`printf %s {0..9} {A..Z}`

答え2

私が知っている最も簡単な方法は、bash次の方法を使用することです。

echo {0..9} {A..Z}|sed 's/ //g'

sed記号間のスペースを削除するために使用されます。括弧の間のスペースは重要です。そうしないと、0から9まで、AからZまでのすべての組み合わせが表示されます0A0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z1A1B1C...

次のようにコマンドを短くすることをお勧めします。

echo {0..9} {A..Z}|tr -d ' '

答え3

フレームワーク課題:いいえ

何らかの方法で既に作成したものを作成するよりもリソース集約的で効率的な方法は移植性が低下します(「シェルスクリプト」の代わりに「Bashスクリプト」を作成する必要があります)。

一般に、言語に関係なく、最良の形式の定数テーブルは、実行時にプログラムで生成されるのではなく、リテラル定数テーブルです。ハードコーディングがエラーが発生しやすいほど大きい場合は、プログラムを作成するとき、またはプログラムの「ビルド時間」の間にプログラムで生成し、出力を実際のプログラムにリテラル定数として含めます。

答え4

また、いいえただし、必ずこれを行う必要がある場合は、特別なシェル機能を必要とせず、一般化されるパターンは次のとおりです。

printf %b $(printf \\x%.2x $(seq 48 57) $(seq 65 90))

seqこのユーティリティを使用したくない場合は、ユーティリティをシェル関数として作成できます。

関連情報