おどらの家 发布的文章

经典语录

地图拉仇恨话语

  • 房价么,一直在跌的,价格越跌越高,每年微跌1%,5年价格翻番。
  • 房价不怎么涨的,但问题是当你发现涨的时候只有一种情况:那就是已经涨好了。
  • 请珍惜还能用货币置换到房子的年代吧。
  • 不是房子贵,而是看你用什么来换,你用钱,用草纸属性的东西来换?对不起,那只能天价了,钱这东西又没什么用的。
  • 房子不是我们最好的朋友,但却是唯一的朋友。
  • 弱市你还价很正常,那强市跳价不也很正常么?
  • 还价?珍惜那些不跳价卖的房子吧。
  • 请问,你买得到嘛?
  • 为什么要入袋为安?入袋的是货币你居然能安?换为真正的财富砖块了你还有啥不塌实?
  • 珍惜人们还在谈房价的时代吧,将来人们将只谈论房租的高低,房子是百姓能轻易买来买去的?太可笑了。
  • 内环的房子是为百姓准备的?可笑。
  • 请不要怀疑,你手上的80平米的房子,其实是豪宅!
  • 什么叫多军,你扪心自问一下,如果明天上海房价疯涨上天,普遍30万一平米,你是由衷高兴呢,还是后悔自己没多买点?如果你由衷开心,那你是多军。
  • 不动产就是让你买了别去动。放着。
  • 为什么要卖,只买不卖,任何一套房子都不会是多余的。
  • 我们下代每家很多房子,房子会多余?扯,你所有房子都抛了够换华府天地一套大平层么?不够吧,那还多余什么?一套舒适的房子都买不起,谈何房子多余?
  • 涨到的价格就是合理的价格!
  • 房子应该什么时候买?每一个现在,买房永远不算晚

欧神语录

  1. 30年等额本息是所有贷款中最优的选择,这是绝对,不存在争辩的余地。
  2. 利率对房价的影响最大上限不超过5%,这就是我们的结论。
  3. 人生真正的财富只有两种,陪伴孩子的时间和你花出去的钱。
  4. 一个国家的抢劫越少,则国家越富
  5. 第二套房贷在所有银行贷款中占比不到10% --- 2015-3-31
  6. (中国)全社会财富增长大概每年24%,这是一个令人绝望的速度
  7. (普通理财年收益5%)一生积累财富的最大上限约等于(年)工资额的10倍
  8. 只有大城市,才有房地产
  9. 在所有资产中,房地产是比较正和的游戏,不容易受到通货膨胀侵蚀,每年大概1%的折旧。
  10. 持有房产或土地,最大风险是地段的转换,每一次重心(中心)的转变,都足以将你碾得粉碎。
  11. 炒楼是降低房价的。
  12. 不要购买任何附加值。
  13. 房产不会升值,是货币在贬值。房产对冲的是会社会增发的货币。
  14. 纸币通胀,才是房价上涨的唯一动力。房价每年涨13%(通胀14%-1%折旧),每月1%,雷打不动。
  15. 职业炒家的四条纪律守则:一XXX,二绝不为品牌支付任何溢价,三初房情结,四不买学区房。
  16. 选择买房或持币的人,就象行车在二根轨道上面,一根向东,一根向西,越来越远,直至再也不能遥望分离,成为二个世界的人。
  17. 中介是一个谎言的世界。
  18. 换手量最大的是新房交房第一年,哪里有新房,哪里就有交易。
  19. 任何固话打来的中介都是王八蛋。
  20. 利率和房价没关系。
  21. 我们真实想卖房子,绝对不是2012年,暂且估计是2020年,也有可能是2030年
  22. 我们(房产投资)的主要策略,就是削减流动性到20%,然后尽可能争取低流动高回报产品
  23. 在任何一种情下,多军的资产负债率很难超过25%。
  24. 2005年以前,炒楼者最主要的精力投在判断楼盘品质的好坏,2005年以后,什么事都不做了,我们唯一的工作就是逼空。
  25. 对于多军来说,最大的障碍不是限购,不是房源和商机,而是心苦。
  26. 享受不给钱,良好一定坏。
  27. 加税周期,我们不出掉资产,而在减税周期才卖资产。
  28. 在这一个高通胀的年代,我们最需要的是借钱。
  29. 借钱有大宗小宗,房贷是大宗,信用卡是小宗,再怎么玩,终是小道。
  30. 炒楼的回报高,国为炒楼的人太少。
  31. 当我买下这套房子,感觉黑夜策马在高山悬崖。因为我知道,如今我生意失败的话,再也没有人可以救我。
  32. 所谓药单,房子本没有问题,而是指交易极其困难的房子。
  33. 房价越高,居民购买力越强。
  34. 破坏一个城市的最佳方法,除了战略轰炸机,就是低房租政策了 —— 英国政治家
  35. 一般来说,如果预期房租每5年翻一翻,房价应该是房租的1000-2000倍,7年翻一翻,是400-500倍
  36. 国之大富,多生产,少消费。
  37. 2N,无论多困苦,每年坚持要买2套房,大小不限。
  38. 没有财权,就没有人权 --- 铅笔社
  39. 等你发现差距时,差距已无可逆转。
  40. 买了就对了,贷了就赚了,笋盘就完美了。
  41. 经济学第一定律,dt>0,其中的t代表交易,交易越多越好。经济学第二定律,市场创造一切,除了市场本身,生产和抢劫是两条主线,抢劫所在之处,市场就不复存在。经济学第三定律,最终暴力无法消除,只能被尽量削减。你把这三条背下来,能不能领悟不重要,总有一天你会明白,政治权利高于经济权利,没有政治权利就没有一切,经济权利毫不重要。
  42. 在所有的资产中,升值最快的是债务,用贷款买房子,然后赌通货膨胀,是发财最快的方法。
  43. 孩子不是手段,孩子就是目的,孩子就是一切,生尽量多的孩子。
  • 几乎所有的教科书,都说“长期套利机会”是不可能存在的。
  • 但我们生活的是一个神奇的国度,一个神奇的时代。一个千年变革的国度,一个千年未遇的时代。
  • 在我们这个时代,至少发生了一次“伪”大型套利机会,虽然不是完美的例子,却符合了大多数的特征。他比天空还宽广,比大海还辽阔,饕餮盛宴,吃到盆满钵满。
  • 他至少要满足几个条件;
    1. 这个市场要很大
    2. 存在严重的扭曲
    3. 99%,甚至99.99%人口是愚蠢的。他们不知道这种扭曲。
  • 这其中,第三条才是最难的。
  • 很多人已经猜到了,这就是中国的房地产市场。
  • 房地产市场很大,这是毋庸置疑的。但很少有人承认,他是被“扭曲”的。

任志强语录

  1. 粉丝卖到鱼翅的价格才叫泡沫。
  2. 人人都买得起房 有其所者不应再买房
  3. 房地产商需要囤地 地里有粮心中才不慌
  4. 工资在涨GDP在涨房价不涨就不对
  5. 中国人太有钱,房子太便宜
  6. 我们只是当丫环的
  7. 宏观调控不为了让房价下跌,是为了稳涨
  8. 房价降了,房地产开发商有权不盖房
  9. 房地产就该是暴利行业
  10. 我是商人,不考虑穷人
  11. 没买房的人都亏了
  12. 中国可供开发的土地还有很多
  13. 高档房本来就是穷人买不起的
  14. 公布开发商成本等于让男人公布老婆的三围数据
  15. 我的房价不会降,让外地甚至境外富人来买房
  16. 买不起房为什么不回农村
  17. 严格来说开发商被强奸了
  18. 胸罩比房价贵

整理名词解释

  1. 2N:每年购买2套房产。
  2. 7090:地产调控政策“面积小于90平米的开发量不得少于70%。
  3. A5-A11:A:Asset,A5一万,A5.3三万,A6十万,A7一百万,A8一千万,A9一亿,A10十亿,A11一百亿
  4. ABC单:房东A,炒家B和接盘侠C。B在和A的合同交易时间截止日前找到交易方C。当真的交易之时,合同上显示为“A卖给C”。B是隐形的。
  5. CEO盘:一套房子的各项附加值做到了极致。(很难有人接盘)
  6. DS流:屌丝流
  7. GPGD:高评高贷
  8. IB:Install B,装逼
  9. IRR:Internal Rate of Return,内部收益率
  10. JH:结婚
  11. KC:(上海)康城
  12. KFS:开发商
  13. LH:离婚
  14. RETIs:房地产信托投资基金
  15. SPI:Shanghai PropertyInsight,上海房地产观察(公众号)
  16. VVDR:WDR,外地人
  17. XYK:信用卡
  18. XYD:信用贷
  19. YP:YP是上海话里“洋盘”的汉语拼音缩写。洋盘本来是外行意思,现指外地人。
  20. ZXC:(上海)众鑫城
  21. 拿衣服:naïve天真
  22. 砖本位:所谓砖本位,就是一切财富,以平方米㎡计算。其他财富,只要没变成砖头,统统都是伪财富。
  23. 航母编队:你的整个投资组合,其实类似于一个航母编队。以一艘核心战力的航母为中心,其他的舰船都是为航母服务的。
  24. 药单:因自身存在问题,而导致交易十分困难的房子。
  25. 解药:象解开绳索一样,层层化解,最终把房子本身的问题弄得干干净净。
  26. 凤变冰:凤姐变冰冰。基础理念就是:为迎合高租金支付者的口味而将房屋进行风格美化的过程。
  27. 处房情节:处房情结指某些人只买一手房,或者在价差极大的情况下仍坚持买一手房。
  28. 笋盘:以市场价的折扣价格买入房产。(欧神的建议:笋盘七折,非笋勿入。)
  29. 搭桥:
    • 本金A
    • 变成价值2A,但“流动性”非常不好的资产
    • 变成2A
  30. 截断:因房产升值,把30年期超优质按揭贷款截断,换成抵押贷款。
  31. 对敲:是指你将房屋卖给指定的亲友。一般是同学。

project based on nodejs

package.json cheat sheet

  • "name": "foo" // 包名称(全局唯一)
  • "private": true, // 阻止项目发布到www.npmjs.com
  • "main": "index.js" // 模块的入口,可通过require()加载
  • "bin": { "appname": "/path/to/appfile" } // 可执行文件路径
  • "bin": "/path/to/appdir/" // 可执行文件所在目录
  • "scripts": {"start": "ss -tnl"} // 脚本命令字典
  • "config": {"port": "8080"} // npm config set foo:port 8080
    // browser指定提供浏览器使用的版本(browserify打包)
  • "browser": {"tipso": "./node_modules/tipso/src/tipso.js"}

package.json some defaut config

  • "scripts": {"start": "node server.js"}
  • "scripts":{"preinstall": "node-gyp rebuild"}

use node_env variable

$ npm install cross-env --save-dev
$ cross-env NODE_ENV=development webpack --config build/webpack.config.js

History API

  • History.replaceState : 修改HIS栈最新的一项历史
  • History.pushState : 向HIS栈添加一个状态对象
  • PopStateEvent : 当前活动历史发生改变时触发

referrence

https://cnodejs.org/topic/56ed0cdf515e7305367f0df7
https://www.cnblogs.com/nullcc/p/5829218.html
https://developer.mozilla.org/zh-CN/docs/Web/API/History
https://github.com/browserify/browserify-handbook

BASH cheatsheet

####################

BASH CHEATSHEET (中文速查表) - by skywind (created on 2018/02/14)

Version: 43, Last Modified: 2018/04/02 17:00

https://github.com/skywind3000/awesome-cheatsheets

####################

####################

常用快捷键(默认使用 Emacs 键位)

####################

CTRL+A # 移动到行首,同
CTRL+B # 向后移动,同
CTRL+C # 结束当前命令
CTRL+D # 删除光标前的字符,同 ,或者没有内容时,退出会话
CTRL+E # 移动到行末,同
CTRL+F # 向前移动,同
CTRL+G # 退出当前编辑(比如正在 CTRL+R 搜索历史时)
CTRL+H # 删除光标左边的字符,同
CTRL+K # 删除光标位置到行末的内容
CTRL+L # 清屏并重新显示
CTRL+N # 移动到命令历史的下一行,同
CTRL+O # 类似回车,但是会显示下一行历史
CTRL+P # 移动到命令历史的上一行,同
CTRL+R # 历史命令反向搜索,使用 CTRL+G 退出搜索
CTRL+S # 历史命令正向搜索,使用 CTRL+G 退出搜索
CTRL+T # 交换前后两个字符
CTRL+U # 删除字符到行首
CTRL+V # 输入字符字面量,先按 CTRL+V 再按任意键
CTRL+W # 删除光标左边的一个单词
CTRL+X # 列出可能的补全
CTRL+Y # 粘贴前面 CTRL+u/k/w 删除过的内容
CTRL+Z # 暂停前台进程返回 bash,需要时可用 fg 将其切换回前台
CTRL+_ # 撤销(undo),有的终端将 CTRL+_ 映射为 CTRL+/ 或 CTRL+7

ALT+b # 向后(左边)移动一个单词
ALT+d # 删除光标后(右边)一个单词
ALT+f # 向前(右边)移动一个单词
ALT+t # 交换字符
ALT+BACKSPACE # 删除光标前面一个单词,类似 CTRL+W,但不影响剪贴板

CTRL+X CTRL+X # 连续按两次 CTRL+X,光标在当前位置和行首来回跳转
CTRL+X CTRL+E # 用你指定的编辑器,编辑当前命令

####################

BASH 基本操作

####################

exit # 退出当前登陆
env # 显示环境变量
echo $SHELL # 显示你在使用什么 SHELL

bash # 使用 bash,用 exit 返回
which bash # 搜索 $PATH,查找哪个程序对应命令 bash
whereis bash # 搜索可执行,头文件和帮助信息的位置,使用系统内建数据库
whatis bash # 查看某个命令的解释,一句话告诉你这是干什么的

clear # 清初屏幕内容
reset # 重置终端(当你不小心 cat 了一个二进制,终端状态乱掉时使用)

####################

目录操作

####################

cd # 返回自己 $HOME 目录
cd {dirname} # 进入目录
pwd # 显示当前所在目录
mkdir {dirname} # 创建目录
mkdir -p {dirname} # 递归创建目录
pushd {dirname} # 目录压栈并进入新目录
popd # 弹出并进入栈顶的目录
dirs -v # 列出当前目录栈
cd - # 回到之前的目录
cd -{N} # 切换到目录栈中的第 N个目录,比如 cd -2 将切换到第二个

####################

文件操作

####################

ls # 显示当前目录内容,后面可接目录名:ls {dir} 显示指定目录
ls -l # 列表方式显示目录内容,包括文件日期,大小,权限等信息
ls -a # 显示所有文件和目录,包括隐藏文件(.开头的文件/目录名)
ln -s {fn} {link} # 给指定文件创建一个软链接
cp {src} {dest} # 拷贝文件,cp -r dir1 dir2 可以递归拷贝(目录)
rm {fn} # 删除文件,rm -r 递归删除目录,rm -f 强制删除
mv {src} {dest} # 移动文件,如果 dest 是目录,则移动,是文件名则覆盖
touch {fn} # 创建或者更新一下制定文件
cat {fn} # 输出文件原始内容
any_cmd > {fn} # 执行任意命令并将标准输出重定向到指定文件
more {fn} # 逐屏显示某文件内容,空格翻页,q 退出
less {fn} # 更高级点的 more,更多操作,q 退出
head {fn} # 显示文件头部数行,可用 head -3 abc.txt 显示头三行
tail {fn} # 显示文件尾部数行,可用 tail -3 abc.txt 显示尾部三行
tail -f {fn} # 持续显示文件尾部数据,可用于监控日志
nano {fn} # 使用 nano 编辑器编辑文件
vim {fn} # 使用 vim 编辑文件
diff {f1} {f2} # 比较两个文件的内容
wc {fn} # 统计文件有多少行,多少个单词
chmod 644 {fn} # 修改文件权限为 644,可以接 -R 对目录循环改权限
chgrp group {fn} # 修改文件所属的用户组
chown user1 {fn} # 修改文件所有人为 user1, chown user1:group1 fn 可以修改组
file {fn} # 检测文件的类型和编码
basename {fn} # 查看文件的名字(不包括路径)
dirname {fn} # 查看文件的路径(不包括名字)
grep {pat} {fn} # 在文件中查找出现过 pat 的内容
grep -r {pat} . # 在当前目录下递归查找所有出现过 pat 的文件内容
stat {fn} # 显示文件的详细信息

####################

用户管理

####################

whoami # 显示我的用户名
who # 显示已登陆用户信息,w / who / users 内容略有不同
w # 显示已登陆用户信息,w / who / users 内容略有不同
users # 显示已登陆用户信息,w / who / users 内容略有不同
passwd # 修改密码,passwd {user} 可以用于 root 修改别人密码
finger {user} # 显示某用户信息,包括 id, 名字, 登陆状态等
adduser {user} # 添加用户
deluser {user} # 删除用户
w # 查看谁在线
su # 切换到 root 用户
su - # 切换到 root 用户并登陆(执行登陆脚本)
su {user} # 切换到某用户
su -{user} # 切换到某用户并登陆(执行登陆脚本)
id {user} # 查看用户的 uid,gid 以及所属其他用户组
id -u {user} # 打印用户 uid
id -g {user} # 打印用户 gid
write {user} # 向某用户发送一句消息
last # 显示最近用户登陆列表
last {user} # 显示登陆记录
lastb # 显示失败登陆记录
lastlog # 显示所有用户的最近登陆记录
sudo {command} # 以 root 权限执行某命令

####################

进程管理

####################

ps # 查看当前会话进程
ps ax # 查看所有进程,类似 ps -e
ps aux # 查看所有进程详细信息,类似 ps -ef
ps auxww # 查看所有进程,并且显示进程的完整启动命令
ps -u {user} # 查看某用户进程
ps axjf # 列出进程树
ps xjf -u {user} # 列出某用户的进程树
ps -eo pid,user,command # 按用户指定的格式查看进程
ps aux | grep httpd # 查看名为 httpd 的所有进程
ps --ppid {pid} # 查看父进程为 pid 的所有进程
pstree # 树形列出所有进程,pstree 默认一般不带,需安装
pstree {user} # 进程树列出某用户的进程
pstree -u # 树形列出所有进程以及所属用户
pgrep {procname} # 搜索名字匹配的进程的 pid,比如 pgrep apache2

kill {pid} # 结束进程
kill -9 {pid} # 强制结束进程,9/SIGKILL 是强制不可捕获结束信号
kill -KILL {pid} # 强制执行进程,kill -9 的另外一种写法
kill -l # 查看所有信号
kill -l TERM # 查看 TERM 信号的编号
killall {procname} # 按名称结束所有进程
pkill {procname} # 按名称结束进程,除名称外还可以有其他参数

top # 查看最活跃的进程
top -u {user} # 查看某用户最活跃的进程

any_command & # 在后台运行某命令,也可用 CTRL+Z 将当前进程挂到后台
jobs # 查看所有后台进程(jobs)
bg # 查看后台进程,并切换过去
fg # 切换后台进程到前台
fg {job} # 切换特定后台进程到前台

trap cmd sig1 sig2 # 在脚本中设置信号处理命令
trap "" sig1 sig2 # 在脚本中屏蔽某信号
trap - sig1 sig2 # 恢复默认信号处理行为

nohup {command} # 长期运行某程序,在你退出登陆都保持它运行
nohup {command} & # 在后台长期运行某程序
disown {PID|JID} # 将进程从后台任务列表(jobs)移除

wait # 等待所有后台进程任务结束

####################

常用命令:SSH / 系统信息 / 网络

####################

ssh user@host # 以用户 user 登陆到远程主机 host
ssh -p {port} user@host # 指定端口登陆主机
ssh-copy-id user@host # 拷贝你的 ssh key 到远程主机,避免重复输入密码
scp {fn} user@host:path # 拷贝文件到远程主机
scp user@host:path dest # 从远程主机拷贝文件回来
scp -P {port} ... # 指定端口远程拷贝文件

uname -a # 查看内核版本等信息
man {help} # 查看帮助
man -k {keyword} # 查看哪些帮助文档里包含了该关键字
info {help} # 查看 info pages,比 man 更强的帮助系统
uptime # 查看系统启动时间
date # 显示日期
cal # 显示日历
vmstat # 显示内存和 CPU 使用情况
vmstat 10 # 每 10 秒打印一行内存和 CPU情况,CTRL+C 退出
free # 显示内存和交换区使用情况
df # 显示磁盘使用情况
du # 显示当前目录占用,du . --max-depth=2 可以指定深度
uname # 显示系统版本号
hostname # 显示主机名称
showkey -a # 查看终端发送的按键编码

ping {host} # ping 远程主机并显示结果,CTRL+C 退出
ping -c N {host} # ping 远程主机 N 次
traceroute {host} # 侦测路由连通情况
mtr {host} # 高级版本 traceroute
host {domain} # DNS 查询,{domain} 前面可加 -a 查看详细信息
whois {domain} # 取得域名 whois 信息
dig {domain} # 取得域名 dns 信息
route -n # 查看路由表
netstat -a # 列出所有端口
netstat -an # 查看所有连接信息,不解析域名
netstat -anp # 查看所有连接信息,包含进程信息(需要 sudo)
netstat -l # 查看所有监听的端口
netstat -t # 查看所有 TCP 链接
netstat -lntu # 显示所有正在监听的 TCP 和 UDP 信息
netstat -lntup # 显示所有正在监听的 socket 及进程信息
netstat -i # 显示网卡信息
netstat -rn # 显示当前系统路由表,同 route -n
ss -an # 比 netstat -an 更快速更详细
ss -s # 统计 TCP 的 established, wait 等

wget {url} # 下载文件,可加 --no-check-certificate 忽略 ssl 验证
wget -qO- {url} # 下载文件并输出到标准输出(不保存)
curl -sL {url} # 同 wget -qO- {url} 没有 wget 的时候使用

sz {file} # 发送文件到终端,zmodem 协议
rz # 接收终端发送过来的文件

####################

变量操作

####################

varname=value # 定义变量
varname=value command # 定义子进程变量并执行子进程
echo $varname # 查看变量内容
echo $$ # 查看当前 shell 的进程号
echo $! # 查看最近调用的后台任务进程号
echo $? # 查看最近一条命令的返回码
export VARNAME=value # 设置环境变量(将会影响到子进程)

array[

${array[i]} # 取得数组中的元素
${#array[@]} # 取得数组的长度
${#array[i]} # 取得数组中某个变量的长度

declare -a # 查看所有数组
declare -f # 查看所有函数
declare -F # 查看所有函数,仅显示函数名
declare -i # 查看所有整数
declare -r # 查看所有只读变量
declare -x # 查看所有被导出成环境变量的东西
declare -p varname # 输出变量是怎么定义的(类型+值)

${varname:-word} # 如果变量不为空则返回变量,否则返回 word
${varname:=word} # 如果变量不为空则返回变量,否则赋值成 word 并返回
${varname:?message} # 如果变量不为空则返回变量,否则打印错误信息并退出
${varname:+word} # 如果变量不为空则返回 word,否则返回 null
${varname:offset:len} # 取得字符串的子字符串

${variable#pattern} # 如果变量头部匹配 pattern,则删除最小匹配部分返回剩下的
${variable##pattern} # 如果变量头部匹配 pattern,则删除最大匹配部分返回剩下的
${variable%pattern} # 如果变量尾部匹配 pattern,则删除最小匹配部分返回剩下的
${variable%%pattern} # 如果变量尾部匹配 pattern,则删除最大匹配部分返回剩下的
${variable/pattern/str} # 将变量中第一个匹配 pattern 的替换成 str,并返回
${variable//pattern/str} # 将变量中所有匹配 pattern 的地方替换成 str 并返回

${#varname} # 返回字符串长度

*(patternlist) # 零次或者多次匹配
+(patternlist) # 一次或者多次匹配
?(patternlist) # 零次或者一次匹配
@(patternlist) # 单词匹配
!(patternlist) # 不匹配

array=($text) # 按空格分隔 text 成数组,并赋值给变量
IFS="/" array=($text) # 按斜杆分隔字符串 text 成数组,并赋值给变量
text="${array[]}" # 用空格链接数组并赋值给变量
text=$(IFS=/; echo "${array[
]}") # 用斜杠链接数组并赋值给变量

$(UNIX command) # 运行命令,并将标准输出内容捕获并返回
varname=$(id -u user) # 将用户名为 user 的 uid 赋值给 varname 变量

num=$(expr 1 + 2) # 兼容 posix sh 的计算,使用 expr 命令计算结果
num=$(expr $num + 1) # 数字自增
expr 2 * ( 2 + 3 ) # 兼容 posix sh 的复杂计算,输出 10

num=$((1 + 2)) # 计算 1+2 赋值给 num,使用 bash 独有的 $((..)) 计算
num=$(($num + 1)) # 变量递增
num=$((num + 1)) # 变量递增,双括号内的 $ 可以省略
num=$((1 + (2 + 3) * 2)) # 复杂计算

####################

事件指示符

####################

!! # 上一条命令
!^ # 上一条命令的第一个单词
!$ # 上一条命令的最后一个单词
!string # 最近一条包含string的命令
!^string1^string2 # 最近一条包含string1的命令, 快速替换为string2, 相当于!!:s/string1/string2/
!# # 本条命令之前所有的输入内容

####################

函数

####################

定义一个新函数

function myfunc() {
# $1 代表第一个参数,$N 代表第 N 个参数
# $# 代表参数个数
# $0 代表被调用者自身的名字
# $@ 代表所有参数,类型是个数组,想传递所有参数给其他命令用 cmd "$@"
# $* 空格链接起来的所有参数,类型是字符串
{shell commands ...}
}

myfunc # 调用函数 myfunc
myfunc arg1 arg2 arg3 # 带参数的函数调用
myfunc "$@" # 将所有参数传递给函数
shift # 参数左移

unset -f myfunc # 删除函数
declare -f # 列出函数定义

####################

条件判断(兼容 posix sh 的条件判断):man test

####################

statement1 && statement2 # and 操作符
statement1 || statement2 # or 操作符

exp1 -a exp2 # exp1 和 exp2 同时为真时返回真(POSIX XSI扩展)
exp1 -o exp2 # exp1 和 exp2 有一个为真就返回真(POSIX XSI扩展)
( expression ) # 如果 expression 为真时返回真,输入注意括号前反斜杆
! expression # 如果 expression 为假那返回真

str1 = str2 # 判断字符串相等,如 [ "$x" = "$y" ] && echo yes
str1 != str2 # 判断字符串不等,如 [ "$x" != "$y" ] && echo yes
str1 < str2 # 字符串小于,如 [ "$x" < "$y" ] && echo yes
str2 > str2 # 字符串大于,注意 < 或 > 是字面量,输入时要加反斜杆
-n str1 # 判断字符串不为空(长度大于零)
-z str1 # 判断字符串为空(长度等于零)

-a file # 判断文件存在,如 [ -a /tmp/abc ] && echo "exists"
-d file # 判断文件存在,且该文件是一个目录
-e file # 判断文件存在,和 -a 等价
-f file # 判断文件存在,且该文件是一个普通文件(非目录等)
-r file # 判断文件存在,且可读
-s file # 判断文件存在,且尺寸大于0
-w file # 判断文件存在,且可写
-x file # 判断文件存在,且执行
-N file # 文件上次修改过后还没有读取过
-O file # 文件存在且属于当前用户
-G file # 文件存在且匹配你的用户组
file1 -nt file2 # 文件1 比 文件2 新
file1 -ot file2 # 文件1 比 文件2 旧

num1 -eq num2 # 数字判断:num1 == num2
num1 -ne num2 # 数字判断:num1 != num2
num1 -lt num2 # 数字判断:num1 < num2
num1 -le num2 # 数字判断:num1 <= num2
num1 -gt num2 # 数字判断:num1 > num2
num1 -ge num2 # 数字判断:num1 >= num2

####################

分支控制:if 和经典 test,兼容 posix sh 的条件判断语句

####################

test {expression} # 判断条件为真的话 test 程序返回0 否则非零
[ expression ] # 判断条件为真的话返回0 否则非零

test "abc" = "def" # 查看返回值 echo $? 显示 1,因为条件为假
test "abc" != "def" # 查看返回值 echo $? 显示 0,因为条件为真

test -a /tmp; echo $? # 调用 test 判断 /tmp 是否存在,并打印 test 的返回值
[ -a /tmp ]; echo $? # 和上面完全等价,/tmp 肯定是存在的,所以输出是 0

test cond && cmd1 # 判断条件为真时执行 cmd1
[ cond ] && cmd1 # 和上面完全等价
[ cond ] && cmd1 || cmd2 # 条件为真执行 cmd1 否则执行 cmd2

判断 /etc/passwd 文件是否存在

经典的 if 语句就是判断后面的命令返回值为0的话,认为条件为真,否则为假

if test -e /etc/passwd; then
echo "alright it exists ... "
else
echo "it doesn't exist ... "
fi

和上面完全等价,[ 是个和 test 一样的可执行程序,但最后一个参数必须为 ]

这个名字为 "[" 的可执行程序一般就在 /bin 或 /usr/bin 下面,比 test 优雅些

if [ -e /etc/passwd ]; then
echo "alright it exists ... "
else
echo "it doesn't exist ... "
fi

和上面两个完全等价,其实到 bash 时代 [ 已经是内部命令了,用 enable 可以看到

[ -e /etc/passwd ] && echo "alright it exists" || echo "it doesn't exist"

判断变量的值

if [ "$varname" = "foo" ]; then
echo "this is foo"
elif [ "$varname" = "bar" ]; then
echo "this is bar"
else
echo "neither"
fi

复杂条件判断,注意 || 和 && 是完全兼容 POSIX 的推荐写法

if [ $x -gt 10 ] && [ $x -lt 20 ]; then
echo "yes, between 10 and 20"
fi

可以用 && 命令连接符来做和上面完全等价的事情

[ $x -gt 10 ] && [ $x -lt 20 ] && echo "yes, between 10 and 20"

小括号和 -a -o 是 POSIX XSI 扩展写法,小括号是字面量,输入时前面要加反斜杆

if [ ( $x -gt 10 ) -a ( $x -lt 20 ) ]; then
echo "yes, between 10 and 20"
fi

同样可以用 && 命令连接符来做和上面完全等价的事情

[ ( $x -gt 10 ) -a ( $x -lt 20 ) ] && echo "yes, between 10 and 20"

判断程序存在的话就执行

[ -x /bin/ls ] && /bin/ls -l

如果不考虑兼容 posix sh 和 dash 这些的话,可用 bash 独有的 ((..)) 和 [[..]]:

https://www.ibm.com/developerworks/library/l-bash-test/index.html

####################

流程控制:while / for / case / until

####################

while 循环

while condition; do
statements
done

i=1
while [ $i -le 10 ]; do
echo $i;
i=$(expr $i + 1)
done

for 循环:上面的 while 语句等价

for i in {1..10}; do
echo $i
done

for name [in list]; do
statements
done

for 列举某目录下面的所有文件

for f in /home/*; do
echo $f
done

bash 独有的 (( .. )) 语句,更接近 C 语言,但是不兼容 posix sh

for (( initialisation ; ending condition ; update )); do
statements
done

和上面的写法等价

for ((i = 0; i < 10; i++)); do echo $i; done

case 判断

case expression in
pattern1 )
statements ;;
pattern2 )
statements ;;
* )
otherwise ;;
esac

until 语句

until condition; do
statements
done

select 语句

select name [in list]; do
statements that can use $name
done

####################

命令处理

####################

command ls # 忽略 alias 直接执行程序或者内建命令 ls
builtin cd # 忽略 alias 直接运行内建的 cd 命令
enable # 列出所有 bash 内置命令,或禁止某命令
help {builtin_command} # 查看内置命令的帮助(仅限 bash 内置命令)

eval $script # 对 script 变量中的字符串求值(执行)

####################

输出/输入 重定向

####################

cmd1 | cmd2 # 管道,cmd1 的标准输出接到 cmd2 的标准输入
< file # 将文件内容重定向为命令的标准输入

file # 将命令的标准输出重定向到文件,会覆盖文件

file # 将命令的标准输出重定向到文件,追加不覆盖
| file # 强制输出到文件,即便设置过:set -o noclobber
n>| file # 强制将文件描述符 n的输出重定向到文件
<> file # 同时使用该文件作为标准输入和标准输出
n<> file # 同时使用文件作为文件描述符 n 的输出和输入
n> file # 重定向文件描述符 n 的输出到文件
n< file # 重定向文件描述符 n 的输入为文件内容
n>& # 将标准输出 dup/合并 到文件描述符 n
n<& # 将标准输入 dump/合并 定向为描述符 n
n>&m # 文件描述符 n 被作为描述符 m 的副本,输出用
n<&m # 文件描述符 n 被作为描述符 m 的副本,输入用
&>file # 将标准输出和标准错误重定向到文件
<&- # 关闭标准输入
&- # 关闭标准输出
n>&- # 关闭作为输出的文件描述符 n
n<&- # 关闭作为输入的文件描述符 n
diff <(cmd1) <(cmd2) # 比较两个命令的输出

####################

文本处理 - cut

####################

cut -c 1-16 # 截取每行头16个字符
cut -c 1-16 file # 截取指定文件中每行头 16个字符
cut -c3- # 截取每行从第三个字符开始到行末的内容
cut -d':' -f5 # 截取用冒号分隔的第五列内容
cut -d';' -f2,10 # 截取用分号分隔的第二和第十列内容
cut -d' ' -f3-7 # 截取空格分隔的三到七列
echo "hello" | cut -c1-3 # 显示 hel
echo "hello sir" | cut -d' ' -f2 # 显示 sir
ps | tr -s " " | cut -d " " -f 2,3,4 # cut 搭配 tr 压缩字符

####################

文本处理 - awk / sed

####################

awk '{print $5}' file # 打印文件中以空格分隔的第五列
awk -F ',' '{print $5}' file # 打印文件中以逗号分隔的第五列
awk '/str/ {print $2}' file # 打印文件中包含 str 的所有行的第二列
awk -F ',' '{print $NF}' file # 打印逗号分隔的文件中的每行最后一列
awk '{s+=$1} END {print s}' file # 计算所有第一列的合
awk 'NR%3==1' file # 从第一行开始,每隔三行打印一行

sed 's/find/replace/' file # 替换文件中首次出现的字符串并输出结果
sed '10s/find/replace/' file # 替换文件第 10 行内容
sed '10,20s/find/replace/' file # 替换文件中 10-20 行内容
sed -r 's/regex/replace/g' file # 替换文件中所有出现的字符串
sed -i 's/find/replace/g' file # 替换文件中所有出现的字符并且覆盖文件
sed '/line/s/find/replace/' file # 先搜索行特征再执行替换
sed -e 's/f/r/' -e 's/f/r' file # 执行多次替换
sed 's#find#replace#' file # 使用 # 替换 / 来避免 pattern 中有斜杆
sed -i -r 's/^\s+//g' file # 删除文件每行头部空格
sed '/^$/d' file # 删除文件空行并打印
sed -i 's/\s+$//' file # 删除文件每行末尾多余空格
sed -n '2p' file # 打印文件第二行
sed -n '2,5p' file # 打印文件第二到第五行

####################

排序 - sort

####################

sort file # 排序文件
sort -r file # 反向排序(降序)
sort -n file # 使用数字而不是字符串进行比较
sort -t: -k 3n /etc/passwd # 按 passwd 文件的第三列进行排序
sort -u file # 去重排序

####################

快速跳转 - https://github.com/rupa/z

####################

source /path/to/z.sh # .bashrc 中初始化 z.sh
z # 列出所有历史路径以及他们的权重
z foo # 跳到历史路径中匹配 foo 的权重最大的目录
z foo bar # 跳到历史路径中匹配 foo 和 bar 权重最大的目录
z -l foo # 列出所有历史路径中匹配 foo 的目录及权重
z -r foo # 按照最高访问次数优先进行匹配跳转
z -t foo # 按照最近访问优先进行匹配跳转

####################

键盘绑定

####################

bind '"\eh":"\C-b"' # 绑定 ALT+h 为光标左移,同 CTRL+b /
bind '"\el":"\C-f"' # 绑定 ALT+l 为光标右移,同 CTRL+f /
bind '"\ej":"\C-n"' # 绑定 ALT+j 为下条历史,同 CTRL+n /
bind '"\ek":"\C-p"' # 绑定 ALT+k 为上条历史,同 CTRL+p /
bind '"\eH":"\eb"' # 绑定 ALT+H 为光标左移一个单词,同 ALT-b
bind '"\eL":"\ef"' # 绑定 ALT+L 为光标右移一个单词,同 ALT-f
bind '"\eJ":"\C-a"' # 绑定 ALT+J 为移动到行首,同 CTRL+a /
bind '"\eK":"\C-e"' # 绑定 ALT+K 为移动到行末,同 CTRL+e /
bind '"\e;":"ls -l\n"' # 绑定 ALT+; 为执行 ls -l 命令

####################

网络管理:ip / ifconfig / nmap ...

####################

ip a # 显示所有网络地址,同 ip address
ip a show eth1 # 显示网卡 IP 地址
ip a add 172.16.1.23/24 dev eth1 # 添加网卡 IP 地址
ip a del 172.16.1.23/24 dev eth1 # 删除网卡 IP 地址
ip link show dev eth0 # 显示网卡设备属性
ip link set eth1 up # 激活网卡
ip link set eth1 down # 关闭网卡
ip link set eth1 address {mac} # 修改 MAC 地址
ip neighbour # 查看 ARP 缓存
ip route # 查看路由表
ip route add 10.1.0.0/24 via 10.0.0.253 dev eth0 # 添加静态路由
ip route del 10.1.0.0/24 # 删除静态路由

ifconfig # 显示所有网卡和接口信息
ifconfig -a # 显示所有网卡(包括开机没启动的)信息
ifconfig eth0 # 指定设备显示信息
ifconfig eth0 up # 激活网卡
ifconfig eth0 down # 关闭网卡
ifconfig eth0 192.168.120.56 # 给网卡配置 IP 地址
ifconfig eth0 10.0.0.8 netmask 255.255.255.0 up # 配置 IP 并启动
ifconfig eth0 hw ether 00:aa:bb:cc:dd:ee # 修改 MAC 地址

nmap 10.0.0.12 # 扫描主机 1-1000 端口
nmap -p 1024-65535 10.0.0.12 # 扫描给定端口
nmap 10.0.0.0/24 # 给定网段扫描局域网内所有主机
nmap -O -sV 10.0.0.12 # 探测主机服务和操作系统版本

####################

有趣的命令

####################

man hier # 查看文件系统的结构和含义
man test # 查看 posix sh 的条件判断帮助
man ascii # 显示 ascii 表
getconf LONG_BIT # 查看系统是 32 位还是 64 位
bind -P # 列出所有 bash 的快捷键
mount | column -t # 漂亮的列出当前加载的文件系统
curl ip.cn # 取得外网 ip 地址和服务商信息
disown -a && exit # 关闭所有后台任务并退出
cat /etc/issue # 查看 Linux 发行版信息
lsof -i port:80 # 哪个程序在使用 80 端口?
showkey -a # 取得按键的 ASCII 码
svn diff | view - # 使用 Vim 来显示带色彩的 diff 输出
mv filename.{old,new} # 快速文件改名
time read # 使用 CTRL-D 停止,最简单的计时功能
cp file.txt{,.bak} # 快速备份文件
sudo touch /forcefsck # 强制在下次重启时扫描磁盘
find ~ -mmin 60 -type f # 查找 $HOME 目录中,60 分钟内修改过的文件
curl wttr.in/~beijing # 查看北京的天气预报
echo ${SSH_CLIENT%% *} # 取得你是从什么 IP 链接到当前主机上的
echo $[RANDOM%X+1] # 取得 1 到 X 之间的随机数
bind -x '"\C-l":ls -l' # 设置 CTRL+l 为执行 ls -l 命令
find / -type f -size +5M # 查找大于 5M 的文件
chmod --reference f1 f2 # 将 f2 的权限设置成 f1 一模一样的
curl -L cheat.sh # 速查表大全

####################

常用技巧

####################

列出最常使用的命令

history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head

列出所有网络状态:ESTABLISHED / TIME_WAIT / FIN_WAIT1 / FIN_WAIT2

netstat -n | awk '/^tcp/ {++tt[$NF]} END {for (a in tt) print a, tt[a]}'

通过 SSH 来 mount 文件系统

sshfs name@server:/path/to/folder /path/to/mount/point

显示前十个运行的进程并按内存使用量排序

ps aux | sort -nk +4 | tail

在右上角显示时钟

while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done&

从网络上的压缩文件中解出一个文件来,并避免保存中间文件

wget -qO - "http://www.tarball.com/tarball.gz" | tar zxvf -

性能测试:测试处理器性能

python -c "import test.pystone;print(test.pystone.pystones())"

性能测试:测试内存带宽

dd if=/dev/zero of=/dev/null bs=1M count=32768

Linux 下挂载一个 iso 文件

mount /path/to/file.iso /mnt/cdrom -oloop

通过主机 A 直接 ssh 到主机 B

ssh -t hostA ssh hostB

下载一个网站的所有图片

wget -r -l1 --no-parent -nH -nd -P/tmp -A".gif,.jpg" http://example.com/images

快速创建项目目录

mkdir -p work/{project1,project2}/{src,bin,bak}

按日期范围查找文件

find . -type f -newermt "2010-01-01" ! -newermt "2010-06-01"

显示当前正在使用网络的进程

lsof -P -i -n | cut -f 1 -d " "| uniq | tail -n +2

Vim 中保存一个没有权限的文件

:w !sudo tee > /dev/null %

在 .bashrc / .bash_profile 中加载另外一个文件(比如你保存在 github 上的配置)

source ~/github/profiles/my_bash_init.sh

终端下正确设置 ALT 键和 BackSpace 键

http://www.skywind.me/blog/archives/2021

####################

有用的函数

####################

自动解压:判断文件后缀名并调用相应解压命令

function q-extract() {
if [ -f $1 ] ; then
case $1 in
*.tar.bz2) tar -xvjf $1 ;;
*.tar.gz) tar -xvzf $1 ;;
*.tar.xz) tar -xvJf $1 ;;
*.bz2) bunzip2 $1 ;;
*.rar) rar x $1 ;;
*.gz) gunzip $1 ;;
*.tar) tar -xvf $1 ;;
*.tbz2) tar -xvjf $1 ;;
*.tgz) tar -xvzf $1 ;;
*.zip) unzip $1 ;;
*.Z) uncompress $1 ;;
*.7z) 7z x $1 ;;
*) echo "don't know how to extract '$1'..." ;;
esac
else
echo "'$1' is not a valid file!"
fi
}

自动压缩:判断后缀名并调用相应压缩程序

function q-compress() {
if [ -n "$1" ] ; then
FILE=$1
case $FILE in
.tar) shift && tar -cf $FILE $ ;;
.tar.bz2) shift && tar -cjf $FILE $ ;;
.tar.xz) shift && tar -cJf $FILE $ ;;
.tar.gz) shift && tar -czf $FILE $ ;;
.tgz) shift && tar -czf $FILE $ ;;
.zip) shift && zip $FILE $ ;;
.rar) shift && rar $FILE $ ;;
esac
else
echo "usage: q-compress <foo.tar.gz> ./foo ./bar"
fi
}

漂亮的带语法高亮的 color cat ,需要先 pip install pygments

function ccat() {
local style="monokai"
if [ $# -eq 0 ]; then
pygmentize -P style=$style -P tabsize=4 -f terminal256 -g
else
for NAME in $@; do
pygmentize -P style=$style -P tabsize=4 -f terminal256 -g "$NAME"
done
fi
}

####################

好玩的配置

####################

放到你的 ~/.bashrc 配置文件中,给 man 增加漂亮的色彩高亮

export LESS_TERMCAP_mb=$'\E[1m\E[32m'
export LESS_TERMCAP_mh=$'\E[2m'
export LESS_TERMCAP_mr=$'\E[7m'
export LESS_TERMCAP_md=$'\E[1m\E[36m'
export LESS_TERMCAP_ZW=""
export LESS_TERMCAP_us=$'\E[4m\E[1m\E[37m'
export LESS_TERMCAP_me=$'\E(B\E[m'
export LESS_TERMCAP_ue=$'\E[24m\E(B\E[m'
export LESS_TERMCAP_ZO=""
export LESS_TERMCAP_ZN=""
export LESS_TERMCAP_se=$'\E[27m\E(B\E[m'
export LESS_TERMCAP_ZV=""
export LESS_TERMCAP_so=$'\E[1m\E[33m\E[44m'

ALT+hjkl/HJKL 快速移动光标,将下面内容添加到 ~/.inputrc 中可作用所有工具,

包括 bash/zsh/python/lua 等使用 readline 的工具,帮助见:info rluserman

"\eh": backward-char
"\el": forward-char
"\ej": next-history
"\ek": previous-history
"\eH": backward-word
"\eL": forward-word
"\eJ": beginning-of-line
"\eK": end-of-line

####################

References

####################

https://github.com/Idnan/bash-guide
http://www.linuxstall.com/linux-command-line-tips-that-every-linux-user-should-know/
https://ss64.com/bash/syntax-keyboard.html
http://wiki.bash-hackers.org/commands/classictest
https://www.ibm.com/developerworks/library/l-bash-test/index.html
https://www.cyberciti.biz/faq/bash-loop-over-file/
https://linuxconfig.org/bash-scripting-tutorial
https://github.com/LeCoupa/awesome-cheatsheets/blob/master/languages/bash.sh
https://devhints.io/bash
https://github.com/jlevy/the-art-of-command-line
https://yq.aliyun.com/articles/68541

vim: set ts=4 sw=4 tw=0 et :

config for minTTY

color redefine

minTTY终端可以重新定义ANSI颜色值

echo -ne '\e]4;0;#000000\a'   # black
echo -ne '\e]4;1;#BF0000\a'   # red
echo -ne '\e]4;2;#00BF00\a'   # green
echo -ne '\e]4;3;#BFBF00\a'   # yellow
echo -ne '\e]4;4;#0000BF\a'   # blue
echo -ne '\e]4;5;#BF00BF\a'   # magenta
echo -ne '\e]4;6;#00BFBF\a'   # cyan
echo -ne '\e]4;7;#BFBFBF\a'   # white (light grey really)
echo -ne '\e]4;8;#404040\a'   # bold black (i.e. dark grey)
echo -ne '\e]4;9;#FF4040\a'   # bold red
echo -ne '\e]4;10;#40FF40\a'  # bold green
echo -ne '\e]4;11;#FFFF40\a'  # bold yellow
echo -ne '\e]4;12;#6060FF\a'  # bold blue
echo -ne '\e]4;13;#FF40FF\a'  # bold magenta
echo -ne '\e]4;14;#40FFFF\a'  # bold cyan
echo -ne '\e]4;15;#FFFFFF\a'  # bold white

参考资料

  • https://en.wikipedia.org/wiki/ANSI_escape_code
  • https://github.com/mintty/mintty/wiki/Tips
www.000webhost.com