Linux Shell学习手册

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 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简写,另一种: ||
    • ! 非

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

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值