シェルスクリプトで if 文

シェルスクリプトで if 文
シェルスクリプトのif 文について
#10 if文で条件分岐をしてみよう (1)
http://dotinstall.com/lessons/basic_shellscript/10610
を参考に学習
PHP JavaScript などと違い
if(){}
というかきかたをシェルスクリプトではしない
構文は
if [ 条件 ] ;
then
行う処理
fi
というかき方をする
スコープがないため
fi で if のスコープの終わりを意味するようになる
[ ] は test コマンドの代わり
このため [ ] の前後には
スペースを開けること
つまり
x=70
if test $x -gt 60
then
echo “OK”
fi

x=70
if [ $x -gt 60 ]
then
echo “OK”
fi
は同じ
ちなみに、
-gt はより大きいという意味

文字列、ファイル、論理演算子を使った条件式

文字列、ファイル、論理演算子を使った条件式
#09 条件式を評価してみよう (2)
http://dotinstall.com/lessons/basic_shellscript/10609
を参考に
文字列、ファイル、論理演算子を使った条件式
を学習
数値での比較の場合は
-eq とか -ne
文字列の場合は
= で等しい
!= で等しくない
というように、java script などのプログラムと変わらない
次にファイルの比較
-nt
2つのファイルを比較して、どちらが新しいか比較する
-ot
2つのファイルを比較して、どちらが古いか比較する
-e
ファイルが存在するか
-d
ディレクトリなのか判定
ということで、ファイルが存在しているか調べるには
test -e ファイル名 ; echo $?
とすれば、ファイルが存在するなら0
そうでないなら1が返ってくる
例えば
test -e hello.sh ; echo $?
echo $? で0か1を表示している
そして、これらを組み合わせる論理演算しも
シェルスクリプトに存在する
-a
AND
-o
OR
!
NOT
となる
これらを使った例として
1と1が等しく、かつ 2と2 がひとしい
これを書くと
test 1 -eq 1 -a 2 -eq 2 ; echo $?
となる
これは
(1 ==1)&&(2==2)
と同じ意味になる
結果は正常終了なので

になる

シェルスクリプトの条件式

シェルスクリプトの条件式
#08 条件式を評価してみよう (1)
http://dotinstall.com/lessons/basic_shellscript/10608
を参考に
シェルスクリプトの条件式について学習
Linux では正常終了したかどうか評価することがおおい
正常終了は0になるので
0であるかどうか調べたり、比較したりすることになる
評価するコマンドは
test コマンド
これについては
【 test 】 条件式の真偽を判定する
も参考に
例えば、数値評価で
1と2が等しいか評価するには
test 1 -eq 2 ; echo $?
とする
-eq は等しいか?
という意味の条件式
$? は
直前に行った命令が正常終了したかどうか返す
正常終了なら0
そうでないなら1
となる
test 1 -eq 2 ; echo $?
は等しくないので

となる
test 1 -eq 1 ; echo $?
なら等しいので

となる
比較している条件の意味は
-eq
等しいか調べる
== と同じ
-ne
等しくない
!= とおなじ
-gt
~より大きい
< とおなじ -ge ~以上 <= と同じ -lt ~より小さい >とおなじ
-le
~以下
>= と同じ
これらの条件式を使うことで
if
while
case
for
などの処理ができる

コマンドの結果を配列として扱うには

コマンドの結果を配列として扱うには
#07 配列を使ってみよう (2)
http://dotinstall.com/lessons/basic_shellscript/10607
を参考に
配列要素の操作と
コマンドの実行結果を配列で扱う方法を学習
a=(2 4 6)

プログラム中で
6ではなく10に修正するには
a[2]=10
でOK
代入するときには
$a とはせず、そのままa[2] だけでOK
これで
echo ${a[@]}
で表示すると
2 4 6
から
2 4 10
へ変更されている
変更はこれでOKなので
次に要素の追加
これは
+=
で追加していく
a+=(20 30)
として
echo ${a[@]}
で表示すると
2 4 10 20 30
というように、最後のほうへ追加されているのがわかる
そして、次にコマンドの実行結果を配列として扱う方法
まず、変数に date の結果を代入
“ で囲むことで、date の実行結果が返ってくるので
これを変数に格納する
ちなみに、date の結果はスペースで区切られる
d=(`date`)
これを表示するには
echo ${d[3]}
とする
通常、date を実行すると
2013年 6月 5日 水曜日 21:01:36 JST
これを配列3、つまり
スペースで区切った4番目になるので
水曜日
と表示される

シェルスクリプトでの配列

シェルスクリプトでの配列
#06 配列を使ってみよう (1)
http://dotinstall.com/lessons/basic_shellscript/10606
を参考に
シェルスクリプトでの配列で
各要素へのアクセスについて学習
まず
a=(2 4 6)
で配列作成
java script とか PHP のときとは違って
, で区切らず、スペースなので注意
これに
echo $a
とすると、先頭要素つまり2になる
もし、2番目の4を出したいのなら
echo ${a[1]}
というようにする
配列は
シェルスクリプトの場合でも
Java script の場合でも同じで
0から数える
このため、2番目は1となる
配列の数字をつけるときには
{} で変数を囲むのを忘れずに
つけずに
echo $a[1]
とすると
2[1]
と表示される
番号で指定するのではなく、
すべての要素を対象にするなら
@を使う
echo ${a[@]}
とすれば
2,4,6 が表示される
要素の数を取得したいのなら
echo ${#a[@]}
とすると
3つ格納されているので

と表示される

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

シェルスクリプトでの四則演算
足し引き割に関しては
“で囲んで
expr の後に計算式をかけばOK
例えば
x=10
#足し算
echo `expr $x + 10`
#引き算
echo `expr $x – 5`
#割り算
echo `expr $x / 5`
とすれば
20
5
2
となる
注意するのは掛け算
• はワイルドカード扱いのため
\* というようにする
#掛け算 \* でないとエラー
echo `expr $x \* 10`
これで100になる
また、四則演算で()を用いて優先順位を
つけるときにも
() は \( \) というようにしないとエラーになるので注意
#四則演算の優先順位指定
echo `expr \( $x + 5 \) \* 2`
とすると
(10+5)*2 となり30になる
この\( と \) についても、
前後にスペースを開けないと違う結果になってしまうので注意
echo `expr \($x + 5 \) \* 2`
とすると
expr: 整数でない引数
になってしまう
あと、シェルスクリプトの場合、
変数宣言のときに
readonly をつけることで
値に代入できなくすることで
ファイルパスが変更されたりすることを防ぐことができる
#読み込み専用変数
readonly FILE_NAME=”hello.sh”
とした後で
FILE_NAME=”test.sh”
として実行すると
./enzan.sh: 行 23: FILE_NAME: 読み取り専用の変数です
というようにエラーがでて書き込めないのが確認できる

シェルスクリプトで数値演算

シェルスクリプトで数値演算
スクリプトで計算する時
x=10
echo $x
だと10になる
しかし
echo $x-2
とすると
8ではなく 10-2 となってしまう
このため、計算するときは
バッククオートを使う
Shift + @ で ` となるのでこれを使う
Shift + 7 の ’ と似ているので注意
これでかこむと
“で囲んだ中の式を評価して結果を返すようになる
なので、計算するコマンド expr を使って式を汲み立てる
expr は計算する Linux コマンド
詳しくは
【 expr 】 整数計算を行う
を参考
あと、expr の四則演算の記号の前後に
空白を入れないとエラーになる
今回なら
echo `expr $x – 2`
となる
これで
8 と表示されるようになる

シェルスクリプト基礎

シェルスクリプト基礎
#03 変数を使ってみよう
http://dotinstall.com/lessons/basic_shellscript/10603
を参考に
シェルスクリプトの変数について学習
シェルスクリプトでよく見る
exit 0
は正常終了という意味
シェルスクリプトの変数を使うときの注意点として
代入する時に
a=”hello”
というようにするときに、
=の前後にスペースをいれないこと
a = “hellow”
とかはダメ
作成した変数を使う時には
$a
というように
$をつけてつかう
ちなみに、echo とかで出力するときに
文字列なら
echo “$a”
というようにする
あと、他の変数と混ざらないように変数を
${a}
というようにすることもできる
意味は変わらない
echo で表示するなら
echo “${a}”
あと、よくある文字列の連結
PHPでは . でくっつけて
JavaScript では + で連結
で、シェルスクリプトの場合は
$a$a
というようにそのまま変数をくっつけるだけでOK
スペースを開けるときには
JavaScript では +” “+
としたけど
シェルスクリプトでは
“$a $a”
というように、スペースをあけるだけでOK
また、シェルスクリプトの文字列表現には
“”
’’
と2種類あり
” でかこんだ場合には、文字列の中身は展開されない
試しに
test.shを作成して
#!/bin/bash
a=”hello”
echo $a
echo “$a”
echo “${a}”
echo $a$a
echo “$a $a”
echo ‘$a’
として保存
chmod +x test.sh

./test.sh
を実行すると
hello
hello
hello
hellohello
hello hello
$a
となるのが確認できる

SQLite のデータのバックアップと復元

SQLite のデータのバックアップと復元
#18 データのバックアップ・復元
http://dotinstall.com/lessons/basic_sqlite/6418
を参考に
テーブル構造、データを外部ファイルに出力し
それを取り込む方法を学習
今回使用するのは
.dump
これはDBの内容をSQL文で出力する
バックアップを取るのに便利
テーブルだけバックアップするなら
.dump テーブル名
すべてのテーブルをバックアップするなら
テーブル名を指定せず
.dump
とすればOK
これらを直接ファイルに出力するには
出力先を変更する
出力先の設定確認は
.show
で行える
現在の設定は
echo: off
explain: off
headers: on
mode: list
nullvalue: “”
output: stdout
separator: “,”
stats: off
width:

出力先の設定部分は
output: stdout
になり、意味は画面表示
これを変更することで
ファイルに出力できるようになる
変更は
.output 出力するファイル名
今回は
.output data.dump
として
.dump data
と実行すると
data テーブルの中身が
SQL文でファイルに記述される
data.dump ファイルの中身を
cat data.dump で確認すると
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE data(name,score,team_text);
INSERT INTO “data” VALUES(‘hebereke’,1000,’A’);
INSERT INTO “data” VALUES(‘hiroshi’,400,’C’);
INSERT INTO “data” VALUES(‘tomonaga’,400,’B’);
COMMIT;
となっているのが確認できる
ちなみに、
.output の出力先を ファイルにした場合
.show などの結果もファイルに出力されてしまう
この変更は、一度
.exit で sqlite を抜けるか
もしくは
.output stdout
とすれば、元に戻る
ちなみに、ファイルに出力されたSQL文は
vim などで編集することが可能
変更後、再度読み込みしたいときには
.read
を使う
今回なら
.read data.dump
でOK
ただし、元のデータがあると、すでに存在していますという
エラーがでてしまうので、一度
drop table data;
.read data.dump
で読み込みする
SQL文にする使い道で一番大きいのは
カラムの編集
SQLite にはカラムを削除できないので
.dump で一度出力して
vim などでSQL文を修正し
失敗したテーブルを
drop table テーブル名
で削除
そして、テーブル作成のSQLを修正した dump ファイルを
.read で読み込んで修正というやりかたが使える

SQLite で外部ファイルからデータ読み込み

SQLite で外部ファイルからデータ読み込み
#17 外部ファイルからデータを取り込む
http://dotinstall.com/lessons/basic_sqlite/6417
を参考に、外部ファイルからデータの読み込みを学習
これにより、mysql で .sql ファイルからデータを
読み込んで実行するようなことができる
今回は、users.txt というテキストファイルに
データを記述
まず、vim でも gedit でもOKなので
データを書いて
users.txt というファイルで保存
中身は
taguchi,200
sasaki,400
yamashita,120
hebereke,800
また、新しいデータをとりこむため
練習テーブルも作成する
create table infile(name,score);
で infileテーブルと
name
score というカラムを作成
このテーブルに
users.txt の中身をいれるには
.import を使う
ただし、その前に区切り文字を指定しておく
デフォルトだと
データの区切り文字は | となっているけど
users.txt の中身のデータは , で区切ってあるので
これを変更する
現在の設定は
.show
でみることができる
ちなみに、現在は
echo: off
explain: off
headers: off
mode: list
nullvalue: “”
output: stdout
separator: “|”
stats: off
width:
これをみると、区切り文字を意味する
separator: “|”
となっているので、これを変更する
| から , に変更するには
.separator ,
とすればOK
.show
で確認すると
echo: off
explain: off
headers: off
mode: list
nullvalue: “”
output: stdout
separator: “,”
stats: off
width:
となり
separator: “,” に変更されている
この状態で
.import 読み込むファイル テーブル名
とすると
データを入れることができる
今回は users.txt を infile テーブルに入れるので
.import users.txt infile
select* from infile;
で確認すると
taguchi,200
sasaki,400
yamashita,120
hebereke,800
というように、反映されているのが確認できる
あと、設定で変更しておくと便利なのが
.header on
としておくと
デフォルトでは
select* from infile;
を実行すると
taguchi,200
sasaki,400
yamashita,120
hebereke,800
だけど
select* from infile;
name,score
taguchi,200
sasaki,400
yamashita,120
hebereke,800
というように、一番上にカラム名が表示されるようになる