Top > 検索結果
タグ「bash」の検索結果[16件](1/1)
bashで小数点を比較する方法
bashで小数点を比較する方法を紹介します。 1.問題点 小数点を比較したいのですが、下記の構文では期待する結果になりません。 #!/bin/bash A=0.1 B=0.2 if [ $A -gt $B ]; then echo "A > B" else echo "A <= B" fi 実行結果 ./test.sh ./test.sh: line 6: [: 0.1: 指数の表現を期待 A ということで、bashで小数点を比較する方法を紹介します。 2.bashで小数点を比較する bashで小数点を比較するには、echoとbcコマンドを組み合わせます。 #!/bin/bash A=0.1 B=0.2 if [ `echo "$A > $B" | bc` == 1 ]; then echo "A > B" else ... [続きを読む]bashの配列をjoinする方法
bashの配列をjoinする方法を紹介します。 1.問題点 bashで次のようなリストを作成しました。 #!/bin/bash declare -a list=("a" "b" "c") この配列変数listの各データをカンマで結合させて1つのデータにしたいのですが、方法がわかりません。 ということで、bashの配列をjoinする方法を紹介します。 2.bashの配列をjoinする bashの配列をjoinするには、IFSを利用します。 #!/bin/bash declare -a list=("a" "b" "c") result="$(IFS=","; echo "${list[*]}")" echo ${result} 実行結果 a,b,c IFSは区切り文字の環境変数です。bashの場合、空白文字が区切り文字として初期設定されています。 これを強制的に書き替えたあと、配列を... [続きを読む]bashのif文で正規表現を使用する方法
bashのif文で正規表現を使用する方法を紹介します。 1.問題点 #!/bin/bash foo=abc123efg 変数fooの中から"123"だけを取り出したいのですが、方法が分かりません。 ということで、bashのif文で正規表現を使用する方法を紹介します。 2.if文で正規表現を使用する if文で正規表現を使用するには次のようにします。 #!/bin/bash foo=abc123efg if [[ ${foo} =~ ^[a-z]+([0-9]+).*$ ]]; then echo ${BASH_REMATCH[1]} fi 実行結果 123 ポイントは下記のとおりです。 if文はブラケット(大カッコ)を二重にする 演算子は"=~" 正規表現はクォーテーションで括らない(正規表現で特別扱いの文字がバックスラッシュでエスケープされるため) 後方参照(カッコで囲った... [続きを読む]Bashで変数を大文字または小文字に変換する方法
Bashで変数を大文字または小文字に変換する方法を紹介します。 1.問題点 bashで次のサンプルを作りました。 #!/bin/bash foo=ABC 変数fooの値をすべて小文字にしたいのですが、方法がわかりません。 ということで、Bashで変数を大文字または小文字に変換する方法を紹介します。 2.変数を大文字または小文字に変換する たとえば、大文字の変数をすべて小文字に変換するには次のように、変数の後ろにカンマを2つ記述します。 #!/bin/bash foo=ABC echo ${foo,,} 実行結果 abc 変換のパターンは次の6種類があります。 パターンフォーマットサンプル結果 1文字目を大文字${foo^}foo=abc; echo ${foo^}Abc すべてを大文字${foo^^}foo=abc; echo ${foo^^}ABC 1文字目を小文字${foo,}... [続きを読む]bashの変数をsplitして配列を作る方法
bashの変数をsplitして配列を作る方法を紹介します。 1.問題点 bashで次のような変数を作成しました。 #!/bin/bash foo=a,b,c,d,f,e,g この変数fooを","でsplit(分割)して配列変数に代入したいのですが、方法がわかりません。 ということで、bashの変数をsplitして配列を作る方法を紹介します。 2.bashの変数をsplitして配列を作る bashの変数をsplitして配列を作るには、文字列置換を利用します。 #!/bin/bash foo=a,b,c,d,f,e,g list=(${foo//,/ }) echo ${list[@]} echo ${list[1]} 実行結果 a b c d e f g b 3.文字列置換について 今回利用したbashの文字列置換のフォーマットは、 ${変数名/置換前文字列/置換後文字列} が基本... [続きを読む]bashで小数点を比較する方法
bashで小数点を比較する方法を紹介します。 1.問題点 以下のような小数点を比較するスクリプトを書きました。 #!/bin/sh foo=0.2 bar=0.3 if [ $foo > $bar ]; then echo "$foo is large." else echo "$bar is large." fi が、このスクリプトでは期待する動作にならず「0.2 is large.」と表示されます。 ということで、bashで小数点を比較する方法を紹介します。 2.bashで小数点を比較する bashで小数点を比較するには、小数点の比較をbcコマンドを使って評価します。 #!/bin/sh foo=0.2 bar=0.3 result=`echo "$foo > $bar" | bc` if [ $result -eq 1 ]; then ... [続きを読む]sedの正規表現で「\w」「\d」「\s」を実現する方法
sedの正規表現で「\w」「\d」「\s」を実現する方法を紹介します。 1.問題点 sedの正規表現では、Perlなどで使われる英数またはアンダーバーにマッチする「\w」や「\d」、あるいは空白にマッチする「\s」などのメタ文字を使うことができません。 たとえば次のスクリプトで変数dataから「123」という値を取得しようとしても、期待通りの結果になりません。 #!/bin/sh data="abc123def" result=`echo "$data" | sed -e "s/^.*\(\d\{3\}\).*$/\1/"` echo $result ということで、メタ文字と同じ効果を得られる方法を紹介します。 2.sedの正規表現で「\w」「\d」「\s」を使う sedの正規表現で「\w」「\d」「\s」などを実現するには、次の正規表現に置き換えます。 マッチ方法Perlsed 数字にマ... [続きを読む]一時ファイル作成が不要になる「プロセス置換」
LinuxやMacなどで一時ファイル作成が不要になる「プロセス置換」の使い方について紹介します。 1.はじめに 2つのファイルを比較するときには、通常diffを利用します。 % diff foo.txt bar.txt ですが、一方または両方のファイルを加工してから比較したい場合、次のようなことを行うことがあります。 % grep -v hoge foo.txt > foo2.txt % grep -v hoge bar.txt > bar2.txt % diff foo2.txt bar2.txt 具体的な例として、5月9日と5月10日のウェブサイトへのページ別アクセス数のログ(CSVファイル)があるとします(Google AnalyticsからダウンロードしたCSVとか)。 % cat 0509.log aaa.html,300 bbb.html,20 ccc.html,156 ddd... [続きを読む]bashでCGIを実行する
bashでCGIを実行する方法を紹介します。 1.はじめに LinuxサーバでCGIを実行する場合、PHP・Ruby・Java・Perlなどのプログラミング言語の利用が一般的と思いますが、bashでもCGIを実行できるかいろいろ調べてみました。 ということで、簡単なCGIの作成からクエリーの分析、URIデコードまでまとめて紹介します。 実際に利用する機会は少ないかもしれませんが、CGIの仕組みを知る上で役立つかもしれません。 2.簡単なCGI ブラウザからCGIにアクセスしてHTMLを表示する簡単なCGIから説明します。 test.cgiというファイル名で以下の内容を記述します。 #!/bin/sh echo "Content-Type: text/html" echo "" echo "<!doctype html>" echo "<html><head... [続きを読む]bashで「value too great for base」というエラーになる場合の対処
bashで「value too great for base」というエラーになる場合の対処方法を紹介します。 1.問題点 次の、2つの引数の合計を出力するスクリプト「test.sh」を実行します。 #!/bin/sh foo=$(( 8 + 1 )) echo ${foo} このスクリプトは正常に実行でき、結果として「9」が表示されます。 [~]$ ./test.sh 9 ところが、次のように「8」の先頭に「0」を付与して「08」とすると、「value too great for base」というエラーが発生します。 #!/bin/sh foo=$(( 08 + 1 )) echo ${foo} [~]$ ./test.sh ./test.sh: line 3: 08: value too great for base (error token is "08") 2.原因 bash... [続きを読む]bashのfor文のまとめ
bashのfor文のまとめです。 ネットで調べたところ、ケース別ですぐに使えそうなサンプルが並んでいるものがなかったので、このエントリーでまとめてみました。 認識違いがありましたどこかでつぶやいてください。 なお、サンプルでは変数のカーリーブレースやダブルクォーテーションは省略しています。適宜付与してください。 1.フォーマット bashのfor文のフォーマットは for 繰り返し条件 do # ... done となっています。 次のフォーマットでも書けます(以降、このフォーマットで解説)。 for 繰り返し条件; do # ... done 2.初期値・ループ条件・ループ時の処理で指定する 繰り返し条件の部分は一般的なfor文のお作法(初期値、ループ条件、ループ時の処理)が利用できます。 for ((初期値; ループ条件; ループ時の処理)); do # ...... [続きを読む]bashで演算を行う方法
bashで数値の足し算・引き算などの四則演算や、比較演算・論理演算などを行う方法を紹介します。 このエントリーはビギナーの方向けの内容です。 1.問題点 次のような変数の足し算の結果を出力するスクリプト(test.sh)を作りました。 #!/bin/sh foo=123 bar=456 hoge=$foo+$bar echo $hoge が、このスクリプトを実行すると次のような結果が出力されます。 [~]$ ./test.sh 123+456 次のように数値を直接計算する場合も同様の結果になります。 #!/bin/sh hoge=123+456 echo $hoge 2.算術式展開を使って演算を行う まず算術式展開「$(())」を使う例を紹介します。 1項のスクリプトについて、赤色の部分のように式全体を算術式展開で括ります。 #!/bin/sh foo=123 bar=456 ... [続きを読む]bashで引数に配列を設定する方法
bashで引数に配列を設定する方法を紹介します。 1.問題点 bashでは配列を引数として渡すことができません。 たとえば、次のように配列を関数fooのパラメータに渡すことはできません。 function foo() { local list=$1 for i in "${list[@]}"; do echo "${i}" done } hoge=( 'xxx' 'yyy' 'zzz' ) foo ${hoge[@]} 2.引数に配列を設定する 配列を設定することはできないので、配列の名前を引数で渡し、関数側では間接参照を使います。 function foo() { local arrayname=$1 eval ref=\"\${$arrayname[@]}\" local list=( ${ref} ) for... [続きを読む]bashで変数の値を変数名にする方法
bashで変数の値を変数名にする方法を紹介します。 1.bashの間接参照を利用する bashでは「!」を使って間接参照することで、変数の値を変数名として利用することができます。 #!/bin/sh foo=hoge bar=foo echo ${!bar} これを実行すれば hoge と出力されます。 ただしFreeBSDやSolarisではこのテクニックは使えないようです。 よって、プログラムを他のOSに移植する可能性がある場合は次項のテクニックを使った方がよいでしょう。 2.evalを使った間接参照を利用する evalは変数を評価した後、引数の文字列をコマンドとして実行する機能があります。 evalを利用した間接参照で、変数の値を変数名として利用することができます。 #!/bin/sh foo=hoge bar=foo eval echo \"\$$bar\" これを実行すれ... [続きを読む]bashで変数を正規表現で置換して変数に代入する方法
bashで変数を置換して変数に代入する方法を紹介します。 ネットで上記の方法を調べたのですが、bashの変数を正規表現の入力にしたりとか、置換結果を変数に代入する記事があまりみつからなかったので、このエントリーでまとめておきます。 ビギナーの方向けの内容です。文字列置換ではsedを前提とします。 1.問題点 例えば、 00012345 というテキストを含むファイル「foo.txt」から「12345」を抜き出したい場合、コマンドラインで次のように実行します。 #!/bin/sh sed -e "s/[0]*\(12345\)/\1/" foo.txt 上記の内容を「foo.sh」というファイルに保存して実行すると、標準出力に「12345」を出力します。 % ./foo.sh 12345 ですが、以下のことが分かりません。 テキストファイルではなく、bashの変数を入力にしたい 置換後... [続きを読む]bashで変数を簡単に制御するための演算子
bashで変数を簡単に制御するための演算子「:-」「:=」「:+」「:?」について紹介します。 1.基本 次のサンプルを実行すると、変数nameに設定した「foo」を出力します。 #!/bin/bash name=foo echo ${name} ですが、次のように変数nameに値が設定されていない場合、空の文字列が出力されてしまいます。 #!/bin/bash echo ${name} 出力する前に、次のようにif文で空の判定をすれば代替文字列を出力するといった制御が可能です(if文で変数nameをダブルクォーテーションで括っているのは、変数nameがnullの場合を考慮しているためです)。 if [ "${name}" != "" ]; then echo ${name} else echo foo fi が、bashではより簡単に制御するための演算子が用意されています... [続きを読む]
1