Bash
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
&tag(Bash);
*目次 [#k301f9e1]
#contents
*参考情報 [#v39c8200]
-[[OKLab - Bourneシェルスクリプト入門(+bash):http://www.o...
-[[bash 入門:http://www.hpc.cs.ehime-u.ac.jp/~aman/linux/...
*規約に関して [#ldaba577]
-[[シェルスクリプト Tips - UNIX & Linux コマンド・シェル...
-[[シェルスクリプトのコーディングスタイル・コーディング規...
-[[ShellScript - シェルスクリプトを書くときに気をつける9...
**変数名の規約 [#rb2c3908]
-ローカル変数: 小文字、グローバル変数: 大文字、エクスポー...
-インデントはスペース4個。
-readonlyはできれば使う。exportと併用する場合、readonlyで...
-ファイル名の名前だけFOO_FILENAME、フルパスFOO_FILE。ディ...
**★デフォルトオプション [#o0d24102]
-かならずset -euする。set -eでエラーで止まる。set -uで未...
-set -uするとコマンドライン引数が指定されなかったときに、...
TASKNAME=${1:-abc}
-set -xするとコマンドが標準出力される
-set -euxがいいかも。
*パラメータ [#y79b6f9d]
,$0,コマンド名
,$1,1つ目の引数
,$2,2つ目の引数
,$*,残りの引数全部
,$# ,引数の個数
*変数 [#id0375d1]
**参考 [#oe39a741]
-[[bash シェルスクリプト -PG's PocketArms:http://himana.n...
**基本 [#u13bee70]
-小文字でも大文字でも良い。
-宣言時は$を頭につけない。両端にスペースをいれない。
-参照時は$を頭につける。厳密に使いたい時は変数名を{}で囲...
#pre{{
a="XYZ"
echo "$a"
echo "${a}"
}}
-空白がはいった変数のことを考えると、変数使用時常にダブル...
**環境変数とシェル変数 [#x1ba97f5]
-[[シェル変数と環境変数の違い - 燈明日記:http://d.hatena....
-別に大文字=環境変数というわけではない
***環境変数 [#ic5e748e]
-export FOOのようにexportされた変数が環境変数と呼ばれる。
-printenv FOOで確認できる。
-親シェルでexportされた変数は小シェルに引き継がれる。子で...
-export済み変数を設定する場合再度exportする必要はない。例...
LANG="hoge"
***シェル変数 [#t55788e4]
-そのスクリプトか、または現プロンプト上でしかアクセスが有...
-シェルスクリプトでローカル変数として使えるほか、bashのPS...
-set PS1のように確認できる。
- set で全部表示できる。
**デフォルト値 [#nf01d82c]
-${var:-デフォルト値}で設定できる。
#pre{{
var="a b c"
str=${var:-"d e f"}
echo $str
str=${var2:-"d e f"}
echo $str
}}
-以下が出力される
#pre{{
a b c
d e f
}}
-コマンド引数
-以下のシェルスクリプト default.sh を考える。
#pre{{
arg1=${1:-"xxx"}
echo $arg1
}}
-そのまま実行すると、xxxが出力される。「./default.sh yyy...
*制御構造 [#k5839b22]
**if then else [#h8d19587]
-[[test と [ と [[ コマンドの違い - 拡張 POSIX シェルスク...
-文字列の比較。"["の両方にスペース。"="の両方にスペースが...
-"-o"は"or"
#pre{{
if [
str="a b c d e"
if [ "$str" = "a b c" -o "$str" = "a b c d" ]; then
echo ok
else
echo ng
fi
}}
-否定の場合は != を使う。
*** 空白チェックする [#kf90a7c8]
- 直接""と比較するのが簡単か
#pre{{
str=$1
if [ "$str" = "" ]; then
echo "empty"
else
echo "not empty"
fi
}}
***ファイルの存在チェック [#rfcbf4d4]
-"-f"を使用する
#pre{{
if [ -f $file ]; then
echo "$file is file."
else
echo "$file is not file."
fi
}}
- びっくりマークで否定
#pre{{
if [ ! -f $file ]; then
echo "$file is not file."
else
echo "$file is file."
fi
}}
**exit [#jc5ec04c]
-終了正常の場合はexit 0。それ以外はエラー。[[コマンドライ...
exit 0
exit 1
-呼び出し側では一時変数に保存してからチェックするのが無難...
ret=$?
if [ $ret -eq 0 ] ;then
echo "ok"
else
echo "ng"
fi
*関数 [#bb3d2895]
**パラメータの基本 [#uf134564]
-$1,$2のように格納される。そのまま使ってもいいし変数に代...
#pre{{
function test()
{
str=$1
echo "$str"
}
test a
}}
**パラメータの存在チェック [#a9cdb75e]
-以下のようなスクリプトを考える。
#pre{{
function check()
{
str=$1
if [ "$str" = "" ]; then
echo "empty"
else
echo "not empty"
fi
}
echo "\$0=$0"
check $0
echo "\$1=$1"
check $1
echo "\$2=$2"
check $2
}}
-./param.shとして実行すると以下の結果が表示される。
#pre{{
$0=./param.sh
not empty
$1=
empty
$2=
empty
}}
**パラメータとして配列を含む引数を渡したい [#a0636306]
-ただ単に配列を渡す場合、[[逆引きシェルスクリプト/引数を...
argv=("$@")
-配列のほかにも引数を渡したい場合工夫が必要となる。
***shift併用型 [#p084954d]
-最初の引数とそれ以外の配列引数に分ける。[[Passing arrays...
#pre{{
calling_function()
{
variable="a"
array=( "x", "y", "z" )
called_function "${variable}" "${array[@]}"
}
called_function()
{
local_variable="${1}"
shift
local_array=("${@}")
}
}}
***動的スコープでそのまま参照 [#q84ee051]
-bashの変数は動的スコープなので呼び出し先でそのまま参照で...
*コマンド置換 [#d8049cf2]
**バッククォート`command`または$(command)を使う [#p874dd44]
*Tips [#g322c910]
**デバッグ方法 [#pce04bda]
-[[Debugging Bash scripts - Advanced Web Machinery:https:...
**.bash_profile vs .bashrc [#v1e55411]
-通常はログイン時に.bash_profile、シェル起動時に.bashrcら...
-OS XでGUIからターミナルを開いたときは、.bash_profileしか...
-そこで、.bash_profileから.bashrcを読み込むように設定して...
#pre{{
# read .bashrc ...
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
}}
-というよりもGUIから起動した場合.bashrcが読み込まれないと...
-ということで、環境変数は.profileに記述すればよさそうだが...
-というこでまとめると以下のようになるのか(2020/12/28(月))
--.bashrc: インタラクティブ用の設定とCapistranoで使用する...
--.profile: 環境変数
**スクリプトの存在するディレクトリを取得したい [#j053da4c]
-スクリプト内から他のスクリプトを呼び出したい場合など、ス...
export BASE_DIR=$(cd $(dirname $0);pwd)
**複雑なプログラムを作成したい [#s9c330b9]
-オープンソースを参考にする。
-Linuxの/etc/network-scriptsとか、tomcatの起動スクリプト...
**実行したプログラムをエコーしたい [#qc374345]
-[[bashスクリプトにおいて、 コマンドを実行しながら、その...
#!/bin/sh -x
set -x
**OSを判定したい [#b7bb53c4]
-[[zshとVimでOS判定 - shkh's blog:http://shkh.hatenablog....
-バージョン番号が付いていたりそのたプリフィックスが付属し...
#pre{{
case ${OSTYPE} in
darwin*)
#ここにMac向けの設定
;;
linux*)
#ここにLinux向けの設定
;;
esac
}}
**パラメータの個数をチェックする [#o03c7e0d]
-例えばパラメータ無しの場合とパラメータありの場合で処理を...
#pre{{
function check()
{
str=$1
if [ "$str" = "" ]; then
echo "引数なし"
else
echo "引数あり"
fi
}
}}
**空白を含むファイル名を正しく渡したい [#xdef4987]
-例えばシェルスクリプトから、rubyスクリプトを呼び出したい...
#!/bin/sh
ruby test.rb $@
-この場合全体をエスケープしてやればよい。[[Accessing bash...
ruby test.rb "$@"
**チルダの展開 [#ie68f1d9]
-[[シェルスクリプトでチルダを含む文字列をチルダ展開する -...
-そのたにはチルダのかわりに$HOMEを使えば良い。
**スクリプトで.bashrcの変更を反映させる。 [#n62e3bef]
-スクリプト内でだけ有効でよいなら
source ~/.bashrc
-スクリプト終了後も有効にしたいなら。
exec $SHELL --login
*トラブルシューティング [#jc21d146]
**echo -nがきかない [#e7468494]
-[[少しハマったシェルスクリプト by yota.log:htt...
** "$@" != ""がエラーになる [#s33a4e3b]
-[[シェルスクリプトでの$@の罠:http://rcmdnk.github.io/blo...
-以下のスクリプトを実行するとき、「./atmark.sh a」はいい...
#pre{{
#!/usr/bin/env bash
if [ "$@" != "" ];then
echo "$@"
else
echo empty
fi
}}
-これは"$@"が次のように展開されるため。
"$1" "$2" "$3"
-つまり、if [ "$@" = "" ];thenが、if [ "" = "" ];thenとな...
終了行:
&tag(Bash);
*目次 [#k301f9e1]
#contents
*参考情報 [#v39c8200]
-[[OKLab - Bourneシェルスクリプト入門(+bash):http://www.o...
-[[bash 入門:http://www.hpc.cs.ehime-u.ac.jp/~aman/linux/...
*規約に関して [#ldaba577]
-[[シェルスクリプト Tips - UNIX & Linux コマンド・シェル...
-[[シェルスクリプトのコーディングスタイル・コーディング規...
-[[ShellScript - シェルスクリプトを書くときに気をつける9...
**変数名の規約 [#rb2c3908]
-ローカル変数: 小文字、グローバル変数: 大文字、エクスポー...
-インデントはスペース4個。
-readonlyはできれば使う。exportと併用する場合、readonlyで...
-ファイル名の名前だけFOO_FILENAME、フルパスFOO_FILE。ディ...
**★デフォルトオプション [#o0d24102]
-かならずset -euする。set -eでエラーで止まる。set -uで未...
-set -uするとコマンドライン引数が指定されなかったときに、...
TASKNAME=${1:-abc}
-set -xするとコマンドが標準出力される
-set -euxがいいかも。
*パラメータ [#y79b6f9d]
,$0,コマンド名
,$1,1つ目の引数
,$2,2つ目の引数
,$*,残りの引数全部
,$# ,引数の個数
*変数 [#id0375d1]
**参考 [#oe39a741]
-[[bash シェルスクリプト -PG's PocketArms:http://himana.n...
**基本 [#u13bee70]
-小文字でも大文字でも良い。
-宣言時は$を頭につけない。両端にスペースをいれない。
-参照時は$を頭につける。厳密に使いたい時は変数名を{}で囲...
#pre{{
a="XYZ"
echo "$a"
echo "${a}"
}}
-空白がはいった変数のことを考えると、変数使用時常にダブル...
**環境変数とシェル変数 [#x1ba97f5]
-[[シェル変数と環境変数の違い - 燈明日記:http://d.hatena....
-別に大文字=環境変数というわけではない
***環境変数 [#ic5e748e]
-export FOOのようにexportされた変数が環境変数と呼ばれる。
-printenv FOOで確認できる。
-親シェルでexportされた変数は小シェルに引き継がれる。子で...
-export済み変数を設定する場合再度exportする必要はない。例...
LANG="hoge"
***シェル変数 [#t55788e4]
-そのスクリプトか、または現プロンプト上でしかアクセスが有...
-シェルスクリプトでローカル変数として使えるほか、bashのPS...
-set PS1のように確認できる。
- set で全部表示できる。
**デフォルト値 [#nf01d82c]
-${var:-デフォルト値}で設定できる。
#pre{{
var="a b c"
str=${var:-"d e f"}
echo $str
str=${var2:-"d e f"}
echo $str
}}
-以下が出力される
#pre{{
a b c
d e f
}}
-コマンド引数
-以下のシェルスクリプト default.sh を考える。
#pre{{
arg1=${1:-"xxx"}
echo $arg1
}}
-そのまま実行すると、xxxが出力される。「./default.sh yyy...
*制御構造 [#k5839b22]
**if then else [#h8d19587]
-[[test と [ と [[ コマンドの違い - 拡張 POSIX シェルスク...
-文字列の比較。"["の両方にスペース。"="の両方にスペースが...
-"-o"は"or"
#pre{{
if [
str="a b c d e"
if [ "$str" = "a b c" -o "$str" = "a b c d" ]; then
echo ok
else
echo ng
fi
}}
-否定の場合は != を使う。
*** 空白チェックする [#kf90a7c8]
- 直接""と比較するのが簡単か
#pre{{
str=$1
if [ "$str" = "" ]; then
echo "empty"
else
echo "not empty"
fi
}}
***ファイルの存在チェック [#rfcbf4d4]
-"-f"を使用する
#pre{{
if [ -f $file ]; then
echo "$file is file."
else
echo "$file is not file."
fi
}}
- びっくりマークで否定
#pre{{
if [ ! -f $file ]; then
echo "$file is not file."
else
echo "$file is file."
fi
}}
**exit [#jc5ec04c]
-終了正常の場合はexit 0。それ以外はエラー。[[コマンドライ...
exit 0
exit 1
-呼び出し側では一時変数に保存してからチェックするのが無難...
ret=$?
if [ $ret -eq 0 ] ;then
echo "ok"
else
echo "ng"
fi
*関数 [#bb3d2895]
**パラメータの基本 [#uf134564]
-$1,$2のように格納される。そのまま使ってもいいし変数に代...
#pre{{
function test()
{
str=$1
echo "$str"
}
test a
}}
**パラメータの存在チェック [#a9cdb75e]
-以下のようなスクリプトを考える。
#pre{{
function check()
{
str=$1
if [ "$str" = "" ]; then
echo "empty"
else
echo "not empty"
fi
}
echo "\$0=$0"
check $0
echo "\$1=$1"
check $1
echo "\$2=$2"
check $2
}}
-./param.shとして実行すると以下の結果が表示される。
#pre{{
$0=./param.sh
not empty
$1=
empty
$2=
empty
}}
**パラメータとして配列を含む引数を渡したい [#a0636306]
-ただ単に配列を渡す場合、[[逆引きシェルスクリプト/引数を...
argv=("$@")
-配列のほかにも引数を渡したい場合工夫が必要となる。
***shift併用型 [#p084954d]
-最初の引数とそれ以外の配列引数に分ける。[[Passing arrays...
#pre{{
calling_function()
{
variable="a"
array=( "x", "y", "z" )
called_function "${variable}" "${array[@]}"
}
called_function()
{
local_variable="${1}"
shift
local_array=("${@}")
}
}}
***動的スコープでそのまま参照 [#q84ee051]
-bashの変数は動的スコープなので呼び出し先でそのまま参照で...
*コマンド置換 [#d8049cf2]
**バッククォート`command`または$(command)を使う [#p874dd44]
*Tips [#g322c910]
**デバッグ方法 [#pce04bda]
-[[Debugging Bash scripts - Advanced Web Machinery:https:...
**.bash_profile vs .bashrc [#v1e55411]
-通常はログイン時に.bash_profile、シェル起動時に.bashrcら...
-OS XでGUIからターミナルを開いたときは、.bash_profileしか...
-そこで、.bash_profileから.bashrcを読み込むように設定して...
#pre{{
# read .bashrc ...
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
}}
-というよりもGUIから起動した場合.bashrcが読み込まれないと...
-ということで、環境変数は.profileに記述すればよさそうだが...
-というこでまとめると以下のようになるのか(2020/12/28(月))
--.bashrc: インタラクティブ用の設定とCapistranoで使用する...
--.profile: 環境変数
**スクリプトの存在するディレクトリを取得したい [#j053da4c]
-スクリプト内から他のスクリプトを呼び出したい場合など、ス...
export BASE_DIR=$(cd $(dirname $0);pwd)
**複雑なプログラムを作成したい [#s9c330b9]
-オープンソースを参考にする。
-Linuxの/etc/network-scriptsとか、tomcatの起動スクリプト...
**実行したプログラムをエコーしたい [#qc374345]
-[[bashスクリプトにおいて、 コマンドを実行しながら、その...
#!/bin/sh -x
set -x
**OSを判定したい [#b7bb53c4]
-[[zshとVimでOS判定 - shkh's blog:http://shkh.hatenablog....
-バージョン番号が付いていたりそのたプリフィックスが付属し...
#pre{{
case ${OSTYPE} in
darwin*)
#ここにMac向けの設定
;;
linux*)
#ここにLinux向けの設定
;;
esac
}}
**パラメータの個数をチェックする [#o03c7e0d]
-例えばパラメータ無しの場合とパラメータありの場合で処理を...
#pre{{
function check()
{
str=$1
if [ "$str" = "" ]; then
echo "引数なし"
else
echo "引数あり"
fi
}
}}
**空白を含むファイル名を正しく渡したい [#xdef4987]
-例えばシェルスクリプトから、rubyスクリプトを呼び出したい...
#!/bin/sh
ruby test.rb $@
-この場合全体をエスケープしてやればよい。[[Accessing bash...
ruby test.rb "$@"
**チルダの展開 [#ie68f1d9]
-[[シェルスクリプトでチルダを含む文字列をチルダ展開する -...
-そのたにはチルダのかわりに$HOMEを使えば良い。
**スクリプトで.bashrcの変更を反映させる。 [#n62e3bef]
-スクリプト内でだけ有効でよいなら
source ~/.bashrc
-スクリプト終了後も有効にしたいなら。
exec $SHELL --login
*トラブルシューティング [#jc21d146]
**echo -nがきかない [#e7468494]
-[[少しハマったシェルスクリプト by yota.log:htt...
** "$@" != ""がエラーになる [#s33a4e3b]
-[[シェルスクリプトでの$@の罠:http://rcmdnk.github.io/blo...
-以下のスクリプトを実行するとき、「./atmark.sh a」はいい...
#pre{{
#!/usr/bin/env bash
if [ "$@" != "" ];then
echo "$@"
else
echo empty
fi
}}
-これは"$@"が次のように展開されるため。
"$1" "$2" "$3"
-つまり、if [ "$@" = "" ];thenが、if [ "" = "" ];thenとな...
ページ名: