bashの使い方あれこれ。

bash tips(環境編)

参考資料。

ホームディレクトリに置かれる隠しファイル

これらの隠しファイルに環境設定用のコマンドなり記述しておけば、自動的に設定が行われる。

.bashrc
シェルが起動したときに実行される
.bash_profile
ログインする時に実行される
.bash_logout
ログアウトする時に実行される
.bash_history
コマンドの履歴が保存されるファイル

コマンドプロンプトの表示を変える

環境変数のPS1を変更すると、コマンドプロンプトに表示されるテキストを変更することができる。 .bashrcの適当なところに、以下のような一行を追加する。

PS1='[\u \t(\!) \w]\$ '

\uには現在のユーザー名、\tは時刻、\!はコマンドの番号、\wはカレントディレクトリを表す。 \$はrootなら#、それ以外のユーザーなら$に置き換わる。 例えば上記の例だと、下記のように表示される。

[root 15:08:08(1001) ~]# pwd
/root
[root 15:08:09(1002) ~]# cd /home/santamarta/
[root 15:08:15(1003) /home/santamarta]# su santamarta
[santamarta 15:08:20(415) ~]$ pwd
/home/santamarta
[santamarta 15:08:34(416) ~]$

一定時間操作が無い場合に、自動的にログアウトさせる

環境変数のTMOUTを設定する。 .bashrcの適当なところに、以下のような一行を追加する。

TMOUT=600

この例だと600秒、つまり10分間操作がない場合は、自動的にログアウトする。

bash tips(シェルスクリプト編)

参考になる資料。

全体的なこと

  • シェルスクリプトの最初の行は、「#!/bin/sh」
  • シェルスクリプトの最後には、「exit 0」を書いてエラーコードを返すようにする(必須ではないけど)
  • 変数への代入のときは$を付けない、参照するときは$を付ける
  • 代入文では等号の前後に空白を入れてはいけない
  • #(シャープ)で始まる行はコメント行になる

配列

filesを配列として宣言する。 ただし、別にこれが無くても配列として使える。

declare -a files

代入と参照。

# 代入、特に宣言などしなくても好きなインデックスを振れる
files[0]="/home/santamarta/test.txt"
files[3]="/home/santamarta/test2.txt"
files[2]="/home/santamarta/test3.txt"

# 値の参照
echo ${files[0]}
echo ${files[3]}

# 配列の中身すべてを取得
echo ${files[*]}

# 配列の要素数を取得
echo ${#files[*]}

ファイルの列挙

コマンドの結果を利用する場合。 .txtという拡張子を持つファイルを列挙する。

for file in `ls | grep '\.txt$'`
do
  echo $file
done

もっと簡単に。

for file in *.txt
do
  echo $file
done

応用、ファイルを列挙して配列に格納する。

TARGET="/home/santamarta/*.txt"

declare -a files

for file in $TARGET
do
  if [ files[0] == "" ]; then
    files[0]=$file
  else
    files[${#files[*]}]=$file
  fi
done

echo ${files[*]}

ファイルの内容を一行ずつ処理する

例えばこのような内容のテキストファイル(test.txt)を用意しておく。

santamarta,500,/home/santamarta
hoge,501,/home/hoge
puni,502,/home/puni

このファイルの内容を一行ずつ処理したい。

#!/bin/sh

count=0

for line in $(cat test.txt)
do
  echo "[$count] $line"
  let count="$count+1";
done

exit 0

このシェルスクリプトを実行すると、このように表示される。

[0] santamarta,500,/home/santamarta
[1] hoge,501,/home/hoge
[2] puni,502,/home/puni

このファイルをCSVファイルと見立てて、3カラム目だけを抽出したい場合、次のようにcutコマンドを使用した処理に書き換える。

#!/bin/sh

count=0

for line in $(cut -f 3 -d , test.txt)
do
  echo "[$count] $line"
  let count="$count+1";
done

exit 0

実行すると下記の通りになる。 区切り文字は-dオプションの次で指定する。 今回はCSVとして扱いたかったので「,」を指定したが、ここをかえれば別の文字列で区切ることも可能。

[0] /home/santamarta
[1] /home/hoge
[2] /home/puni

範囲を指定して文字を切り出す

cutコマンドの-cオプションを使用して、n文字目からm文字目までを切り出して変数に格納する。 次の例は1文字目から4文字目までを切り出す。

substring=`echo $string | cut -c 1-4`

次の例は、dateコマンドにてyyyymmdd形式で得られる日付から、年月日をそれぞれ変数に格納する。

date=`date +%Y%m%d`
year=`echo $date | cut -c 1-4`
month=`echo $date | cut -c 5-6`
day=`echo $date | cut -c 7-8`