extra-shell-notes
文章目录
【注意】最后更新于 May 7, 2018,文中内容可能已过时,请谨慎使用。
自学收集的一些有用的 shell 奇淫妙技。
unset
|
|
.f
前后有空格。用于删除定义了的变量与函数。
包含文件
|
|
.
后面有一空格。
注释
shell 没有块注释,可以使用一对花括号
将需要注释的内容包起来,定义成一个函数,但是后面不使用改函数,从而曲线救国。
字符串
|
|
提取子字符串
|
|
查找子字符串
|
|
数组
之前一直不会用,get 到技能,这里记录一下。
|
|
其他赋值方式
|
|
计算数组元素个数
|
|
遍历
|
|
无限循环
|
|
取最后一行
获取最后一行数据。
法一,
|
|
法二,
|
|
法三,
|
|
其他,
|
|
参考资料 。
不让别名生效
在 .bashrc
或者 .profile
里面定义 alias
可以简化命令输入,但有时想用非别名命令,可以在前面加一个 \\
,如下
|
|
ps 命令
ps
命令的参数有:
参数 | 作用 |
---|---|
-a | 显示所有进程(包括其他用户的) |
-u | 用户以及其他信息 |
-x | 显示没有控制终端的进程 |
特别地,ps aux
这种短格式不加减号(-)也是合法的。
|
|
有用的小命令
|
|
|
|
|
|
|
|
touch
修改已经存在文件的信息。
参数 | 作用 |
---|---|
-a | 修改“读取时间”(atime) |
-m | 修改“修改时间”(mtime) |
-d | 上面两者同时修改 |
|
|
历史命令
!数字
用于重复执行某次命令。
history
查看历史命令。
mkdir -p /a/b/c
递归迭代创建文件夹。
sed
- 多个匹配:
|
|
- 使用
&
来当做被匹配的变量
|
|
- 圆括号
使用圆括号匹配的示例:(圆括号括起来的正则表达式所匹配的字符串会可以当成变量来使用,sed中使用的是\1,\2…)
|
|
上面这个例子中的正则表达式有点复杂,解开如下(去掉转义字符):
正则为:This is my (\[^,&]\*),.\*is (.*)
匹配为:This is my (cat),……….is (betty)
然后:\1
就是cat,\2
就是betty.
变量
|
|
当脚本内需要向另一个脚本或函数传递所有参数时:
应使用"$@"
而不是$*
或者"$*"
。"$@"
会把所有参数都按原样传递过去,而$*
遇到有空格的参数会分割成多个,"$*"
则是把所有参数变成一个参数(字符串)传进去。
vim 编辑后无权限
在底栏模式下:
:w !sudo tee %
然后按提示输入密码 确认:[O]K, (L)oad File:
输入 L 会重新载入,丢失所有操作记录,推荐直接使用 O.
解析: 此命令是把当前文件(即%)作为stdin传给sudo tee命令来执行.
不用 tee 的实现方式:
|
|
:r !pwd
或 :r !ls
将执行结果复制到 vim 中.
vim 替换中,%
的意义是代表整个文件,而执行外部命令时则是文件名.
可以详见 此处.
查看归档或压缩文件内容
无需解压,查看 归档文件包含的内容。
-
vim 命令模式下直接使用 vim 可以查看归档文件内容。
-
tar -tf 文件路径 此法在 man tar 有说。
-
rar unrar zip unzip
|
|
- 其他
zipinfo
zcat
zless
以及 less
。
bash
-
转换小写
1 2 3 4 5 6
var='ExampleAAA' var="${var,,}" # var : exampleaaa # 只小写第一个 var="${var,}"
bash 4+
-
转换大写
1 2 3 4 5 6
var='ExampleAAA' var="${varR^^}" # var : EXAMPLEAAA # 只大写第一个 var="${var^}"
bash 4+
-
大小写转换
1 2 3 4 5 6
var='ExampleAAA' var="${var~~}" # var : eXAMPLEaaa # 只改变第一个大小写 var="${var~}"
bash 4+
作为对比:常用的还有
${var#[regex]}
从前向后删第一个匹配的[regex]
,${var##[regex]}
从前向后删所有匹配的[regex]
;#
换成%
表示掉头,从后向前。 -
冒号(
:
)作用,以及_
通常情况使用 冒号 占位,和Python
中的pass
作用类似,除此之外还有替代临时变量作用1 2 3 4 5
var=' test text ' : "${1#"${var%%[![:space:]]*}"}" : "${_%"${_##*[![:space:]]}"}" var="$_" # var='test text'
可以看到临时变量存到
_
中。 -
字符串长度,使用
1
${#var}
其中
var
为变量。{% post_link hexo-pit hexo踩过的坑 %} -
读取文件到变量,而不用
cat
1 2
file_data="$(< "file/path")" # 比使用 cat 速度更快!
-
使用变量访问变量
1 2 3 4 5 6 7 8
cookie_tt='vbdbv45367' site='tt' # 法一 echo "$(eval echo '$'"cookie_$site")" # 法二 : cookie_$site echo ${!_}
-
使用变量命名另外一个变量
1 2 3 4
var="world" declare "hello_$var=value" printf '%s\n' "$hello_world" # value
-
取变量第一行
1 2 3 4 5
var='111 222 333' "${var/$'\n'*/}" # var = 111
-
大括号范围
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# 普通范围 echo {1..10} # 小数 echo 1.{1..6} # 嵌套 echo {a..z}{1..10} # 260个 # 零填充 echo {01..100} # 001 002 ... # 改变步长 echo {1..10..2} # 1 3 5 7 9 # 字符串列表 rm -rf ~/Downloads/{Movies,Music,ISOS}
-
bash 的扩展匹配模式 开启方法
shopt -s extglob
,关闭shopt -u extglob
。-s
meansset
,-u
meansunset
。shoptshopt
即是Shell Option
,extglob
即是Extended Globbing
。1 2 3 4
# 例子 var='123.720p.456' echo "${var/+(720p|1080p)}" # var 123..456
其他还有 ?(pattern-list) 匹配一个或者零个模式 *(pattern-list) 匹配多个或者零个模式 +(pattern-list) 匹配一个或者多个模式 @(pattern-list) 匹配一个模式 !(pattern-list) 匹配除了模式的其他模式
除了路径匹配,放在测试里面也可以,此外,可以嵌套,不能使用
{}
。 参考文档-http://mywiki.wooledge.org 参考文档-linuxjournal 参考文档-gnu
待续……
ASCII值转换为字符
使用 awk
|
|
使用 printf
|
|
字符转ascii值
|
|