- 追加された行はこの色です。
- 削除された行はこの色です。
*趣旨 [#h4a48234]
再び探さなくても良いようにメモします。
*目次 [#k5659dfd]
#contents
*日付を得る [#c80e291e]
`date '+%Y%m%d'`
*ファイルパスからファイル名や拡張子を自由に取り出す [#xee0e691]
紹介URL
http://d.hatena.ne.jp/zariganitosh/20100921/get_file_name_ext_dir
**例 [#j0778d75]
fpath='/a/b/c.d.e'
**ファイル名を取り出す(拡張子あり) [#h6a55448]
fname_ext="${fpath##*/}"
echo $fname_ext
***結果 [#va4bcdd7]
c.d.e
**ファイル名を取り出す(拡張子なし) [#o882e586]
fname="${fname_ext%.*}"
echo $fname
***結果 [#xc41fe49]
c.d
**拡張子を取り出す [#ta5f7bfa]
fext="${fpath##*.}"
echo $fext
***結果 [#o4a009df]
e
**ディレクトリを取り出す [#p70404f3]
fdir="${fpath%/*}"
echo $fdir
***結果 [#w8fd2573]
/a/b
**補足 [#dc1405b9]
-${変数#パターン} 先頭から最短一致した部分を取り除く
-${変数##パターン} 先頭から最長一致した部分を取り除く
-${変数%パターン} 末尾から最短一致した部分を取り除く
-${変数%%パターン} 末尾から最長一致した部分を取り除く
*関数 [#l856e073]
**所感 [#k233f0fa]
同じプロセス内で実行されるので、ディレクトリの移動をおこなうと関数の終了時にカレントディレクトリが変更される。
作業の環境変数自体をなんとかしたい場合にシェルスクリプトをつかうよりも有効なのだろうと思う。
なので、
-環境変数を変えたい単位で関数を用意する。
-変数に応じて汎用的に動く関数を用意する。
という作りが便利なのだろう。
**関数の書き方 [#dc3629c2]
function myfunc() {
}
関数の内部はインデントをつかうことで読みやすさが格段にアップする。
*ファイル検索と連携した処理 [#zf7166f3]
ファイルの検索結果に対していろいろ処理をしたい場合、ディレクトリ構造をそのまま保存しての処理がBSD版のcpコマンドでは難しかったりするが、下記のようにwhile read 変数名; do とすることで対処できる。
find . -type f ! -path "*a.txt" ! -path "*b.txt" ! -path "*c.txt" | while read f; do
echo $f
mkdir -p $mergedir/${f%/*}
cp -a $f $mergedir/${f%/*}
done
echo "ok"
*シェルスクリプトで並列実行 [#d8499827]
**参考元 [#ce3b99d7]
http://www.bulkitem.com/2011/09/blog-post.html
**コード例 [#n79f0a8a]
#!/bin/sh
curl -O 'http://domain/1.jpg?1' & # 1M程度の画像
PID=$!
curl -O 'http://domain/2.jpg?2' & # 1M程度の画像
wait $PID
wait $!
echo "END"
**history [#r5a8253c]
コマンドの履歴を重複を削って並べる
history | awk '{ $1=""; print $0}'|sort|uniq
**文字列を一括置換 [#e5c5e1a0]
http://rakkyoo.net/?p=657
find . -name "*.csv" | xargs grep -l test | ruby -i -ep 'gsub!(/test/,"tttt")'
**シェルスクリプトでPATHの追加と削除 [#cf93478f]
http://d.hatena.ne.jp/Hoshi-KN/20120129/1327834914
#!/bin/sh
path_tool1=/opt/tool1
#PATHに上記のpath_tool1で指定したパスがあれば削除
if [ `echo $PATH | grep -e $path_tool1` ] ; then
PATH=`echo $PATH | sed -e "s@$path_tool1:\{0,1\}@@"`
export PATH
fi
unset path_tool1
path_tool2=/opt/tool2
#PATHに上記のpath_tool2で指定したパスがなければ追加
if [ ! `echo $PATH | grep -e $path_tool2` ] ; then
PATH=$path_tool2:$PATH
export PATH
fi
unset path_tool2
*日付フォーマット付きで設定 [#qec1ddb7]
DATE=`date +'%Y%m%d-%H%M'`
*bashで引数に配列を設定する方法 [#ie23caad]
function foo() {
local arrayname=$1
eval ref=\"\${$arrayname[@]}\"
local list=( ${ref} )
for i in "${list}"; do
echo "${i}"
done
}
hoge=( 'xxx' 'yyy' 'zzz' )
foo hoge
**情報源 [#l0c9dee7]
小粋空間
http://www.koikikukan.com/archives/2013/09/13-025555.php
*ファイルのタイムスタンプを取得 [#scced8d8]
#!/bin/sh
TARGET=$1
if [ "$TARGET" == "" ]; then
echo "パラメータを指定してください。";
elif [ -f $TARGET -o -d $TARGET ]; then
TIMESTAMP=`ls -d -l --time-style='+%Y%m%d' $TARGET | awk '{print $6; }'`;
TARGET_PATH=`dirname $TARGET`
TARGET_BODY=`basename $TARGET`
if [ "$TARGET_PATH" != "" ]; then
TARGET=$TARGET_PATH/$TARGET_BODY
else
TARGET=$TARGET_BODY
fi
echo "mv $TARGET $TARGET.$TIMESTAMP"
#mv $TARGET $TARGET.$TIMESTAMP
else
echo "指定されたファイルまたはディレクトリは存在しません。";
fi
**情報源 [#d510e5f3]
http://typista.it-creates.com/dos/304.html
*当日以外のログファイルは、年月日のフォルダをつくって格納する [#q0f19ff7]
いままで、学んできたことを組み合わせて、シェルの関数を作りました。
function logmove(){
DATE=`date +'%Y%m%d'`
\ls -1 *.log | while read TARGET;do
FILEDATE=`ls -d -l --time-style='+%Y%m%d' $TARGET | awk '{print $6; }'`;
FILEDAY=`ls -d -l --time-style='+%d' $TARGET | awk '{print $6; }'`;
FILEMONTH=`ls -d -l --time-style='+%m' $TARGET | awk '{print $6; }'`;
FILEYEAR=`ls -d -l --time-style='+%Y' $TARGET | awk '{print $6; }'`;
if test $FILEDATE != $DATE ; then
mkdir -p ./$FILEYEAR/$FILEMONTH/$FILEDAY
echo mv ./$TARGET ./$FILEYEAR/$FILEMONTH/$FILEDAY/
fi
#echo $FILEDATE
done
}
*csvでループさせる例 [#f33c4769]
for X in `echo ${STOCKSHOP_AGENT} | tr -s ',' ' '`; do
sh ${JENKINS_HOME}/JenkinsTools/sh/release_detail_data_reset.sh ${stockshop_flg} ${STOCKSHOP_SEASON} ${X} ${skill_flg} 0 0 ${upgrade_flg} 0 0
done
*再帰的grep [#j85ab907]
function grp(){
find . -type f | xargs grep --color -n $1
}
*git init [#u7917c7b]
function git_init(){
git init
git commit --allow-empty -m 'first commit'
git checkout -b develop
}
*git flow用ブランチ作成ポカミス防止版 [#hf329112]
function mkb(){
echo '現在のブランチ': `git rev-parse --abbrev-ref @`
if [ `git rev-parse --abbrev-ref @` = "develop" ]; then
git pull
git checkout -b $1
else
echo "developブランチに切り替えてサイド実行してください"
echo "git checkout develop"
fi
}
*ファイルの中間を抜き出す [#g0178632]
function mid(){
head -n $3 $1 | tail -n $(($3 - $2 + 1))
}
* gitの日本語ファイル文字化けしなくする [#d5b0e796]
git config --global core.quotepath false
* gitのブランチ名取得 [#g6ede341]
git symbolic-ref --short HEAD
* gitで新規に、ブランチをpush [#i74a2ffc]
git push --set-upstream origin `git symbolic-ref --short HEAD`
* git push で毎回upstreamって効かれたくない場合 [#n5e710f7]
* git push で毎回upstreamって聞かれたくない場合 [#n5e710f7]
git config --global push.default current
* コマンドプロンプトの色付けとgitの色付け [#q954bd51]
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\u@\h \[\033[32m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
** 参考 [#h94a8f7e]
https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt
* gitでリベース [#b63f5442]
git pull --rebase origin develop
* macで複数ターミナルで、任意のコマンドを実行 [#tf79be82]
Dockerで、複数サーバを立ち上げ、それぞれのサーバの出力を見るため、
複数ターミナルで立ち上げたい。
そんな時に使える
以下を ~/new.sh として保存
#!/bin/sh
test $# -eq 0 && set -- :
osascript - "$(pwd)" "$@" <<\EOF
on run args
set dir to quoted form of (first item of args)
set cmd_strs to {}
repeat with cmd_str in rest of args
set end of cmd_strs to quoted form of cmd_str
end
set text item delimiters to " "
set cmd to cmd_strs as Unicode text
tell app "Terminal" to do script "cd " & dir & " && " & cmd
end
EOF
chmod +x ~/new.sh
** 使用例 [#z14c9275]
#!/bin/sh
cd ~/prj1
~/new.sh rails s -p 3000
~/new.sh rails s -p 3001
*** 引用元 [#ba8024e5]
https://teratail.com/questions/12738
*** シェルで、cdコマンドやる方法 [#o30f4036]
source コマンドを使えば可能
ちなみに、自分は、.bash_profileに
alias sb='soursce ~/.bash_profile'
エイリアスを入れている
*** 検索ではあんまり出ないbashの便利技 [#o51febe9]
https://qiita.com/rsooo/items/ef1d036bcc7282a66d7d
* curlコマンド文字化け対策 [#c9b71d77]
日本語を文字化けさせないため、一時ファイルを経由させる
#一時ファイルを作る
tmpfile=$(mktemp)
echo '{"id":5,"name":"りんご","price":1000,"imgPath":"peach.jpg"}' > $tmpfile
#生成した一時ファイルを削除する
function rm_tmpfile {
[[ -f "$tmpfile" ]] && rm -f "$tmpfile"
}
# 正常終了したとき
trap rm_tmpfile EXIT
# 異常終了したとき
trap 'trap - EXIT; rm_tmpfile; exit -1' INT PIPE TERM
curl http://localhost:8080/api/items -i -XPOST -H 'Content-Type:
application/json' --data-binary @"$tmpfile"
rm_tmpfile "$tmpfile"
* git pushを新規でも通す [#e328f7e8]
git push --set-upstream origin `git rev-parse --abbrev-ref HEAD`
* dockerに乗り込む [#l164a70b]
CONTAINER_ID=`docker ps | grep $docker_image_name | awk `$0=$1`
docker exec -it $CONTAINER_ID /bin/bash
* 文字列変換 [#ge93fd3b]
** パスカル形式からキャメル形式に変換 [#i1002574]
# パスカル形式からキャメル形式に変換
function pas_cam(){
echo $(tr '[:upper:]' '[:lower:]' <<< ${1:0:1})${1:1}
}
** キャメル形式からパスカル形式に変換 [#bd9aa1e4]
# キャメル形式からパスカル形式に変換
function cam_pas(){
echo $(tr '[:lower:]' '[:upper:]' <<< ${1:0:1})${1:1}
}
** キャメル形式からスネーク形式に変換 [#ceb59e51]
# キャメル形式からスネーク形式に変換
function cam_snake(){
echo $1|sed -E 's/(.)([A-Z])/\1_\2/g' | tr '[A-Z]' '[a-z]'
}
** スネーク形式からパスカル形式に変換 [#g69cbce1]
# スネーク形式からパスカル形式に変換
function snake_pas(){
echo $1|awk -F '_' '{ for(i=1; i<=NF; i++) {printf toupper(substr($i,1,1)) substr($i,2)}} END {print ""}'
}
** スネーク形式からキャメル形式に変換 [#v18d8e51]
# スネーク形式からキャメル形式に変換
function snake_cam(){
echo $1|awk -F '_' '{ printf $1; for(i=2; i<=NF; i++) {printf toupper(substr($i,1,1)) substr($i,2)}} END {print ""}'
}
** パスカル形式からケバブ形式に変換 [#ya484345]
# パスカル形式からケバブ形式に変換
function pas_keb(){
echo $1|sed -E 's/(.)([A-Z])/\1-\2/g' | tr '[A-Z]' '[a-z]'
}
** ケバブ形式からパスカル形式に変換 [#c1e5df2e]
# ケバブ形式からパスカル形式に変換
function keb_pas(){
echo $1|awk -F '-' '{ for(i=1; i<=NF; i++) {printf toupper(substr($i,1,1)) substr($i,2)}} END {print ""}'
}