bashの使い方あれこれ。
参考資料。
これらの隠しファイルに環境設定用のコマンドなり記述しておけば、自動的に設定が行われる。
環境変数の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分間操作がない場合は、自動的にログアウトする。
参考になる資料。
filesを配列として宣言する。 ただし、別にこれが無くても配列として使える。
declare -a files
代入と参照。
# 代入、特に宣言などしなくても好きなインデックスを振れる files[0]="/home/santamarta/test.txt" files[3]="/home/santamarta/test2.txt" files[2]="/home/santamarta/test3.txt" # 値の参照 echo echo # 配列の中身すべてを取得 echo # 配列の要素数を取得 echo
コマンドの結果を利用する場合。 .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[]=$file
fi
done
echo
例えばこのような内容のテキストファイル(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`