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

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

ただいまの
回答率

90.52%

  • bash

    645questions

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

2進数を10進数に変換するシェルスクリプト

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 735

mashro0314

score 5

今年からプログラマの研修を受けている者です。
研修の課題で出たbcコマンドを使わないで2進数を10進数に変換するシェルスクリプトを作成しているのですが、計算を行うくだりがまったくわからない状態です
2進数を10進数にする計算方法は理解できたのですが、それをスクリプトで実行させる方法が分かりません
どなたかヒントをお教えいただけないでしょうか...
シェルはbashを使っています

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

0

2進数を10進数にする計算方法は理解できたのですが、

Bashであれば、普通に数値計算が出来るので、理解されている計算方法の通り書けば良いかと思います。
また、筆算で効率の良い計算方法と、プログラミングでコンパクトに書ける計算方法が違う可能性もあります。

decimal=0
binary=10010101111

while [ "$binary" ]         #空で無い間ループ
do
    x=${binary:0:1}         #左端から1桁切り出して
    binary=${binary:1}
    let decimal=decimal*2+x #その桁を使って計算
done
echo $decimal


このファイルに対して、bash ファイル名と打てば良いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

「課題の答え(計算手順と文字列処理手順)は知っているけど『シェルスクリプトの書き方と実行方法』が分からない」という状況とお見受けしましたので、「シェルスクリプトを書いて実行確認するまで」をざっと示してみました。

エディタで書きたいのであればcatのヒアドキュメント部分を「viとかで書いて保存して」に読み替えればいいでしょう。

$ cat <<'EOF' > b2d
#!/bin/bash
if [ $# -ne 1 ]; then
  echo "Usage: $0 <bin>" 1>&2
  exit 1
fi
a=$1
b=0
c=1
while [ -n "$a" ]; do
  test "$a" = "${a%0}" && b=$((b+c))
  c=$((c*2))
  a=${a:0:-1}
done
echo $b
EOF
$ chmod +x b2d
$ ./b2d
Usage: ./b2d <bin>
$ echo $?
1
$ ./b2d 11010
26
$ echo $?
0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

それをスクリプトで実行させる方法が分かりません 

linex系であれば、作成された先頭ラインに #!/bin/sh を記述し、実効モードを設定して
「chmod 755 hoge.sh」として ./hoge.shで実行できます。(先頭はなくても動きますが一応)

または、 sh hoge.sh でも実行できます。
あとは、 . hoge.sh でも動きます。

b=10010101111
echo "obase=10; ibase=2; $b" | bc
a=0
i=${#b}
while [ $i -ne 0 ]; do
    r=${b:${#b}-${i}:1}
    i=$(( i - 1 ))
    a=$((a + 2 ** i * r))
done
echo $a

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-1

$x = "1010"
$y = 0

for ((i=0; i < 4; i++)); do
    if [$x >> 1 = 1] ; then $y = $y + (1 << $i)
done


これでいけるかな?
すいません、bash のシンタックスがうろ覚えでアレなのですが、
こんな感じだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    シェルスクリプトのことをシェルと呼びますか?

    UNIXの部屋 コマンド検索: シェルスクリプト 当ページ管理人のネット上・実社会での観測結果によると、「シェルスクリプト」を「シェル」と呼ぶ人のスキルは著しく低

  • 解決済

    zmvが見つからない

    ファイルのリネームをシェルスクリプトで行おうとしたのですが,エラーが発生してしまいました. ~/Desktop/hoge/hoge_fuga.jpgを~/Desktop/hoge

  • 受付中

    swift - Shell Script Invocation Error GroupによるPerm...

    全く謎なのですが下記のようなerrが出てビルド出来なくなりました 権限がないということだと推測されるのですが ディレクトリに777の権限を与えても状況は変わりません

  • 解決済

    シェルスクリプトはbashやzshによって書き方は変わりますか?

    いつもお世話になっております。 シェルスクリプトはbashやzshによって書き方は変わりますか? Macでfishというシェルを使っているのですが、便利だと思い実験用サーバ

  • 解決済

    GUIのライブラリについて

    以前、よくwin32 APIを使用してGUIを作っていたんですが、このライブラリはwindows に依存しています。 GUIなどのシェルは、OSに依存しているものなのでしょうか

  • 解決済

    shellscriptでpyenvの設定が上手くいかない

    環境: Debian/jessie #!/bin/bash # insatll pyenv echo '##### install pyenv #####' git clon

  • 受付中

    PHP smbclient について

    PHPにてファイルバックアップ機能を作っております。 内容としましては AサーバーにPHPを設置しAサーバーにあるファイルやSQLのバックアップファイルをBサーバーにコピー(も

  • 受付中

    perlスクリプト上から外部プログラムの呼び出し

    かなり以前より動かしているperlスクリプト群があるのですが、モジュールの動作の関係で、perlインタプリタを更新することになりました。 すると、今まで動作していたスクリプトの

同じタグがついた質問を見る

  • bash

    645questions

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