《AcWing》—tmux,vim,Linux基础课,shell,命令
catalog
vim
`ggdG` 剪切所有内容
gg=G    ' 格式化代码 '
u      ' 撤销 '
v      ' 然后, 按⽅向键, 进⾏⽂本的选中 '
y ' 复制所选中的内容.  y是yank复制    (⽆法复制出来, 即仅限于vim⾥)'
yy  ' 复制⼀⾏ '
p  ' 粘贴  paste '
:set paste  ' 当你要shift+insert, 往vim⾥粘贴进⼀些⽂本时, 要设置这个模式; 否则你的⽂本, 和他原来的格式不⼀样 '
:set nopaste  ' 绝⼤多数下, 都是使⽤这个模式 (默认vim也是这个模式); 只有当你要粘贴时, 设置paste, 粘贴完毕, 就设置回去nopaste '
/abc '查所有`abc`字符串(按“回车”后,按`n` 可以进⾏迭代) '
解释paste模式
int x;
a
b
当你在;的后⾯, 按下回车时, 你肯定是希望光标在a 处这就是nopaste模式, 即他会⾃动给你缩进
但是, 当你要粘贴⽂本时, 你肯定不希望, 在你⽂本中的 每个’\n’后⾯, 都新加⼀个tab缩进. 即让⽂本按照本来的样⼦来粘贴, 这就是paste 模式
tmux
tmux  ' 打开⼀个新的tmux '
tmux a  ' 打开之前挂起的tmux (即恢复你之前的那些分屏状态) '
ctrl + a, shift +5' 左右分屏 '
ctrl + a, shift + "  ' 上下分屏 (注意, 是引号键)'
ctrl + a,⽅向键' 切换视图 '
ctrl + d  ' 删除tmux, 退出; '
ctrl + d, a  ' 挂起tmux, 退出;  [ctrl+d, a]是保存tmux 退出, 然后[tmux a]是恢复之前的tmux状态 '
'⽐如你当前有很多的分屏, 你想要保存下来, 明天继续 '
ctrl + a, s  ' 查看所有挂起的tmux  (即被ctrl+d的) '
然后,选中某个,按x y  ' 删除某个tmux;    按下x, 下⾯命令⾏会提⽰是否删除'
ctrl + a, z  ' 全屏/取消全屏 '
直接⿏标左击选中(复制)
ctrl + a,]' 粘贴,  但只能在tmux⾥粘贴 '
按住shift选中, ctrl+insert ' 也会选中其他tmux, 最好提前给ctrl+a,z 全屏'
shift + insert  ' 粘贴 '
Shell
linux中常见shell有: sh bash(sh的加强版, 默认)
shell⽂件⾥的代码,都可以直接放到你的命令⾏⾥执⾏!! ⼀样的,只是写成⽂件,每次可以⾃动的执⾏。
source引⼊头⽂件
类似于C语⾔, 我们提前写好⼀些 代码, 然后其他的sh 就可以直接的引⼊. (其实和C语⾔⼀样, 就是代码⽂件的展开)
a.sh:
var=123
b.sh:
source /home/acs/a.sh  ' source也可以写成: . '
echo ${var}
终端terminal是⼀个 (⼤的 bash脚本⽂件), 我们登陆时, 他会模式先执⾏( /home/acs/.bashrc)⾥的所有内容
⽽这个⽂件, 他并不是⼀个.sh⽂件, 执⾏权限也没有x.
即./bashrc 这个命令, 是不可⾏的.
但是, 这个⽂件⾥, 都是shell命令!! (⽐如, ⼀些ls, dir, ..., 都可以在shell执⾏的)
此时, 就可以使⽤ (⽂件内容展开) 这个功能.
即把该⽂件的内容, 都展开到 (当前terminal)⾥, 也就是: ==该⽂件⾥的代码, 都执⾏了⼀遍 ==
⽐如: a.txt⾥是: dir
./a.txt 是失败的. (他没有+x权限)
就等价于 (执⾏了dir), 因为把a.txt⾥的内容, 展开到当前命令⾏⾥
重定向
linux所有进程, 默认都会打开 3个 ⽂件描述符: (stdin 0, 从命令⾏输⼊) (stdout 1, 向命令⾏输出) (stderr 2, 向命令⾏输出错误)
dir > a.txt          ' 将dir的输出, 以(覆盖⽅式) 到a.txt⾥ '
ls >> a.txt      ' 将ls的输出, 以(追加append⽅式) 到a.txt⾥ '
read var < a.txt    ' 从a.txt⾥, (读⼀⾏)  因为, read遇到(\n)就结束 '
函数
func(){
a="abc"
echo "hello ${a}"
}
func  ' 函数的调⽤, 不⽤写参数 '
func(){
a="abc"
echo ${a}
return123' shell⾥的函数, 返回值是(exit code,在[0,255]之间) '
' ⼀般, 0为表⽰成功(你不写,默认是他) '
'因为, 没有函数返回值这个概念, 所以, 如果要获取返回值, 你可以规则⽤他的stdout(即echo) ' }
output=$(func)' output == "abc" '
ret=$?' ret == 123 '
for/while循环/continue
for i in 123 abc 456' 类似于c++的序列化容器 '
do
echo ${i}
done
-----------------
for i in $(ls)' 命令的输出 '
do
echo ${i}
done
--------------------
for i in $(seq 110)' 遍历 [1,...,10] '
do
.
.
done
----------------
for i in {1..10}' 遍历[1,...,10] ;'
for i in {10..1}' 遍历[10,9,...,1] '
for i in {a..z}' 遍历[a,b,..,z] '
--------------
for((i=1; i<=10;++i))' 遍历 [1,...,10] '
...
while read a  ' 当你ctrl + d时, 就是⽂件结束符. 即终⽌录⼊ '
do
echo ${a}
done
-------------------------
for((i=1; i<=10;++i))
do
if[ $( expr ${i}%2)-eq 0]' 跳过所有的偶数 '
then
continue
fi
echo ${i}
done
#! /bin/bash
开头 必须要写上: #! /bin/bash,这是在指明(使⽤bash作为 脚本解释器)chmod
chmod: change mode 改变模式
⼀个执⾏⽂件`a.sh`,需要有(执⾏的权限): `chmod +x a.sh`
注释
# ...
条件if
if
if[ ${a}-lt ${b}]
then      ' 注意这⾥有个then, 其实就表⽰: 如果这个if成⽴,则... '
echo "a < b"
else
echo "a >= b"
fi
取反
if![ ${a}-eq ${b}]' 取反: ! '
then
echo ""
if
elif
if[..]
then
.
..
elif [...]
then    ' 注意格式!! '
...
else
...
fi
expr
length
expr length "${var}",求⼀个字符串的长度 (加"",是处理 var⾥有空格的情况)
四则运算
v1=123
v2=456
echo ${v1+v2}' 输出是出错的! '
linux重定向shell是不⽀持运算的!!
v1=123
v2=456
echo $(expr ${v1}+ ${v2})' 注意, +的左右要有空格!! '
echo $(expr ${v1}- ${v2})' -号,左右要有空格! '
echo $(expr \( ${v1}+1 \) \* ${v2})' *号要转义(\*)!!括号也要转义!! '
⽐较
v1=123
v2=456
echo $(expr ${v1}'==' ${v2})' 判断是否相等(注意,要⽤单引号括起来) '
echo $(expr ${v1}'<' ${v2})
字符串、变量
var="abc"
var='abc'
var=abc
三种写法都可以,注意:等号左右,不可以有空格!!
(''写法,不会转义!! ""写法,会进⾏转义!)
shell⾥不存在(数据类型)的概念,即都是“字符串”!! (但他会⾃动检测,当需要是整数时,他会⾃动转换)
shell⾥的变量, 不存在 (定义)这个含义.
⽐如你 echo ${a}, 即使他不存在, 也不会报错, 他的值是空的.
空格
var="abc ef"
echo ${var}
这是会报错的
但是,并不是说,var不能存储空格! ⽽是,${var}操作 其实就会变成:abc ef
即,其实是形如: echo abc ef,这是报错的!!
所以,在对字符串进⾏操作时, 最好要加上 ""(可以处理,有空格的情况)
即,echo "${var}",这就对了
只读变量
var="abc"
readonly var

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。