ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:bashにおける $[算術式] とは?) bashの算術式とは? 2014/09/26 14:20 このQ&Aのポイント bashの算術式について調べてみました。bashでループ変数をインクリメントする方法についてまとめてみました。$[count+1]の角括弧の意味について解説します。 bashにおける $[算術式] とは? ShellShock脆弱性で世間を騒がせているbashについて教えてください。 * 質問内容は脆弱性とは関係ありません :) 下記のコードは1から5までカウントする単純なwhileループです。 #!/bin/bash count=1 while [ "$count" -le 5 ]; do echo $count count=$[count+1] # ループ変数をインクリメント done ループ変数をインクリメントする書き方は色々ありますが、上記のような書き方は初めて見ました。 この $[count+1] の角括弧は何なのでしょうか? インタプリタシェルをdashにするとエラーになるので、bash特有の記述だとは思うのですが・・・ よろしくお願いします。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (1) 専門家の回答 質問者が選んだベストアンサー ベストアンサー Tacosan ベストアンサー率23% (3656/15482) 2014/09/26 15:19 回答No.1 ちょろっと検索した. 参考URL: http://wiki.bash-hackers.org/syntax/expansion/arith 質問者 お礼 2014/09/26 15:44 Tacosanさん 回答ありがとうございます。 算術展開のdeprecatedな書式だったのですね。 通報する ありがとう 0 カテゴリ [技術者向] コンピューターOS(技術者向け)Linux系OS 関連するQ&A 【シェルスクリプト】 ローカル変数、グローバル変数 シェルスクリプトのローカル変数、グローバル変数の取り扱いで迷っています。 ---------------- #!/bin/bash count=0 cat file | while read i do count=`expre $count + 1 ` done echo $count ---------------- fileの中身をcatで流して、それを一行ずつ読み込みます。 そのつど、count の値を増やしていくようにしたいのですが、最後の出力値は0となります。 cat→whileで読み込ませて処理している間はローカル変数として扱われているのでしょうか。 またそうであるならば、シェルスクリプトでグローバル変数を明示的に宣言するにはどうのようにすればいいのでしょうか。 シェルスクリプト while文のシェルスクリプトでエラーが出て困っています。 どうすればいいでしょうか? 回答の程宜しくお願い致します。 #!/bin/bash count=1 while[$count -le 5] do touch "y$count" ls -l "y$count" coun ='expr $count+1' done [root@Linux root]# . makefile bash: while[1 -le 5]: command not found bash: makefile: line 4: syntax error near unexpected token `do' bash: makefile: line 4: `do' 変数の引き継ぎ(bash) bashで開発をしているのですが、 メインの変数より子シェルの変数に引き継ぎをしたいのですが、 どうすればいいのでしょうか。 test.sh #!/bin/bash # 外部変数 sub_test() { echo $1 } # メイン sub_test # test.sh AAA シェルを実行すると、AAAという文字が出てきません。 宜しくお願いします。 ループ文のカウント Linuxの初心者です。bash内の基本的なループ文で困っています。 データベースのバックアップを取る為に、 例えば"000001"から"000020"までの数字を文字列で 取りたいだけなのですが、6桁の0で埋める構文が分りません。 基本的な事ですみませんが、教えてください。 #!/bin/bash COUNT=000001 DBMAX=000020 while [ $COUNT -le $DBMAX ] do DBNAME="hoge"$COUNT セット文 count=`expr $COUNT + 1` done bashスクリプトでの配列参照 bashスクリプトでの質問です。 配列を、ループ文で順に参照しようとしているのですが、 要素を変数で記述すると、うまく参照できなく困っております。 ---------------------------------------------- i=0 j=10 while $i -le $j do echo "${hoge[$i]} ${huga[$i]}" i=`expr $i + 1` done ----------------------------------------------- こんな感じの、スクリプトなのです。 要素を直接記述すると、ちゃんと中身を参照することができました。 やりたいことは、二つの配列の同じ要素の中身を、連結して表示するといったものです。 ご教授よろしくお願いします。 シェルスクリプト:while文のリダイレクトはサブシェルで実行されますか 日頃Linuxを使用している者です。手元にSolaris環境がなく検証できないためSolaris使いの方にお伺いさせてください。 お聞かせいただきたいことは次の一点です。 Q. Solaris8,9,10 のBourneShellは従来どおり、while文でリダイレクトを使ったときは、サブシェルでまわりますか? 上記質問に至った簡単な経緯を申し上げます。 実は、Linuxの/bin/ash(BourneShell相当)スクリプトで while文でリダイレクトしたところ、ループ内の変数がwhileの外でも参照できました。本来BourneShellの場合、当ケースでのループはサブシェルで回るはずですよね。 最近のGNU BASHを始め、ASHもfor,whileのりダイレクトを使ったループもカレントシェルで動作するということでしょうか? そこで、SolarisのSHはどうなのかと思った次第です。以上宜しくお願いします。 p.s. HP-UX, AIXのSHについても情報があればありがたいです。 参考までに、Linux上の実例を記します。 ■test.ash #!/bin/ash n=0 while read line do i=`expr $i + 1` echo "$i: $line" done < $0 echo "total line= $i" ■実験してみる > ./test.ash 1: #!/bin/ash 2: 3: i=0 4: while read line 5: do 6: i=`expr $i + 1` 7: echo "$i: $line" 8: done < $0 9: echo "total line= $i" total line= 9 ← しっかりインクリメントされた変数見れてるし。最近の仕様? Kシェルが動作しない。 Kシェルが動作しない。 以下シェル自体ですが、単体では動作するのですが、メインのシェルから呼び出すと動作しなくなります。 動作しない条件としては、子シェルがメインシェルのwhile文の中に入れていると無限ループ???してしまいます。(for文やそれ以外では動作します。) なにかご存知でしたら、ご教授願います。 ・子シェル(Yes or Noを入力するまで無限ループする) #!/bin/ksh answer= echo "Do you add xxxx ? ---> [y/n]\c" while : do if [ "`echo -n`" = "-n" ]; then echo "$@\c" else echo -n "\@" fi read answer case "${answer}" in [yY] | yes | YES | Yes ) return 0 ;; [nN] | no | NO | No ) return 1 ;; * ) echo "Please enter y or n." ;; esac done ・メインシェル #!/bin/ksh while read line do /xxx/子シェル.ksh done < /xxx/zzz.txt 分かりづらいかも知れませんが、ご容赦願います。 シェルスクリプトbashについての質問 シェルスクリプトbashについての質問 #!/bin/bash function QUIZ01() { echo "問題文" echo "(a)答えa(b)答えb(c)答えc" while echo -n "答えをa,b,cで入力してください:" read ANS do case $ANS in a) echo "正解" break;; b) echo "はずれ";; c) echo "はずれ";; *) echo "答えはa,b,cで入力";; esac done } function QUIZ02() { echo "問題文" echo "(d)答えd(e)答えe(f)答えf" while echo -n "答えをd,e,fで入力してください:" read ANS do case $ANS in d) echo "正解" break;; e) echo "はずれ";; f) echo "はずれ";; *) echo "答えはd,e,fで入力";; esac done } QUIZ01 QUIZ02 要件として トップ画面で選択肢 1.クイズ開始 2.アプリについて 3.アプリ終了 4.クイズ正解率 クイズを開始したら、 クイズは全5問で3問不正解でアプリを終了 問題の画面には現在の成果率が表示される 問題文は外部ファイルとする 問題の出現方法はランダムとして、問題は重複しない どうか教えてくださいお願いします 一行でdoループ debian wheezy で 一行でdoループをやろうとしたのですが、失敗します。 $ for i in {1..2} ; do ; pwd ; done bash: 予期しないトークン `;' 周辺に構文エラーがあります $ echo $SHELL /bin/bash $ echo $BASH_VERSION 4.2.37(1)-release なぜうまくいかないのでしょうか? 教えてください。 よろしくお願いします。 bashシェル: 引用符で囲まない文字列 bashシェルにおいて、パスを表す文字列を引用符で囲まないで変数に代入すると絶対パスに展開されて代入されます。 引用符で囲んで代入すると展開されませんので、「パスを変数に代入する時は引用符で囲まない」と覚えておけばよいように思いますが、「引用符で囲まない文字列はパスを表す」ということなのでしょうか。 (引用符で囲んだ場合) $ DIR="~/" $ echo $DIR ~/ (次のようにしてもディレクトリ下のファイル名を得られない) for FILE in ${DIR}* ; do echo ${FILE}; done (引用符で囲まない場合) $ DIR=~/ $ echo $DIR /home/taro/ 2014年9月23日 【シェル】while文の変数定義について OS:Solaris10 sh:Bシェル お世話になります。 シェルの冒頭で定義した変数をwhile文の中で読み込ませたいです。 現状のシェルは下記の通りです。 ---- #!/bin/sh # *** 変数定義 *** AAA1=Spring BBB1=Summer AAA2=Autumn BBB2=Winter # *** メイン処理 *** i=1 while [ $i -le 2 ]; do AAA=AAA$i BBB=BBB$i echo ${AAA} echo ${BBB} i=`expr $i + 1` done ---- しかし、出力される結果は下記のようになってしまいます。 AAA1 BBB1 AAA2 BBB2 これを冒頭の「*** 変数定義 ***」で定義した値を読み込ませ、下記のような出力結果を得たいです。 Spring Summer Autumn Winter どうかご教授ください。 Bシェルで配列を使いたいのですが・・・ 下記のBシェルファイルで、あるテキストファイルの内容を1行ずつ読み込んで、その行を変数に代入し、後続にてその変数を表示するという処理を実現したいのですが、うまくいきません。 どのようにすればうまく行くのかまた、何故うまくいかなかったのかをご教授頂ければと思っております。 宜しくお願い致します。 <Bシェルファイル> #!/bin/sh exec 3<&0 < TBL.txt count=0 while read line do ex$count=$line count=`expr $count + 1` done exec 0<&3 3<&- echo ${ex[1]} exit 0 <結果> aho.sh: ex0=A コマンドが見つかりません。 aho.sh: ex1=B コマンドが見つかりません。 aho.sh: ex2=C コマンドが見つかりません。 aho.sh: 置換が正しくありません bashシェルスクリプトで変数を使う bashシェルスクリプト内で変数を使いたいです。 Linux内の設定ファイルを参考に、 ・変数名=その内容、で設定 ・${変数名} 、で呼び出す だと判断し、以下のように使っています。 #!/bin/bash WORK=/home/aaa/ cd ${WORK} その後検索したところ、 「呼び出すには、$変数名 のように記述する」との説明を見かけ、 実際$の後に変数名を付けるだけでも認識したのですが、 { }は付けても付けなくてもよいのでしょうか。 { }が必要な場合もあるのでしょうか。 bashシェルスクリプトで空白がある場合のコマンドは変数にどう記述したらいいのでしょうか? bashのシェルスクリプトで #!/bin/bash -x CMD=/bin/service portmap restart;/bin/service nfslock restart;/bin/service nfs restart $CMD としたのですが2行目で既にコマンドが実行されてしまいます。 空白がある場合のコマンドは変数にどう記述したらいいのでしょうか? bashで変数にパイプを入れ、コマンドとして使う? パイプを含む文字列が入った変数をシェルコマンドとして実行する方法がありましたら 教えてください。 Linux環境で、bashを使って定期的にモニタリングするスクリプトを書こうとしています。 スクリプトの引数で実行するモニタリングコマンドを変えれるようにしたいのですが、 パイプが入っているとうまくいきません。 下記のようなスクリプトで、引数に "ps -ef | grep pty" と入れたら、定期的に そのようなコマンドを実行できるようにできますでしょうか? (引数指定時に、きちんとクォーテーションで全体を囲んで、パイプが評価されない ようにしてもダメでした。) 変数として入ったコマンドを実行するときに、パイプがシングルクォーテーションで 囲まれて "ps -ef '|' grep pty" のようになってしまい、パイプとして実行時に認識 されないようです。 bashシェルで設けてる制約でしょうか?回避策などありますでしょうか? <<スクリプト poll.sh>> ## # Defs export RUNCMD='finger' export INTERVAL=10 ## # Getopt while getopts "t:" OPT; do case ${OPT} in t) INTERVAL=${OPTARG};; esac done shift $((OPTIND-1)) [ ${#} -gt 0 ] && RUNCMD="${*}" ## # Main part while :; do (set -x; ${RUNCMD}; sleep ${INTERVAL}); done [bash]複数の条件の結合 こんにちは。 以下のシェルスクリプトを作りたいのですが、どうすればいいのでしょうか? (1)$a、$bが自然数ならば$b<$cである限り処理を続ける。 while [ "$b" -le "$c" ] do ~ b=`expr $b + $a` done (2)$a、$bが自然数でなければ、エラーメッセージを返し、処理を終了する。 if ~ echo ~ fi (1)と(2)をどのように結合するのかが分かりません。 ご回答お待ちしております。 OS X bash実行ファイルからexport Mac OS X 10.6でbashシェルスクリプトに実行権限を与えて使います。 この中のexportが環境変数に反映されないのは何故でしょう? 以下実行ファイル(do.sh*)の中味です: #!/bin/sh KankyoHensu=Foo export KankyoHensu echo $KankyoHensu $source do.sh を行なうとちゃんとKankyoHensuが設定されますが、 $do.sh では設定されません。echoの方は予定通り動きます。 どなたか、よろしくお願い致します。 シェルスクリプトのコマンド グループ化における変数の有効範囲について教 シェルスクリプトのコマンド グループ化における変数の有効範囲について教えてください。 中括弧"{ }"を使うと親プロセス(=その実行中のプロセス)にて実行、 小括弧"( )"を使うとサブシェル(=子プロセス)にて実行されると認識しています。 また環境変数は子プロセスに引き継がれ、シェル変数は引き継がれないと認識しています。 以下のシェルスクリプト(Bシェル)でテストしたところ、続くような結果となりました。 ~スクリプト内容~ #!/bin/sh ##TEST1 VAR01=AAA { echo 中括弧内でVAR01は${VAR01}; } ( echo 小括弧内でVAR01は${VAR01}; ) ##TEST2 { VAR02=BBB; echo 中括弧内でVAR02は${VAR02}; } echo 外でVAR02は${VAR02} ##TEST3 ( VAR03=CCC; echo 小括弧内でVAR03は${VAR03}; ) echo 外でVAR03は${VAR03} ~実行結果~ 中括弧内でVAR01はAAA 小括弧内でVAR01はAAA 中括弧内でVAR02はBBB 外でVAR02はBBB 小括弧内でVAR03はCCC 外でVAR03は VAR02、VAR03の結果は納得できます。 またVAR01が{ }に引き継がれているのも納得できました。 しかし、VAR01はシェル変数として作成した(exportによる環境変数化はしていない)にも関わらず、子プロセスである( )内処理にも引き継がれているのはなぜなのでしょうか? 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 シェルスクリプトbashについての質問 #!/bin/bash # トップ画面 function TOPVIEW() { echo "1)クイズ開始" echo "2)このアプリを終了" echo "3)アプリについて" echo "4)クイズ正解率" while echo -n "1,2,3,4を選択してください:" read ANS do case $ANS in 1) echo "正解" break;; 2) echo "終了します";; 3) echo "クイズアプリです";; 4) echo "正解率は";; *) echo "答えは1,2,3,4で入力";; esac done } # 問題作成 function QUIZ01() { echo "問題文" echo "(a)答えa(b)答えb(c)答えc" while echo -n "答えをa,b,cで入力してください:" read ANS do case $ANS in a) echo "正解" break;; b) echo "はずれ";; c) echo "はずれ";; *) echo "答えはa,b,cで入力";; esac done } function QUIZ02() { echo "問題文" echo "(d)答えd(e)答えe(f)答えf" while echo -n "答えをd,e,fで入力してください:" read ANS do case $ANS in d) echo "正解" break;; e) echo "はずれ";; f) echo "はずれ";; *) echo "答えはd,e,fで入力";; esac done } 最初の選択でクイズ開始を選択すると問題文に移行、、 終了を選択すると終了できるようにしたいのですが、 設定がわかりません どなたか教えてください お願いします 注目のQ&A 「前置詞」が入った曲といえば? 恋愛相談です 株とFX コロナワクチンについて 子供を持たないとか (多様性?) 天動説、地動説・・でその後が無いのは? ブルーレイディスクの使い方がわからない。 なぜ昔の家はカーポートじゃなく車庫が多い? 食べ残った食べ物を容器に入れて持ち帰りたい時の言葉 何事もうまくいかない人生について カテゴリ [技術者向] コンピューター OS(技術者向け) Windows系OSLinux系OSBSD系OSSolaris系OSiOS(技術者向け)Android OS(技術者向け)その他(OS) カテゴリ一覧を見る あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど
お礼
Tacosanさん 回答ありがとうございます。 算術展開のdeprecatedな書式だったのですね。