Open7
bashスクリプトの勉強メモ
大学院の課題でbashスクリプトを書くこととなったのでメモ
コマンド実行結果を変数に入れる
バッククォートか、$()
を使うことでコマンド実行結果を変数に格納できる
hoge=`cat hoge.txt`
hoge=$(cat hoge.txt)
$()
の方が高機能でネストもできるらしい。
hoge=$(echo $(echo 'foo'))
local
をつけると関数内で限定される
変数を展開する
$
を変数名につけることで展開できる。
""
ダブルクォーテーションで囲わないと、変数内に半角スペースを入れた時などの挙動がおかしくなるので注意(参考 bashスクリプティング研修の資料を公開します - エムスリーテックブログ)
hoge=`cat hoge.txt`
echo "$hoge"
ループ
while文
while 条件式
do
処理
done
デフォルト値の設定
${変数名:-初期値}
でデフォルト値を設定できる
#第1引数がない場合はhogeをデフォルト値とする場合
# ${}で囲む場合、引数の$1は$を外して1になる
NAME=${1:-hoge}
``
引数のパース
こちらを参考に..
function parse_args() {
SHORT=c:,f:,h
LONG=command:,files:,help
OPTS=$(getopt -a -n watch-files --options $SHORT --longoptions $LONG -- "$@")
eval set -- "$OPTS"
while :
do
case "$1" in
-c | --command )
COMMAND="$2"
shift 2
;;
-f | --files )
FILES="$2"
shift 2
;;
-h | --help)
"This is a weather script"
exit 2
;;
--)
shift;
break
;;
*)
echo "Unexpected option: $1"
;;
esac
done
echo $COMMAND, $FILES
}
parse_args "$@"
getopt
はGNU/Linux 版とBSD 版で動きが違うので駄目だった..
getopts
を使うことにした。
function parse_args() {
while getopts ":hc:f:" opt; do
case ${opt} in
c )
COMMAND="$OPTARG"
;;
f )
FILES="$OPTARG"
;;
h )
usage
exit 2
;;
* )
echo "Invalid option: $OPTARG" 1>&2
exit 2
;;
esac
done
shift $((OPTIND -1))
if [[ "$COMMAND" == "" ]] || [[ "$FILES" == "" ]]; then
usage
fi
}
関数
関数の戻り値は終了ステータス。通常の意味での戻り値はechoを使う