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 : 系统产生的补课自动销毁的文件 如:日志、缓存等
-
插入模式
-
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
- 查看系统中的
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 or bash 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简写,另一种: ||
- ! 非
代码: $ 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! ohtersFor循环
- 简单格式
代码:
$ 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 10while循环
- 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 10Until 循环结构
代码:
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 10Continue
** [ 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



