为什么要有shell?

我们必须要通过shell将我们输入的命令与内核通信,好让内核可以通过控制硬件来正确无误地工作.(提供用户操作系统的接口欧)

shell类型众多?

最初学会bash就不错 /bin/bash

shell script?

类比DOS下的批处理

type 查询是否为bash内置命令

变量

echo $变量名

eg: echo $PATH

root@kali:~/桌面# echo $name
#空
root@kali:~/桌面# $name = Ginger
=: command not found
root@kali:~/桌面# name=Ginger
root@kali:~/桌面# echo $name
Ginger


  • 等号两遍不能直接加空格符
  • 双引号内的特殊字符,保持原意
  • 单引号内的特殊字符仅为一般字符
  • 在其它子程序使用该变量要用export引用
  • 取消变量: unset 变量名称
  • 变量累加 name=${name}yes

eg: ​​name = Ginger's name ​​不行

要这样 ​​name="Ginger's name"​

或 ​​name=Ginger\'s\ name​

进入内核模块目录:

cd /lib/modules/`uname -r`/kernel
cd /lib/modules/$(uname -r)/kernel


PS1等

提示符变量

就是每次都出现的那个[root@openeuler ~]#

可以修改hhh

cd /home
PS1='[\u@\h \w \A #\#]\$'
PS1='[\u@\h]在[\w]笑着说:'


?

执行完任务的回传码

echo $? 回传错误码

$

目前这个shell的PID

echo $$

显示环境变量:export

export命令也能把一个普通变量变成环境变量放到子程序里

变量读取.数组.声明

read用来读取键盘的输入并放进变量里

[root@openeuler ~]# read aaa
爷真帅 (输入)
[root@openeuler ~]# echo $aaa
爷真帅 (输出)

read -p "what's your name?" -t 30 aaa
(30秒限时)


delcare 声明变量类型

-a 数组

-i 整型

-x 设成环境变量

-r 设成只读

变量内容的删除,替换

echo ${path#/*:}
删除冒号前最短的


​#​​从前向后删除,替换短的,​​##​​替换长的

%从后向前删除,替换短的,%%替换长的

${变量/旧/新} 替换第一个

${变量//旧/新} 替换全部

命令别名

alias

alias cls='clear'

再输入cls就能清屏了

直接输入alias查看有哪些别名

unalias

取消别名

unalias cls

bashshell操作环境

修改进站界面

/etc/issue

/etc/issue.net (远程连接看到的)

/etc/motd (登录后看到的)

进入~/.bashrc修改环境配置文件

比如加入

PS1='[\u@\h]在[\w]笑着说:'
alias cls='clear'


之后不用等注销,直接

source 配置文件名

来应用

通配符

和正则表达式好像

特殊符号

​#​​注释

|管道符

;连续命令分隔符

<<,<,>,>>数据流重定向

两个`符号中间可以先执行命令

也可以使用$()

()中间为子shell的起始与结束

"" 有置换功能

'' 无置换功能

数据流重定向

standard output 与 standard error output

学习shell_环境变量

标准输出指的是『指令执行所回传的正确的讯息』,而标准错误输出可理解为『 指令执行失败后,所回传的错误讯息』。

当我们执行了错误的命令时,数据流重定向可以将''标准输出''与''标准错误输出''分开

ls / > ~/file   #将输出的结果存在file里


标准输入  (stdin) :代码为 0 ,使用 < 或 << ;

标准输出  (stdout):代码为 1 ,使用 > 或 >> ;

标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>

1> :以覆盖的方法将『正确数据』输出到指定的档案或装置上;

1>>:以累加的方法将『正确数据』输出到指定的档案或装置上;

2> :以覆盖的方法将『错误数据』输出到指定的档案或装置上;

2>>:以累加的方法将『错误数据』输出到指定的档案或装置上;

&>:正确与错误一起输出

而<代表输入,比如

[root@kali]在[~]笑着说:cat > a_file < /root/桌面/123.txt


<<代表结束输入

[root@kali]在[~]笑着说:cat > a_file << "efo"


当输入efo的时候,结束输入

命令行判断依据

命令回传码$?,正确时$?=0,错误时$?≠0

cmd1 && cmd2 只有cmd1正确执行才开始执行cmd2

cmd1 || cmd2 只有cmd1错误才开始执行cmd2

cmd ; cmd 一次執行多個指令

eg: ​​ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe​​ 如果没有则新建

学习shell_bash_02

管道命令

『 | 』

处理前面传来的正确信息

选取命令:

cut:将同一行里的数据进行分解

 cut -d '分隔符' -f fields


grep:分析一行数据,取出所需要的

grep [-acinv] [--color=auto] '搜尋字串' filename


-c :计算找到的次数

-i :忽略大小写

-v :反向选择

-n : 显示行数

支持正则!

一些 命令

sort:排序

uniq:去重排序

wc:统计字符数

tee 同时输出到屏幕与文件(双向重定向)

tr 字符删除与替换(支持正则)

col tab转等量空格,man page转text等

join 先sort,再join可以相加相同数据

paste 类似join,但只是把相同数据贴在一起

expend tab转等量空格

expend 空格转Tab

split 切割

xargs 参数代换

附:鸟哥的一道题

在這樣的練習中『A=B』且『B=C』,若我下達『unset $A』,則取消的變數是 A 還是 B?


For the LichKing !