https://github.com/zxycode-2020/linux_shell_code
Linux 目录结构
-
关机:
- shutdown -h
- halt init 0
-
重启
- shutdown -r
- reboot init 6
-
ls
-l 列表显示
-a 显示所有 包括隐藏文件
-h 人性化显示
-d 显示目录,不查看内容
-
cd
- . 当前目录
- … 上一级目录
- ~ 用户家目录
-
上一次切换的目录
-
目录结构:
- 和win不同,从’/'开始的 是根
- /
- /root :root用户的家目录
- /bin :大部分的系统命令 (二进制)
- /sbin :超级用户才能执行的命令
- /boot : 启动相关
- /dev : 设备目录 一切设备都是文件
- /etc : 配置文件目录
- /home : 普通用户的加目录 一个用户对应一个文件夹
- /lib : 库文件
- /lib64: 64位库文件
- /lost+found : 系统一场临时保存数据 用于恢复等操作
- /media : 媒体目录
- /mnt:挂载目录 ,通用挂载点
- /opt :安装系统非必须软件目录
- /proc: 虚拟文件系统,会映射硬件信息
- /selinux : linux一套安全机制,通常不用
- /srv: 存放本机or本机服务器的数据
- /sys : 类似于 /proc ,也是虚拟文件系统,可以映射系统信息
- /tmp:存放临时文件,可能随时销毁
- /usr : 存放用户安装的应用程序
- /var : 系统产生的补课自动销毁的文件 如:日志、缓存等
Vim
-
插入模式
-
i : 在光标处插入
I : 在行首插入
a : 在光标下一个字符处 插入
A : 在尾行插入
o : 光标 下一行插入空行
O : 光标 上一行插入空行
s : 删除光标所在字符
S : 删除所在行 并插入模式
-
-
编辑模式
-
: w 保存
:q 退出
:wq 保存退出
:x 保存退出,等价于 :wq
-
:q! 强制退出
- e!
:行号 定位到指定行号
/内容 查找指定内容 n下翻 N上翻
:%s/原内容/x新内容 替换
-
-
正常模式
- vim filename +n 打开文件,定位到n行
- vim filename + 打开文件,定位到末尾
- gg 定位到首行
- G 定位到尾行
- ngg 定位到n行
- ^ 定位到行首
- $ 定位到行尾
- yy 复制 nyy 复制光标开始的n行
- p 黏贴
- dd 删除行 ndd 删除n行
- u 撤销
- ctrl + r 反撤销
文件夹
- 创建文件
touch text3.txt 1.txt 2.pdf
- 删除文件
- rm : 删除文件 -f表示强制删除 -r表示递归删除
- rm filename
- rm -f filename 强制
- 拷贝
- cp 1.txt /new/copy/2.txt
- 移动
- mv 1.tst …
- 删除文件夹
- rmdir -rf 456/
- 创建文件夹
- -p 创建中间目录
- mkdir -p 323/234/23423
- 查看目录结果
- tree 需要安装
文件
- cat
- tac 反着看
- head 头10行
- tail 尾10行
- more 、less
- 软硬 链接文件
- 命令 : ln [-s] 源文件 目标文件
- 硬 不加参数 -s
ln 1.txt 2.txt
如果修改1.txt 2打开也会被修改 - 软 加参数 -s
ln -s 1.txt 2.txt
- 文件查找
find . -name test
- -name 指定名字
- -type 指定类型 (b/c/d/)
解压
-
tar
- -c 打包
- -x 解包
- -t 查看
- 以上三个参数不可以一起使用
- -f 指定文件 一般放在最后
- -v 显示详细信息
- -z 使用gzip/gunzip 压缩解压
- -j 使用 bzip2/bunzip2 压缩解压
解:
tar -xvf 123.tar
解压tar.gz
tar -zxvf 123.tar.gz
Shell
- 查看系统中的
dave@dave-virtual-machine:~$ cat /etc/shells
/etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
-
编写
-
#! /bin/bash echo "hello world"
-
加权限
chmod +x hello.sh
-
运行:
./hello.sh
orbash hello.sh
(因为/bin/bash已经在环境变量里了,不然/bin/bash hello.sh
)
-
-
定义变量
- 一定要注意空格!!!!!
name='fafafasdfg'
- 声明只读
readonly name
- 使用方式
- 出现在字符串中 “${name}sfsafa” **!最规范!**哪写都不会出错
- 不出现在字符串中$name
- 重置:
#! /bin/bash name='fafafasdfg' echo $name unset name echo "${name}kdjkdjkfj"
输出:
dave@dave-virtual-machine:~/Dave/Test/shell$ ./var.sh
fafafasdfg
kdjkdjkfj -
变量类型:
-
本地变量:只在shell脚本中使用
-
环境变量:在整个系统中都可以使用,通常全部大学,使用最多的是PATH
- 修改
- 系统:/etc/profile
- 用户: ~/.bash_profile
- 导出:
- 拼接 export PATH=$PATH:/home/dave 原来的+/home/dave ?
- 立即生效
- source /etc/profiles
- 修改
-
位置变量
-
$0 脚本名
-
$1 - $9 执行脚本传递的参数
-
dave@dave-virtual-machine:~/Dave/Test/shell$ cat pos.sh #! /bin/bash echo $0 echo $1 echo $2 执行:bash ./pos.sh 1 2 输出: ./pos.sh 1 2
-
-
特殊变量
-
$ 所有参数*
-
$# 参数个数
-
$? 上次执行结果,0表示正确,其他表示错误
-
上一次正常: dave@dave-virtual-machine:~/Dave/Test/shell$ echo $? 0 故意出错: dave@dave-virtual-machine:~/Dave/Test/shell$ ls /fjdljf ls: cannot access '/fjdljf': No such file or directory 上一次出错了 输出不是0 dave@dave-virtual-machine:~/Dave/Test/shell$ echo $? 2
-
-
文件包含
- (一) . include1.sh
- (二) Source inlcude2.sh
文件1:
$ cat incloud1.sh
#!/bin/bash
url="www.baidu.cokdjkfjam"
文件2 引用:
$ cat incloud2.sh
#. include1.sh
source incloud1.sh
echo "${url}ffgsgffgsg"
文件2输出:
$ bash incloud2.sh
www.baidu.cokdjkfjamffgsg
Seq、Expr
- seq m n 产生从m到n的整数
$ seq 10 20
10
11
12
13
14
15
16
17
18
19
20
- expr 将表达式进行运算
$ expr 1+3
1+3
$ expr 1 + 3
4
$ expr 1 \* 3
3
注意: 其中用* 的时候 需要*转义
字符串
- 双引号 : 除 $ ` \ " 之外可用
$ echo $naedd
1
$ echo "$naedd dfda"
1 dfda
#下面这个输出是空 找不到吧
$ echo "$naedddfda"
- 单引号: 所有的字符都认为是普通字符
- 反引号:将其中的字符串当做命令执行
$ echo `expr 1 + 1`
2
- 反斜线:转义特殊字符,如 $ ` \ 等
字符串操作
- 长度
str="abcdefghijklmn"
echo ${#str}
- 子串提取
#从下标2开始 后四位
echo ${str:2:4}
ps:我试了下 如果把4改成很大的一本数,不会报错
数组
代码:
$ cat array.sh
#! /bin/bash
array=(a b c d ef)
echo ${array[1]}
echo ${array[0]}
输出
$ bash array.sh
b
a
注意点:定义数组的时候 是用空格分割!!!
各种运算
-
测试工具:test,成功$?表现为0,失败表现为1
- 简写形式: 【 表达式 】 ,【空 表达式 空】前后必须有空格
-
数值比较:
- -lt 小于 less???
- -le 小于等于
- -gt: 大于
- -ge: 大于等于
- -qe: 等于
- -nq:不等于
-
字符串比较:
- =: 等于
- !=: 不等于
- -n: 字符串长度不是0时,为true
- -z: 字符串长度为0,为true
-
文件判断:
- -f:普通文件
- -d 目录文件
- -w 文件可写(存在+可写)
- -x 文件可执行
- -s 文件至少有一个字符
- -c 字符设备文件
- -b 块设备文件
-
逻辑判断
- -a 与 and的简写,另一种形式: &&
- -o 或 or简写,另一种: ||
- ! 非
if分支结构
代码:
$ cat if.sh
#! /bin/bash
if [ 2 -lt 3 ];then
echo "2 < 3"
fi
if test 2 -lt 3;then
echo "2 < 3"
fi
输出:
$ bash if.sh
2 < 3
2 < 3
两种写法:
- if [ 2 -lt 3 ];then
- if test 2 -lt 3;then
⏰:如果then换行 那么不用写 ; 号
Else
代码
$ cat ifelse.sh
#! /bin/bash
if [ "abc" = "abc" ];then
echo "equal"
else
echo "no equal"
fi
调用:
$ bash ifelse.sh
equal
Elif
代码:
$ cat ifelelse.sh
#! /bin/bash
read -p "input a char" ch
if [ $ch -ge 0 -a $ch -le 9 ];then
echo "number"
elif [];then
echo "test"
fi
输出:
$ bash ifelelse.sh
input a char1
number
💃read;从终端输入,-p表示输出一个提示字符串
Case 构成
代码:
$ cat case.sh
#! /bin/bash
read -p "input char" ch
case $ch in
[a-z]) #开始
echo "alpha"
;; #结束
[0-9])
echo "number"
;;
*)
echo "ohters"
;;
esac
调用
$ bash case.sh
input char1
number
$ bash case.sh
input chard
alpha
$ bash case.sh !
input char!
ohters
For循环
- 简单格式
代码:
$ cat for.sh
# !/bin/bash
for x in a b c
do
echo ${x}
done
调用:
$ bash for.sh
a
b
c
- 遍历目录
for x in /*
do
echo $x
done
- 遍历1-10次
🉑如果是 sql 1 10 会输出这三个字符 所以必须加上 ``反引号
for x in `seq 1 10`
do
echo ${x}
done
-
数值加法 🗡
用到let
sum=0
for x in `seq 1 100`
do
let sum=$sum+$x
done
echo $sum
- 1-10 遍历
- for ((i=0;i<=10;i++))
- 上面介绍的是 for x in `seq 1 10`
$ cat for2.sh
#! /bin/bash
for ((i=0;i<=10;i++))
do
echo $i
done
$ bash for2.sh
0
1
2
3
4
5
6
7
8
9
10
while循环
- let i+=1
- ((i++))
- [ [ [i+1]
源码:
cat while.sh
#! /bin/bash
i=1
while [ $i -le 10 ]
do
echo $i
let i+=1
# ((i++))
# $[$i+1]
done
调用:
$ bash while.sh
1
2
3
4
5
6
7
8
9
10
Until 循环结构
代码:
l$ cat until.sh
#! /bin/bash
i=1
until [ $i -gt 10 ]
do
echo $i
((i++))
done
调用:
$ bash until.sh
1
2
3
4
5
6
7
8
9
10
Continue
**👿 [ i [i%3] -eq 0** 注意 要加 [i[]先取一遍
代码:
cat continue.sh
#! /bin/bash
i=1
while [ $i -le 10 ]
do
if [ $[i%3] -eq 0 ];then
let i+=1
continue
fi
echo $i
((i++))
done
调用:
$ bash continue.sh
1
2
4
5
7
8
10
自定义函数
- 函数
- 带参数的
- 带返回值的
#! /bin/bash
demo()
{
echo "adfaf"
}
demo
demo2()
{
echo $1
echo $2
}
demo2 1 param2
demo3()
{
return 12341
}
demo3
echo $?
输出:
adfaf
1
param2
53
黑洞文件
/dev/null
作用:讲任意内容写入,以屏蔽错误,清除文件内容(eg:犯罪记录)
eg: cat /dev/null > xx.log