Every little helps

shell总结

查看当前用户

1
whoami

显示系统的所有shell

1
2
3
4
5
6
7
8
9
10
11
12
$ cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
切换:直接敲shell的名称

输出当前shell ID

1
echo $$

隔开同一行敲的多个命令

1
;

另起一行

1
\

变量

变量名=值

  1. 变量名不能以数字开头
  2. 等号两边不能有空格
  3. 值用双引号引起来
  4. 定义变量时不加$,引用时需要加$
  5. 在终端敲该命令,所得的变量是当前shell的变量
  6. 单引号引用的变量不会被解析
  7. 这样定义是本地变量,不会影响到子shell

变量定义

1
2
3
4
5
6
7
8
9
10
11
12
13
declare -x dd=12 / export yy=10
定义环境变量
可以影响到所有子shell
declare +x dd
将环境变量变成本地变量
declare -r dd (readonly dd)
将变量设为只读
declare -i aa #定义整型,目的是可以做数值运算,默认情况下会直接输出
let bb=1+8 同上
cc=((1+1)) 同上

输出变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo
-n 输出不换行
-e 解析 \n 等字符
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;

取消变量

1
unset

显示设置变量

1
2
3
4
5
6
set 显示所有变量
set 1 2 3 4 5 设置参数
env 显示所有环境变量
export 显示所有环境变量
export -p 显示所有环境变量

方法参数取值

1
2
3
4
5
$0 文件的名字
$# 参数的个数
${12} 文件的第12个参数
$* 所有的参数
$? 记录上面的命令是否执行成功,0表示失败,非0表示成功

全局变量

1
2
3
4
5
6
$PATH
$HOME 家目录
$USER 当前登录用户
$PS1 提示符 export PS1="\[\e[36m\][\u@\h \W]\$\[\e[m\] "
$LAGN 系统当前编码
$REPLY read默认赋予的变量

查看系统所支持的所有编码

1
locale -a

读取输入值

1
2
read -p "pleace input word:" name
相当于先输出再读取变量

数组操作

1
2
3
4
5
6
xx=(aa bb cc dd) 赋值
echo ${xx[0]} 取值第一个元素
echo ${xx[*]} 取所有
echo ${xx[@]} 取所有
echo ${!xx[@]} 查看所有下标
echo ${#xx[@]} 查看元素个数

字符串中执行命令

1
$(hostname) 或者`hostname`

查看系统限制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7866
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited

前后截断字符串

1
2
3
4
5
6
r=${path#*kkk/bin}
删除path变量中的按 *kkk/bin 匹配的前面的字符串,然后赋值给r(第一个匹配开始处理)
r=${path##*kkk/bin}
删除path变量中的按 *kkk/bin 匹配的前面的字符串,然后赋值给r(最后一个匹配开始处理)
#删除前面的字符串,%删除后面的字符串

赋值检查

1
2
3
4
5
r=${xx-"hello"} 如果变量xx存在就将xx值赋予r否则将hello赋值给r
r=${xx:-"hello"} 在上面的基础上还要判断是否为空
r=${xx:="hello"} 在上面的基础上将字符串赋值给xx
r=${xx:?"error"} 检查xx是否为空,如果是空的话显示?后面定义的字符串警告信息
r=${xx:+"hello"} 如果xx非空将后面的字符串赋值给r

查看命令执行顺序

1
2
3
type -a ls # 查看命令执行顺序
type source 查看source是否是shell内置命令,如果是的话which查不出来

登录时读取配置文件顺序

1
2
3
/etc/profile 环境变量
/etc/inputrc 快捷键
~/.bash_profile

set排错

1
2
3
4
set -u 开启当所用到的变量没有被设置时就会报错
+u 关闭
-x 追踪每一个操作,排错时候使用
+x 关闭

文件重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1>
ls -a > a.txt 文件重定向(清空)
ls -a >> a.txt 文件重定向(追加)
xx 2> a.txt 只重定向错误的结果
xx &>> a.txt 不管正确还是错误全部都追加
xx > a.txt 2>&1 错误的结果像正确的一样导入
2>
$ cat > filename <<EOF
> nihao
> $HOME
> $PATH
> EOF
$ cat filename
nihao
/home/mjs
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/jdk8/bin:/opt/redis/redis-2.8.24/src:/home/mjs/.local/bin:/home/mjs/bin

文本替换

1
2
tr 'a-z' 'A-Z' < hosts
将hosts文件中的字母从小写转为大写并输出到屏幕

搜索文件中的内容

1
2
3
4
5
6
7
8
grep
-i 不区分大小写
--color 颜色高亮
-n 出现在第几行
-v 反向过滤,不显示选中的结果,^表示开头
-A3 过滤选中行,并向下延伸3行
-B3 过滤选中行,并向上延伸3行
-q 不显示结果

文件内容追加

1
2
3
4
tee -a xx
可追加到xx文件中
cut xx | tee xx | grep aa # tee的作用是将输出信息保存在xx文件中

切分文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
1>
cut -d: -f1 /etc/passwd
-d:分隔符
-f:查看第几部分
2>
split -b 10k /etc/services xxx 将services文件以每块10k前缀为xxx进行切分
-l 100 以每100行一个文件的粒度切分
3>
awt -F: '{print $1}' xx 以:为切分附(默认是空格)将xx文件切分,然后取第一部分。0表示整行记录
'{print NR, $1, NF}' NR添加行号,NF是显示该行有几个字段
awt -F: '$3<=1 {print $1}' xx 前面 $3<=1 是条件
awk -F: 'BEGIN{OFS="\t\t"; ORS="\n\n"}{print $1 $2}' xx
OFS表示每一部分是用什么分隔符(tab键),ORS表示每行之间使用什么分隔符

排序

1
2
3
4
5
6
7
8
sort
-n 以数字的形式排序
-r 反向排序
sort -t: -k3 -n passwd 以切分出来的第三部分来排序整行
-t:分隔符
-k:第几部分
-u:排除重复(与通过管道传给 uniq 命令等效,该命令 -c 参数可以统计每个单词出现几次)

统计字符

1
2
3
4
5
6
7
8
9
10
11
12
wc 统计字符
-l 查看几行
-w 几个单词
-c 几个字符
wc ProducerCustomer.java
85 183 1720 ProducerCustomer.java
85:行数
183:单词数
1720:字符数

将Tab键转化为空格

1
col -x 和 expand

查看两个文件异同

1
diff

不能使用管道的命令使用管道

1
2
3
xargs
find ./ -name *.sh | xargs ls -l

sed文本操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sed '1,2d' hosts 删除前两行
-i 直接修改文件,默认是输出到控制台
-e 同时可以做多个操作,一个操作写一个-e
-f 调用文件中的内容
sed '$d' hosts 删除最后一行
sed 's/root/ROOT/g' xx 将root转换为ROOT
sed '/adm/ixxxxxxxxxxxxxx' xx 在adm的上一行添加xxxxxxxxxxxxxx
sed '/adm/axxxxxxxxxxxxxx' xx 在adm的下一行添加xxxxxxxxxxxxxx
sed '/adm/cxxxxxxxxxxxxxx' xx 将adm行换掉xxxxxxxxxxxxxx

运行shell

1
2
3
./xx.sh 开启子shell运行
bash xx.sh 开启子shell运行
source xx.sh 当前shell下运行

比较

1
2
3
4
5
6
7
数字 字符
等于 -eq ==
不等于 -ne !=
大于 -gt >
大于等于 -ge >=
小于 -lt <
小于等于 -le <=

文件判断

1
2
3
4
[ -f /etc/passwd ] #判断文件是否存在(存在返回0)
[ -r /etc/passwd ] #判断文件是否有读权限
[ -w /etc/passwd ] #判断文件是否有写权限
[ -x /etc/passwd ] #判断文件是否有执行权限

if语句

1
2
3
4
5
6
if [ "$?" -eq 0 ]; then
echo "$1 存在"
elif []; then
else
echo "$1 不存在"
fi

case语句

1
2
3
4
5
6
7
8
9
10
11
12
13
case
case $1 in
[Tt]o*)
echo tom
;;
bob | mary )
echo xxx
;;
*)
echo zzz
;;
esac

定义函数

1
2
3
4
5
6
7
function xx (){
echo "hello"
}
xx (){
echo "hello"
}

while循环

1
2
3
4
5
6
while []
do
$xx
done
until与while相反,一开始不满足,直到满足之后就会跳出循环

for循环

1
2
3
for xx in aa,bb cc
do
done