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

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

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

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

Q&A

2回答

2611閲覧

bash:if文で16進数の数値を比較したい

mizokami

総合スコア0

bash

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

0グッド

1クリップ

投稿2020/08/28 08:53

実現したいこと:/proc/[pid]/mapsにあるプロセスの開始アドレスと終了アドレスと、標準入力したアドレスの比較し、プロセスの特定を行いたいと思っています。

script

#!/bin/bash
echo -n add:
read add #addressの入力

stadd=$(sudo awk -F " " '{ print $1 } ' /proc/[1-9]*/maps | awk -F "-" '{ print $1}')

if [$add -ge ${stadd} ]; then
echo "hit"
else
echo "no hit"
fi

### エラーメッセージ
コマンドが見つかりません
整数の式が予期されます

### 試したこと
変数の前に"0x"を書き足しましたが、結果”コマンドが見つかりませんという”エラーメッセージが返ってきます。

また、if文にコマンドの実行結果を反映するのは上記の書式で問題ないでしょうか。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

当方はFreeBSD環境ゆえ、/proc/[1-9]*/maps ではなくて、最後がmapですが
下記のようにしたら動作しましたよ。

#/usr/bin/bash echo -n add: read add #addressの入力 for stadd in $(awk -F " " '{ print ($1) } ' /proc/[1-9]*/map | awk -F "-" '{ printf "%d\n",$1}') do if [ ${add} -ge ${stadd} ]; then echo "hit" else echo "no hit" fi done

awkのprintf "%d\n",$1でmaps出力の16進数を10進数に変換してif文で比較できるようにする。
※if test では16進数の比較は出来ないのかな?

出力は下記です。

〜略〜
hit
hit
hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
no hit
hit
hit
hit
〜略〜

ご参考になればよいですが。


補足ですが使い物になるようにする第一歩は、
echo "hit ${add}"
だと思いますが・・・

投稿2020/08/28 14:44

編集2020/08/28 14:51
hana_yama_san

総合スコア923

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

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

mizokami

2020/08/29 05:27

解答いただきありがとうございます 上記のように書いて起動してみたところ、整数値はできました addにも16進数を入力する場合、"read add"の文に16進数を10進数に変換するようにすればいいのでしょうか?
hana_yama_san

2020/08/29 09:25

>>"read add"の文に16進数を10進数に変換 [user@host ~]$ add=0X7f [user@host ~]$ [user@host ~]$ [user@host ~]$ add=`printf "%d\n" $add` [user@host ~]$ [user@host ~]$ echo $add 127 [user@host ~]$ こういう感じで出来ますよね。
mizokami

2020/08/30 10:32

返信遅くなってしまい申し訳ございません。 ありがとうございます。
guest

0

一度に比較できるのは一つです。[ 3 -ge 2 ]みたいな。
echo $staddすると、staddには複数の語が入っているのが分かるかと思います。
それがエラーの原因です。[ 3 -ge 2 5 6 7 ]みたいな。

複数の語をどうしたいのでしょうか?

#追記

複数の値を1つずつaddと比較したいと考えています。

ということなので、処理をforで囲めば良いです。
for 変数 in 語の並び;do ~~;doneで並んだ語を1つずつ順番に変数に代入してループを回ります。

sh

1#!/bin/bash 2 3echo -n add: 4read add #addressの入力 5 6for stadd in $(sudo awk -F- '{print $1}' /proc/[1-9]*/maps) 7do 8if [$add -ge ${stadd} ]; then 9echo "hit" 10else 11echo "no hit" 12fi 13done

ただ、この処理に何か意味があるのでしょうか??

投稿2020/08/28 13:11

編集2020/08/29 08:23
otn

総合スコア84798

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

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

mizokami

2020/08/29 05:38

解答いただきありがとうございます。 7fc3a63fe000-7fc3a63fe100のアドレスを使用するプロセスの対し、入力したadd(入力したのが7fc3a63fe010だとして)をif文を使って開始アドレスとadd、終了アドレスとaddを比較したいと思っています。
otn

2020/08/29 06:28

↑は質問に元々書いてあることでは?
mizokami

2020/08/29 08:07

そうでした。 複数の値を1つずつaddと比較したいと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問