• ベストアンサー

UNIXのシェルスクリプトで負数の正負を反転させるには?

UNIXのシェルスクリプトで負の数の符号を反転して生の数にしようと思ったらうまくできませんでした。 #! /bin/sh NUM=4 NUM2=-$NUM echo NUM2=$NUM2 とすると --4 となってしまいました。 また、 NUM2=`expr $NUM * (-1)` 等もやってみたのですが、エラーになりました。 結局、文字列としてawkで'-'を削ったのですが、やり方を間違えてる気がしてなりません。 awkやperl等を使わず、UNIXの単純な機能だけで数の正負を反転させる方法があれば教えてください。 基本情報でよくある2進数の符号の反転のやり方でもできると思うのですが、 10進数だとやり方がよくわかりません、、これでできるなら、このやり方も教えていただけるとありがたいです。 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • qaaq
  • ベストアンサー率36% (146/404)
回答No.3

実行例 a=-3 $ echo `expr \( $a \) \* 2` -6 $ echo `expr \( $a \) \* \-1` 3 FreeBSDの日本語マニュアルには、 >一般的には、負数となる可能性のある値は括弧で括ります とあります。 # 他のUNIXのマニュアルにはこのような具体的な記述が無い模様。 また、以下のエスケープが必要です。 "()"は、サブシェルと間違われないように「\(」,「\)」 "*"(乗算)は、ワイルドカード展開されないように 「\*」 "-1"は、オプションに間違わないように「\-1」としています。 2乗して平方根すると必ず正数になるのだが、exprには平方根がなかった。

参考URL:
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=expr&dir=jpman-5.4.0%2Fman&sect=0

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

let NUM2=-$NUM

  • yjous
  • ベストアンサー率60% (6/10)
回答No.1

NUM2=`expr $NUM \* \( -1 \)` では、どうですか?

関連するQ&A

  • linuxシェルスクリプトにつきまして

    linuxシェルスクリプトにつきまして 下記のシェルスクリプトがあります。 このうちの、 $num `expr 500 + $num` $num $num の部分がわからず、解説いただきたく、お手数をお掛けしますが、何卒よろしくお願いいたします。 #!/bin/sh num=1 while [ $num -le 100 ]; do printf "user%03d,%d,500,User %03d,/home/user%03d,/bin/bash\n" \ $num `expr 500 + $num` $num $num num=`expr $num + 1` done

  • シェルスクリプト内での四則演算

    非常に基本的な事だと思うのですが、どうしても解決できないので質問させてください。 シェルスクリプトで四則演算をしたいです。expr を使って下記の通りに書きました。 ---------------- #!/bin/sh echo $1 echo $2 AA='expr $1 + $2' echo "$AA" ---------------- これを test.sh として保存し、 $ sh test.sh 1 2 と試してみると、出力が ---------------- 1 2 expr $1 + $2 ---------------- となります。最後の行は 3 になってもらいたいのですが。 ちなみに、普通にコマンドプロンプトで $ expr 1 + 2 とやれば 3 と出てきます。 環境は Ubuntu 9.04 よろしくお願いします。

  • 簡単なシェルスクリプトを見てください。

    次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか?

  • シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのです

    シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか? 例えば、以下のようなtest.shというファイルを作ったとします。 --------------- #!/bin/sh AAA="x y" echo "" | awk '{print $AAA}' -------------- としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。) printの部分を ・awk '{print '$AAA'}' ・awk '{print "'$AAA'"}' などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか?

  • UNIXのシェル

    シェルに関して質問です。 0526とか0525のところは一日ごとにフォルダが作成されます。 unix\yasu\0526\hobby\test.txt unix\yasu\0526\hobby\test.txt unix\tomo\0525\hobby\test.txt unix\tomo\0525\hobby\test.txt ./check.sh MMDD 実行するときにMMDDのところに日付を入れてフォルダがあればコマンド1を実行するようにしたいです。 引数に指定した文字を判定するにはどうしたらいいのでしょうか? よろしくお願いします。 ----------------------------- #シェルの名前は「check.sh」です #! /bin/sh if [ $1 = "日付" ] ; then コマンド1 else コマンド2 fi -----------------------------

  • シェルスクリプトの1行目に#!を書いてもダメなのはなぜ?

    test.shというシェルスクリプトを #!/bin/bash echo "bash test" のように書き、chmod +x test.shを実行し、 test.shと入力すると、bash testが表示されるはずですが、 エラーbash: test.sh :command not found が出ます。which bashでパスを見ると /bin/bashなので、問題ないはずなんですが。 ちなみに、bash test.shと入力すると、正常に実行されます。 同様のことがperlスクリプト #!/usr/bin/perl print "perl test\n"; についても起こります。 何か設定がまずいのでしょうか? RedHatLinux7.2を使用しています。

  • ニフティでメールフォームを使用する方法

    ニフティの無料HPサービスでメールフォームを使いたいのですがsendmailが使えません。 以下の説明書きがありましたが、シェルスクリプトは知識がなく、ちょっと困っています。 シェルスクリプトでも可能なものなんでしょうか? ---------------------------------------------- perlについて perlのバージョンは5です。 (ただし、perl5での標準的なモジュールは使用できません) パスは、「/usr/local/bin/perl」となります。 スクリプトの1行目は「#!/usr/local/bin/perl」と記述してください。 シェルスクリプト(sh)について シェルスクリプト(sh)に関しては、以下のコマンドがご利用可能となっております。 awk, chmod, date, egrep, expr, grep, mkdir, rmdir, sh, cat, cp, echo, env, find, ls, mv, rm, sed なお、sendmailはご利用いただけません。 --------------------------------------------------

    • ベストアンサー
    • CGI
  • シェルスクリプト 引数の引渡しについて

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。

  • シェルスクリプトの問題で困っています!

    シェルスクリプトの問題を解いているのですが、いまいち分かっていないところが多いです… X 年からY 年までのカレンダーをファイル(cal-年.txt)に出力するシェルスクリプト(mkcal.sh)を 作成せよ。 実行書式./mkcal.sh x y [必須項目] 1. ファイル作成と同時にメッセージを出力し,作成したファイルが分かるようにすること。 出力例 ./mkcal.sh 2010 2012 Making cal-2010.txt Making cal-2011.txt Making cal-2012.txt 2. 作成しようとしているファイル(cal-XXXX.txt)が既に存在する場合には,エラーメッセージ File exists: cal-XXXX.txt を表示して,ファイルを作成しないこと。 出力例(cal-2011.txt が存在する場合) ./mkcal.sh 2010 2012 Making cal-2010.txt Making cal-2011.txt File exists: cal-2011.txt Making cal-2012.txt [自由項目] 1. mkcal.sh の引数を3 つ与えて実行すると,z 年飛ばしでカレンダーを出力すること。 実行書式./mkcal.sh x y z という問題に対し #!/bin/sh n=$1 while [ $n -le $2 ]; do echo "Making cal-$n.txt" /usr/bin/cal $n > cal-$n.txt n=`expr $n + 1` done #!/bin/sh n=$1 while [ $n –le $2 ]; do echo "Making cal-$n.txt" if [ -f "cal-$n.txt" ]; then echo "File exists: cal-$n.txt" else /usr/bin/cal $n > cal-$n.txt fi n=`expr $n + 1` done #!/bin/sh n=$1 while [ $n –le $2 ]; do echo "Making cal-$n.txt" if [ -f "cal-$n.txt" ]; then echo "File exists: cal-$n.txt" else /usr/bin/cal $n > cal-$n.txt fi n=`expr $n + $3` done とやっているのですが、どこで保存をすればいいか、そもそもの保存をするコマンドが分かっていない、これは合っているのか…と色々と問題点があります 誰か助けてください…お願い致します

  • Linuxのシェルスクリプトについて

    最近Linuxの使い方を勉強し始めたのですが シェルスクリプトについてわからないところがあるので教えてください。 カレンダーを出力するスクリプト #/bin/sh n=$1 while [ $n -le $2 ]; do echo "year $n" cal $n n=`expr $n + $3` done というcal.shという名前のスクリプトを作りました。 ./cal.sh x y z (x,yは年数、zは何年飛ばしで表示するかを指定する引数です) と実行すると問題なくカレンダーが表示されるのですが x,y,zの値に不適切な入力値がある場合や、引数の数が2つより少ない場合 使い方を示すメッセージを出力してプログラムを終了するようにしたいです どうすればいいのかわかりません。 本当に困っています。 親切な方のご回答をお待ちしています。