学习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?