質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

2回答

181閲覧

if文の書き方とロジック

teaAI

総合スコア36

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

1クリップ

投稿2019/08/31 04:15

編集2019/08/31 04:44

下記のようなシェルスクリプトがあり、テストデータを生成しようとしています。

・欲しいデータとして、0から始まる3ケタの1~10の文字列を含んだデータを生成しています。

そこで,
条件分岐として下記のように記述しましたが、他にシンプルな書き方はもっとできますでしょうか?
すごく単純なロジックですが、ご教示願いたいです。

※条件
[使用する変数名]
・TMP_CODE
・CODE
[現ソースのデータ整形条件]
TMP_CODE == 0の時 **"001"**と表示
TMP_CODE < 10の時 **"00N"**と表示
TMP_CODE == 10の時 **"010"**と表示

bash

1#!/bin/bash 2# $1 = output row 3 4echo $1 | 5 awk '{ 6 for(i=0; i<$1; i++){ 7 TMP_CODE = int(rand()*11) 8 CODE = TMP_CODE==0?"001":"00"TMP_CODE 9 if(TMP_CODE == 10){ 10 CODE = "0"TMP_CODE 11 } 12 print CODE 13 } 14 }'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

scsi

2019/08/31 04:32

コピペしたけど動かないですね。
guest

回答2

0

表示したいのは001から010で、001と表示されるのを他の数字の2倍の確率にしたいということですよね。

Bash

1for((i=0; i<$1; i++)) 2do printf "%03d\n" $((RANDOM%11%10+1)) 3done

乱数は%で簡易的にしているので、大きな数字の確率が少し少ないです。

投稿2019/08/31 05:05

otn

総合スコア84557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

scsi

2019/08/31 05:07

この書き方 知らなかった。。。 for((i=0; i<$1; i++)) 勉強になります!
guest

0

こんな感じでどうでしょうか。

#!/bin/bash for x in $(seq 1 $1) do printf "%03d\n" "$(($RANDOM%11))" done # ./a.sh 5 002 005 002 000 010

if いらないです!

投稿2019/08/31 04:37

編集2019/08/31 04:39
scsi

総合スコア2840

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nomuken

2019/08/31 04:40

「TMP_CODE == 0の時 "001"と表示」の動作が入っていないように見えます。
teaAI

2019/08/31 04:48

コードの詳細ありがとうございます。そのようにも書けるんですね!!!! nomukenさんのコメントの通り、"001"と出す場合には三項演算子式 or if文が必要になりますよね。
scsi

2019/08/31 04:51

あ、ほんとだ
scsi

2019/08/31 04:53

#!/bin/bash for x in $(seq 1 $1) do printf "%03d\n" "$(($(($RANDOM%10))+1))" done
scsi

2019/08/31 04:55

これでやってることは同じかな。ちなみに質問は shell じゃなくて awk のifの書き方ですね。
nomuken

2019/08/31 04:59

その書き方だと、"001"の出現確率が当初と変わってしまう気がします。 当初コードの"001"の出現確率は約18%、その他は約9%です。 修正案だとすべて等しく10%になります。
scsi

2019/08/31 05:02

なるほど、確かに1が出る確率が違いますね。じゃ、if分用意しますか!
teaAI

2019/08/31 05:03

またまたコメントありがとうございます! おっしゃる通り、awk言語での書き方なんですね。そこの指摘までいただき大変感謝です!!!
teaAI

2019/09/01 01:34

こちら、$(($(($RANDOM%10))+1))の場合でも下記の確率にならないのでしょうか?? 0 = 約18% (RANDOM=0の場合とRADNOM値が10で割り切れる場合で0の確立は他の数の2倍??) 1~9 = 約9%
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問