「Linux/bashメモ」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→ユーザ判定) |
(→bash実行時に環境変数を読み込む) |
||
| 行281: | 行281: | ||
$ test.sh | $ test.sh | ||
/Users/hogehoge/Library/Android/sdk | /Users/hogehoge/Library/Android/sdk | ||
| + | |||
| + | ==配列== | ||
| + | ,で区切らずspaceで区切る | ||
| + | declare -a test_files=("test" "test2" "test3) | ||
| + | |||
| + | <pre> | ||
| + | for e in ${test_files[@]}; do | ||
| + | echo ${test_files[$i]} | ||
| + | if [ -e ${test_files[$i]} ]; then | ||
| + | echo ${test_files[$i]} | ||
| + | fi | ||
| + | let i++ | ||
| + | done | ||
| + | </pre> | ||
2019年10月21日 (月) 19:25時点における版
目次
- 1 シェル使い方
- 2 自分自信のパス
- 3 phpスクリプトを動かす
- 4 2重起動防止
- 5 日付ログ
- 6 日付ファイル
- 7 yesno問合せシェル
- 8 サブルーチン
- 9 他サーバからファイル取得
- 10 他サーバのバッチを叩く
- 11 サブバージョンexport
- 12 svnからexport&rsync
- 13 他サーバのSmartyコンパイルファイルを削除
- 14 ログファイル操作
- 15 変数の範囲を指定
- 16 ファイル内一括置換変更(grepreplace
- 17 変更ファイルトップ10
- 18 if文法
- 19 一括置換シェル
- 20 ディレクトリがないとき判定
- 21 パラメータに記載したファイル名が存在しないとき終了させる
- 22 タグで囲まれた部分を削除
- 23 正規表現マッチ
- 24 ユーザ判定
- 25 bash実行時に環境変数を読み込む
- 26 配列
シェル使い方
test.sh等の名前でパーティション:755で保存
bash test.shで実行可能
- !/bin/bashを頭につけると
test.shで動く
test.shで動かない場合は ./test.shとする
自分自信のパス
echo $(cd $(dirname $0);pwd)
変数割当はこうする
DIR=$(cd $(dirname $0);pwd)
echo "${DIR}"
phpスクリプトを動かす
cd /export1/batch/ /usr/local/bin/php test.php > log/test.log
2重起動防止
http://www.confrage.com/unix/sh/exe_dup/exe_dup.html
#!/bin/bash
if [ `ps ax | grep $0 | grep -v grep | wc -l` -gt 2 ]; then
echo "Someone activating the $0 already."
exit 1
fi
日付ログ
DATE=`date '+%Y/%m/%d %T'` echo "$DATE start" >> log/test.log
日付ファイル
cp test.log test`date +"%Y%m%d"`.log
yesno問合せシェル
#!/bin/sh
function_yesno_query(){
local yn_result=""
while [ -z "$yn_result" ]; do
read yn_reply
case "$yn_reply" in
[yY])
yn_result=0;;
[nN])
yn_result=1;;
*)
echo "Please (y/n)";
esac
done
return $yn_result
}
echo "Please (y/n)"
if function_yesno_query; then
echo "yes"
else
echo "no"
fi
サブルーチン
注意:returnは"数字"しか使えない
function subadd {
#ローカル変数定義
local one=1
echo $1
return `expr $2 + $3 + $one`
}
subadd "data1" 10 20
echo $?
subadd "data2" 5 15
echo $?
他サーバからファイル取得
#!/bin/sh d="/home/admin1/test" scp admin1@192.168.0.2:/home/admin1/config.ini $d"config.ini"
port指定
scp -P 3843 admin1@192.168.0.2:/home/admin1/config.ini $d"config.ini"
他サーバのバッチを叩く
#!/bin/sh
USER=admin1
TARGET_HOSTS="192.168.0.2"
PROG_PATH=/home/admin1/bin/batch1.php
SSH=/usr/bin/ssh
PHP=/usr/local/bin/php
for i in $TARGET_HOSTS; do
$SSH $USER@$i $PHP $PROG_PATH
echo "$SSH $USER@$i $PHP $PROG_PATH"
done;
サブバージョンexport
#!/bin/sh cd /home/admin1/zend/master/system1 USER="userxxx" PASS="xxxxxxx" REPOSITORY="https://svn.xxxxxxxxxx/admin1/zend/system1/trunk/" SVNEXPORT="svn export --username $USER --password $PASS" # 複数指定はスペース区切り TARGETS="system1" LOG_FILE=/home/admin1/zend/logs/export/`date +%Y%m%d`.log pushd . cd /home/admin1/zend/master #ディレクトリ削除 rm -fr /home/admin1/zend/master/system1 #export for i in $TARGETS; do $SVNEXPORT --force ${REPOSITORY}${i} ${i} >> $LOG_FILE done
svnからexport&rsync
rm -fr /tmp/project1 svn export svn+ssh://user1@example.com/var/svn/repos/project1 /tmp/project1 echo 'sabun' SOURCE=/tmp/project1/ DEST=user1@example.com:/var/www/project1 rsync --dry-run -avuz --exclude '*.svn' --exclude=".DS_Store" --delete -e ssh $SOURCE $DEST | grep -v /$ echo 'deploy ok? (y/n' read INDATA if [ x"${INDATA}" != x"y" -a x"${INDATA}" != x"Y" ]; then echo "cancel." exit 1 fi rsync -avuz --exclude '*.svn' --exclude=".DS_Store" --delete -e ssh $SOURCE $DEST |grep -v /$
linux/コマンドメモ/rsync [ショートカット]
他サーバのSmartyコンパイルファイルを削除
#!/bin/sh
USER=admin1
TARGET_HOSTS="192.168.0.2 192.168.0.3"
BASE_DIR=/var/www/html/zend/system1/application/views
SSH=/usr/bin/ssh
RM=/bin/rm
RM_OPT=-r
for i in $TARGET_HOSTS; do
$SSH $USER@$i $RM $RM_OPT $BASE_DIR/caches/*
echo "$SSH $USER@$i $RM $RM_OPT $BASE_DIR/caches/*"
$SSH $USER@$i $RM $RM_OPT $BASE_DIR/compiles/*
echo "$SSH $USER@$i $RM $RM_OPT $BASE_DIR/compiles/*"
done;
ログファイル操作
#30日以前のログ削除
0 2 * * * find /tmp/log -name 'access_*.log.gz' -mtime +30 -exec rm -f {} \;
#前日ログ圧縮
0 3 * * * find /tmp/log -name 'access_*.log' -mtime +1 -exec gzip {} \;
変数の範囲を指定
echo ${BASE_DIR}
ファイル内一括置換変更(grepreplace
grep hoge ./ -r -l|xargs sed s/hoge/fuga/g -i
変更ファイルトップ10
find ./ -name *.php | xargs ls -lt| head -10
if文法
if [ "a" != "b" ]; then echo "ng" else echo "ok" fi
if [ 10 -ne 9 ]; then
[]の前後にスペースを入れないと文法エラーとなる
数字の比較方法
if [ 1 -eq 2 ] 意味= if [ 1 -ne 2 ] 意味!= if [ 1 -gt 2 ] 意味> if [ 1 -lt 2 ] 意味< if [ 1 -ge 2 ] 意味>= if [ 1 -le 2 ] 意味<=
空文字の比較
if [ -n "$test" ]; then
一括置換シェル
#!/bin/bash
function_yesno_query(){
local yn_result="";
while [ -z "$yn_result" ]; do
read yn_reply
case "$yn_reply" in
[yY])
yn_result=0;;
[nN])
yn_result=1;;
*)
echo "Please (y/n)";
esac
done
return $yn_result
}
echo "grep list"
data1=aiueo
data2=kakikukeko
find . -name '*.txt' | xargs grep $data1
echo "dry replace ? (y/n)"
if function_yesno_query; then
find . -name '*.txt' | xargs sed -e "s/$data1/$data2/g"
echo "replace? (y/n)"
if function_yesno_query; then
find . -name '*.txt' | xargs sed -i -e "s/$data1/$data2/g"
echo "ok"
else
echo "stop"
fi
else
echo "stop"
fi
ディレクトリがないとき判定
if [ ! -d /tmp/log ] mkdir /tmp/log fi
パラメータに記載したファイル名が存在しないとき終了させる
bash test.sh sample.txt
vi test.sh
#!/bin/bash [ -f $1 ] || exit 1
タグで囲まれた部分を削除
<!-- delete_flag -->で囲まれた部分を削除
vi sample.txt
aiueo <!-- delete_flag --> kakikukeko sasisuseso <!-- /delete_flag --> abcd
vi del_tag.sh
#!/bin/bash
function sub_del_tag {
#\r削除
sed -i -e "s/\r//g" $1
data=""
viewflag=true
while read line; do
if [ "${line}" = "<!-- ${2} -->" ]; then
viewflag=false
fi
if [ "${line}" = "<!-- /${2} -->" ]; then
viewflag=true
continue
fi
if [ $viewflag = true ]; then
data="${data}${line}\n"
fi
done < $1
echo ${data} > $1
}
sub_del_tag "sample.txt" "delete_flag"
正規表現マッチ
name=test.txt
if [[ "${name}" =~ \.(txt|php)$ ]]; then
echo "file"
else
echo "dir"
fi
ユーザ判定
if [ `whoami` != "admin" ]; then
echo "It is not admin user. Please run with admin user."
exit
fi
bash実行時に環境変数を読み込む
sh実行時に~/.bash_profileを読み込んでるっぽいので普通に使える。
$ vi test.sh #!/bin/bash echo $ANDROID_HOME $ test.sh /Users/hogehoge/Library/Android/sdk
配列
,で区切らずspaceで区切る
declare -a test_files=("test" "test2" "test3)
for e in ${test_files[@]}; do
echo ${test_files[$i]}
if [ -e ${test_files[$i]} ]; then
echo ${test_files[$i]}
fi
let i++
done
