侧边栏

学习shell

为什么要有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

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

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

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 如果没有则新建

指令依序執行的關係示意圖

管道命令

『 | 』
处理前面传来的正确信息

选取命令:
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?

posted @ 2021-07-18 16:09  探针一号  阅读(46)  评论(0编辑  收藏  举报