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(シェルスクリプト編)
参考になる資料。
- シェルスクリプト(Bash)
- シェルスクリプトの基礎
- bash
- BASHスクリプト
- Shell: script (Japanese)
- 最低限 UNIX / Linux [III] 【シェルスクリプト】
- Manpage of BASH
全体的なこと
- シェルスクリプトの最初の行は、「#!/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`