du -ah --max-depth=1
-a
所有文件-h
人类能读懂的方式,会把数字转化成KB, MB等单位--max-depth=1
只显示1层date +%Y-%m-%d
以上命令可以输出诸如”2018-02-06”的日期,其中有更多的%X
可参考man date
,在所有这些格式化字符前需要有一个+
which ls # 返回 /bin/ls
Jacob Pan ( jacobpan3g.github.io/cn )
Git是一款分布式版本控制软件,相比Svn,我更喜欢git分布式的特性。
git init
git add
git commit
git pull
git push
git remote
通过配置可以让git更加个性化,而且更加好用,git的配置文件在~/.gitconfig
, 以下是我的配置
[core]
editor = vim
excludesfile = /home/jacob/.gitconf/gitignore
[color]
ui = true
[merge]
tool = vimdiff
[user]
name = YOUR_NAME
email = EMAIL@email.com
[push]
default = matching
core.editor
设置commit时的编辑器core.excludesfile
设置全局gitignore文件color.ui
使git status
时的输出结果有颜色merge.tool
merge时使用的工具user.name
和user.email
用户名字和邮箱,commit时需要记录用户信息,email用来区分由该次提交的作者以上可以通过编辑配置文件配置,也可以通过命令,如若配置user.email
git config --global user.email "you@example.com"
运行改命令后就会在~/.gitconfig
中生成相应的项。其中的--global
代表配置级别:
--system
更加高级的配置,这个是PC下所有用户都生效的配置,配置时需要管理员权限--global
用户Home的全局配置,只对当前用户生效,这种级别使用得最多--local
项目相关的配置,配置文件放在项目根目录下的.git/config
一些老版本git没有命令自动补全,可以在git源码(ps: 可以在github上找到)找到git-completion.bash
,在每次开机时source git-completion.bash
即可。
git里的bare仓库相当于svn中的服务器,可用于提交。其实,bare仓库就是我们项目中的.git/
,事实上,每一个git仓库抽取出来的.git/
都可以成为用于提交的bare仓库
git init --bare xxx.git
以上命令用来创建一个bare仓库,创建成功后,通过下面命令提交了
git remote add XXX 192.168.0.XX:path/to/xxx.git
git push XXX master
Jacob Pan ( jacobpan3g.github.io/cn )
Windows 8.1下有一个小缺陷,当安装一些软件时,会提示缺失api-ms-win-crt-heap-l1-1-0.dll
的问题时,是因为Windows 8.1缺了一个补丁。
Jacob Pan ( jacobpan3g.github.io/cn )
使用jekyll创建blog,建议在ubuntu下面搭建,因为十分方便,直接使用
# apt-get install jekyll
就可以安装好了,而不用想在其他平台下,先安装ruby,然后才能安装jekyll这么繁琐。
然后直接在github上或者jekyll官网上下载一个自己喜欢的blog模块,在根目录执行
$ jekyll serve
就可以在浏览器通过127.0.0.1:4000
访问本地的blog了
可以在blog根目录下创建一个img文件,把图片放在里面,然后在文章中使用路径/img/xxx.png
就可以访问到该图片的。
若使用jekyll serve
启动,只能在本机浏览器访问blog,而局域网内其他PC访问不了
jekyll serve -H 0.0.0.0
通过上述命令启动,就可以在局域网内其他PC通过当前IP地址来访问访问blog了;若需要改变端口,可使用-P选项。
Jacob Pan ( jacobpan3g.github.io/cn )
注意[]
内一定要两边留有空格,不然会报错,如
[! -f test.sh] # error
[ ! -f test.sh ]
一些常用的option如下:
文件
逻辑
更多条件判断,可见Shell脚本IF条件判断和判断条件总结
arr = "1 2 3"
for item in $arr
do
echo $item
done
while cmd
do
...
done
当cmd成功执行,$?
为0时,进入循环体。
无限循环可以这样写
while true; do
...
done
func()
{
echo $1
}
func "hello world"
shell脚本参数可以通过$0, $1, $2, ...
读取,其中$0
是脚本自己的名字,还有一些特殊参数
$#
参数的个数$@
参数的内容$*
参数的内容,但若是包在括号里"$*"
传入另一个函数,会被当做1整个字符串;而"$@"
会被当做多个参数(与没引号的$@
,$*
一致)可以通过下面arg.sh脚本验证:
arg()
{
echo $#
}
# arg.sh aaa bbb ccc
arg $@ # 3
arg $* # 3
arg "$@" # 3
arg "$*" # 1
getopts用来处理参数中的option的,使用实例如下:
while getopts "ac:h" opt
do
case $opt in
h) echo "hlep";;
a) echo "all";;
c) echo "create $OPTARG";;
?) echo "invalid option";;
esac
shift
done
#shift $(($OPTIND - 1))
上述例子主要是识别参数中的-a -c -h
选项,其中,-c
后面需跟参数,在代码中该参数保存在$OPTARG。注意,每次swich完记得要shift
,也可以在循环外面shift,如最后一行注释部分。
(ps: shell的case不需要加break,末尾的;;
就有break的作用;另外,;&
表示无条件继续,;;&
表示有条件继续,这两个特性在$BASH_VERSION=4.1.x
以上的版本才支持)
sleep 1 # 和下面1s一样
sleep 1s
sleep 1m # 睡眠1分钟
sleep 1h # 睡眠1小时
Jacob Pan ( jacobpan3g.github.io/cn )
xargs设计的初衷是从stdin中读取内容作为参数执行命令。
find . -type f | xargs rm
rm `find . type f`
第一条命令中,find命令的输出,通过xargs成为rm命令的参数,相比第二条使用起来更方便。
find . type f -exec rm '{}'
上述的find命令也可以达到同样的效果
-0
当stdin含有特殊字元时,将其当成一般字符,如/
, '
, 空格等
-t 在执行命令是先打印
-n
rm `find . -type f` #参数过长而报错
find . -type f | xargs -n 10 rm
如上面例子,参数过程时可以通过xargs把参数拆除多个子串分别rm
-i
相当于-n 1
, 然后还可以在命令用以{}
代替所读取参数的位置
ls | xargs -i echo {} hello
xargs 后面执行的命令只能是一条,不能带有;
, &&
等
ls | xargs -t -i [ -f {} ] && echo yes
根据输出,可以发现,&&
后面的命令被当做与xargs”并列”的命令,而不在xargs要执行的命令”并列”。
Jacob Pan ( jacobpan3g.github.io/cn )