「Bash」の版間の差分
(→Tips) |
(→シェルスクリプト) |
||
行42: | 行42: | ||
* $# - 引数の個数なので、スクリプト名は含まない。 | * $# - 引数の個数なので、スクリプト名は含まない。 | ||
* [http://www.linux.or.jp/JF/JFdocs/Bash-Prog-Intro-HOWTO.html BASH Programming - Introduction HOW-TO] | * [http://www.linux.or.jp/JF/JFdocs/Bash-Prog-Intro-HOWTO.html BASH Programming - Introduction HOW-TO] | ||
+ | |||
+ | === 配列 === | ||
+ | 迷宮入りするかと思うほど理解するのが難しかった。。 | ||
+ | * 配列の要素数 <code>${#array[@]}</code> | ||
+ | |||
+ | ==== コマンド実行結果を 1 行ごとに配列に格納する ==== | ||
+ | 区切り文字を改行にしておかなければ、1 行ごとに格納されない。 | ||
+ | IFS=$'\n' | ||
+ | array=( $( ls -l ) ) | ||
+ | |||
+ | ==== 配列に要素を追加 ==== | ||
+ | これもハマった…。一旦展開するのがポイント。 | ||
+ | array=( "${array[@]}" "hoge" ) | ||
=== パラメータ展開 === | === パラメータ展開 === |
2009年6月22日 (月) 22:32時点における版
bash を制するものが、Linux を制す —— hagio
目次
Tips
コマンド実行後に任意の処理を行う
bash には PROMPT_COMMAND という環境変数があり、これに任意のコマンドをセットすると、 コマンド実行後に自動的に実行される。
例えば date をセットすると、コマンドを実行した日時が出力されるようになる。
kuro:~ kaz$ PROMPT_COMMAND=date 2009年 6月12日 金曜日 01時41分46秒 JST kuro:~ kaz$ ls Desktop Documents Downloads Library Movies Music Pictures Public Sites 2009年 6月12日 金曜日 01時41分50秒 JST
プロンプトに色を付ける
コマンドの出力の境界がわかりやすくなったり、 ルートかどうかを色で判別できたり、かなり便利なこの機能。
.bashrc に以下を追記する。
col=33 # yellow PS1="\[\e[${col}m\][\u@\h \W]\$ \e[m\]"
ある数を n ビットシフトした数
カーネルソースを読んでいると、512 << 16
などという数値が出てくることがあるが、
わざわざ計算機を持ち出さなくても、bash で計算できる。
$ echo $((512 << 16)) 33554432
bash で計算できるということは、vi を使っていても、終了せずに計算できる。
:!echo $((512 << 16)) 33554432
直前にいたディレクトリに戻る
OLDPWD
環境変数には、直前にいたディレクトリが格納されているので、
$ cd $OLDPWD
で戻ることができるが、cd に - を渡しても同様の結果となる。
$ cd -
深いディレクトリにいて、いったんホームディレクトリに行って帰ってくる場合などに便利だ。
シェルスクリプト
- $# - 引数の個数なので、スクリプト名は含まない。
- BASH Programming - Introduction HOW-TO
配列
迷宮入りするかと思うほど理解するのが難しかった。。
- 配列の要素数
${#array[@]}
コマンド実行結果を 1 行ごとに配列に格納する
区切り文字を改行にしておかなければ、1 行ごとに格納されない。
IFS=$'\n' array=( $( ls -l ) )
配列に要素を追加
これもハマった…。一旦展開するのがポイント。
array=( "${array[@]}" "hoge" )
パラメータ展開
スクリプトを書く際には便利なものの、忘れがちなので書いておく。
${parameter#pattern} 前方最短一致部分を削除 ${parameter##pattern} 前方最長一致部分を削除 ${parameter%pattern} 後方最短一致部分を削除 ${parameter%%pattern} 後方最長一致部分を削除
わかりにくいので使用例を示す。
- コマンドのパスから、そのコマンドがあるディレクトリのパスを得る
$ CMD_PATH=/usr/local/bin/hoge $ echo ${CMD_PATH%/*} /usr/local/bin
- ファイル名から、拡張子だけを取り出す
$ FILE_NAME=hoge-1.2.txt $ echo ${FILE_NAME##*.} txt
無限ループ
こいつで 1 セクション作るのはどうかと思うが…、他に見出しを付ける方法がないので。
while : do command done
while
に真を渡す方法はいくつかあるが、bash 組み込みコマンド :
が一番速いと思われる。
-
test
コマンドに文字列を渡す (-n オプションは省略可能なので、文字列が渡されると必ず真が返る。) -
true
コマンド -
:
コマンド
getopts
こういう関数の使い方ってすぐ忘れるので、定型文化しておこう。
GETOPT_ERR=0 while getopts "i:nh" opt; do case $opt in i) INTERVAL=$OPTARG;; n) NOPRINT=1;; h) usage; exit 0;; ?) GETOPT_ERR=1;; esac done shift $(( $OPTIND - 1 )) if [ $GETOPT_ERR -eq 1 ]; then usage exit 1 fi
よく使うコマンド
- 行頭にジャンプ:C-a 行末にジャンプ:C-e
- 行頭までキル:C-u 行末までキル:C-k
- 前単語をキル:C-w
- ヤンク:C-y
- 直前のコマンドの最後の引き数を挿入:M-. (これは便利)
- キャンセル:C-g
- 後方検索:C-r (これらは使い方が難しい)
- 前方検索:C-s
- 最終行へ:M-> (Poderosa では打ちにくい…)
.bashrc
カスタマイズしたものに慣れてしまうと、素の状態にすぐに適応できなくなってしまうので良くないが、 それでも背に腹は代えられないモノたち。
alias ..='cd ..' alias la='ls -a' alias ll='ls -l' # Red Hat では標準 alias lla='ls -la' alias llh='ls -lh' alias s='screen' alias grep='grep -i --color=auto' # 自動 ls function cd { builtin cd $@; ls } # Ctrl-s でのストップ機能を止める stty stop undef
起動時の設定ファイルの読み込み順序
- ログインシェルの場合 (ログイン時、su - user 時など)
-
/etc/profile
-
/etc/profile.d/*.sh
-
~/.bash_profile
-
~/.bashrc
-
/etc/bashrc
-
- ログインシェルでない場合 (bash 実行時、su user 時など)
-
~/.bashrc
-
/etc/bashrc
-
/etc/profile.d/*.sh
-
以下のコマンドで確認できる。
# strace -f -e trace=open -o su-bash.strace su - hagio
その他 (細かいこと)
-
export
は、その変数を子プロセスに引き継ぐ場合に用いる。 - Meta キーは ESC キーで代用可。(Poderosa では有用)