1. Shell是什么

  • Shell的作用
    UNIX/Linux系统的内核负责控制硬件、管理内存和调度任务。Shell处于用户和操作系统之间,用户可以利用Shell实现对操作系统及其内核的控制和操作。登录操作系统后,系统会启动一个Shell,可以输入交互式指令。

  • Shell编程语言
    Shell是解释型的编程语言,除了大量命令外,还有变量、条件、循环、函数等。多个Shell命令按一定的逻辑写到一个文件中,可以实现一部分工作的自动化。

Shell有很多版本,当前使用最广泛的是bash。另一版zsh在完全兼容bash的基础上还有极好的用户体验。

2. chsh更换Shell

  • 查看当前安装了哪些Shell
# 方式一
cat /etc/shells
# 方式二
chsh -l
  • 查看当前使用的Shell
echo $SHELL /bin/bash
  • 将默认的Shell环境切换到zsh,重新登录后生效。
chsh -s /bin/zsh

chsh -s 修改的是/etc/passwd文件中用户名对应的行

3. export声明环境变量

  • 环境变量
    Shell的变量分为环境变量和自定义变量。环境变量可以在进程的子进程中继续生效,自定义变量在子进程中不生效。

  • 显示Shell变量的4个命令
    env:显示当前用户的环境变量,不显示自定义变量;
    export:功能同env,只是结果按变量名排序;
    set:显示当前Shell定义的所有变量,环境变量加自定义变量;
    declare:功能同set,结果按变量名排序;

  • P A T H 变量由多个路径组成,使用冒号分隔。用户输入的命令会依次进入 PATH变量 由多个路径组成,使用冒号分隔。用户输入的命令会依次进入 PATH变量由多个路径组成,使用冒号分隔。用户输入的命令会依次进入PATH中的路径寻找。
    把路径添加到环境变量:

export PATH=$PATH:/app/tools

4. read读取输入

read命令可以读取文件输入或标准输入,把信息存到变量中。

echo -n "input name please"
read name
exho "Welcome! $name"
exit 0
选项
  • -p 选项直接显示提示语
read -p "input name please" name
  • 接收多个变量
read -p "input name and age" name age

输入完成时,read会按空格分割输入的内容,分别存到后面的变量中。
输入的数据多于两个变量时,超出的内容都会在最后一个变量。
输入的数据少于两个时,多余的变量值为空。
如果read命令后没有写变量名,这些内容会存到环境变量$REPLY中。

  • -t 指定等待输入的时长
if read -t 5 -p "input name please" name
thenecho "Welcome $name"
elseecho "Time out"
exit 0
  • -s 密码输入
    -s选项使用户输入不会在屏幕上显示信息。
  • -r 禁用转义
    把系统的转义字符作为正常的字符读取。
接收来自文件的内容

文件可以使用三种方式读取

  1. 使用 -u 选项
# 读取文件,文件描述符编号为3
exec 3< test.txtcount=0
# 读取文件内容
while read -u 3 var
dolet count=$count+1# 输出行号和行的内容echo "Line $count: $var"
done
# 关闭文件描述符
exec 3<&-
exit 0
  1. 使用管道
count=1
cat test.txt | while read line
do# 输出行号和行的内容echo "Line $count: $line"let count=$count+1
done
echo "count=$count"
exit 0

由于管道两边需要新建进程,执行完循环后,新的进程结束了,循环中的变量也消失了,所以最后执行echo时显示的是第一行定义的变量的值。

  1. 使用重定向
count=0
while read line
dolet count=$count+1echo "Line $count: $line"
done test.txt
exit 0

5. expr计算器

四则运算
expr 10 + 10
expr 10 - 10
expr 10 / 10
expr 10 \* 10

注意:
需要空格隔开每个项;
Shell特殊字符需要使用反斜杠转义;
包含空格和其他特殊字符的字符串需要用引号括起来。

字符串操作

语法如下

# 正则匹配,返回结果的长度
expr match STR REGEXP
# 从POS位置开始截取LENGTH个字符
expr sunstr STR POS LENGTH
# 查找子字符串的起始位置
expr index STR SUBSTR
# 字符串长度
expr length STR
str="abcdefgh"
expr match $str ".*e"  # 输出"5"
expr substr $str 3 2   # 输出"cd"
expr index $str f      # 输出"6"
expr length $str       # 输出"8"

6. tmux 复用终端

tmux是Terminal MultipleXer的缩写。可以通过一个窗口操作多个会话。

  • centos安装tmux。会自动安装依赖libevent和ncurses。
yum install tmux
  • 启动tmux。
tmux new -s mysession

启动后会在终端底部出现绿色的状态条,上面的0:bash表示会话窗口。

  • 创建新窗口
    按ctrl+b组合键,然后再按c,就会创建一个新的窗口1:bash。
    窗口后面带*号,表示该窗口为活动状态。
    按ctrl+b组合键,然后按0,就把活动窗口切换到0:bash。

  • 退出会话,回到会话
    按ctrl+b组合键,然后按d,就会关闭tmux窗口,tmux会话会挂在服务器上自己运行,效果和终端运行的一样。效果不受个人电脑突发状况的影响。
    查看tmux会话列表

tmux ls

回到tmux会话

tmux a -t mysession

回到会话后,会话内的程序就是正常运行的样子。

7. alias起别名

alias可以为命令设置别名,避免记忆过多的选项。

命令行使用alia

alias的语法格式:alias [name[=value]]。等号前后不能加空格;value中有空格时,需要把value用引号包起来。

  • 查看别名
# 查看所有别名
alias
# 查看单个命令是否为别名
alias vi
  • 取消别名
# 删除单个别名
unalias vi
# 删除全部别名
unlias -a
  • 重名的别名
    和某个命令重名的别名,Shell执行的只会是别名。
    如果想执行原本的命令,需要使用绝对路径或者在别名前使用反斜线。
  • value使用的引号
    使用双引号时,如果value中带有变量,则会把变量的值替换到命令中。使用单引号时,不会替换到命令中,命令仍然是包含变量的命令。
脚本中执行alias命令

Shell脚本中,alias功能默认是关闭的。

shopt命令可以开启alias的扩展选项expand_aliases。shopt -s expand_aliases

由于脚本执行时会产生一个新的进程,新进程中的expand_slashes是关闭状态,所以shopt开启alias的命令需要写在脚本里面。

脚本所在的是新进程,并没有外部Shell中alias设置的内容,想用到其中的别名,需要在脚本头部的“#!/bin/bash”后面加上“–login”选项,使执行脚本的子Shell成为一个login Shell,它会读取系统和用户的profile和rc文件,从而加载alias设置。
综合以上三点,脚本中使用别名需要做这些改动:

#!/bin/bash --login
shopt -s expand_aliases

8. history历史命令

history可以查看历史输入的命令。

重复上一句命令的4种方法
  1. 使用上方向键,回车执行;
  2. 输入!!,回车执行;
  3. 输入!-1,回车执行;
  4. 按Ctrl+P组合键,回车执行;
执行以前执行过的命令的两种方式
  1. 叹号定位法
    先执行history,找到想执行的命令后,记下这个命令前面的标号,输入!标号,然后回车执行。

  2. 搜索定位法
    按Ctrl+R组合键,会出现(reverse-i-search)''的提示,输入一些关键字,系统会从历史命令中做匹配。

清除历史命令

登录Shell时,Shell会加载文件.bash_history中的历史命令。系统会把内存中的历史命令追加到文件.bash_history中。

# 清除内存中的历史命令
history -c
# 使用内存中的历史命令覆盖.bash_history文件的内容
history -w
history的配置选项
# 历史命令输出时带上时间
export HISTTIMEFORMAT='%F %T'
# 设置内存中的历史命令的个数
export HISTSIZE=1000
# 设置文件中的历史命令的个数
expost HISTFILESIZE=1000
# 更改历史命令的文件位置
export HISTFILE=~/history.log# 清除历史命令中的重复条目
export HISTCONTROL=erasedups
# 不记录连续重复的命令
export HISTCONTROL=ignoredups
# 不记录空格开始的命令
export HISTCONTROL=ignorespace
# 相当于ignoredups+ignorespace
export HISTCONTROL=ignoreboth
保护重要命令的两种方式

一些重要命令在使用时不希望被记录在history中,防止系统被攻击时泄露信息。

  1. 设置HISTCONTROL环境变量export HISTCONTROL=ignorespace,然后在输入重要命令时,前面加上空格。
  2. 设置HISTIGNORE环境变量export HISTIGNORE=*,执行重要命令。结束后设置export HISTIGNORE=
    这样做显得麻烦,但是能避免忘记在命令前加空格。

9. xargs传递参数

管道可以将前面的标准输出作为后面的标准输入。
xargs可以把前面的标准输出作为后面的命令参数。
xargs经常和find命令一起使用。

  • xargs的分割符
    xargs的默认分隔符是空格,标准输入中出现的换行符、空格、制表符都会被换成空格。
    当一个参数中自带空格时,该参数也会被分割成多个参数。使用-0选项,可以把xargs的默认分隔符改为NULL。
    -0选项还会把单引号、双引号、反斜线等都认作普通字符。

  • 人为确定是否传参
    前一个命令的标准输出中,如果有一些参数不确定是否要传送,可以使用-p选项,xargs在传送参数前会进行确认。
    再加上-n选项,可以指定xargs每次处理的参数个数。

  • 指定终止点
    -E选项,可以让xargs在遇到特定的参数时终止。

10. time

time能用来测量命令的执行时间,或者给出系统资源的使用情况。

time显示的三种时间

执行time时,会出现三个统计时间
real表示命令从开始执行到完成耗费的CPU总时间,包括CPU时间、I/O阻塞的时间和CPU阻塞时间。
user是进程执行用户态代码耗费的CPU时间。仅指进程实际使用CPU的时间,不包括阻塞时间。
sys是进程在内核态运行所耗费的CPU时间,即执行内核系统调用耗费的CPU时间。

一般real=user+sys,也有例外情况。
进程发生阻塞,或者等待其他进程释放CPU时,会出现real>user+sys;
多核系统中,一些程序能同时利用多个核心的计算能力,这时real<user+sys;

有时同样的命令多次执行,time测出的耗时不一样。因为系统会对一些文件作缓存,第二次执行时会使用缓存中的数据,因此耗时变小。

如何显示资源使用情况

直接使用time,用的是bash内置的命令,只统计时间,不能显示资源消耗。
可以显示资源消耗的命令在/usr/bin/目录下。在time命令前加斜线,即可调用显示更多信息的time。

# 仅显示命令的时间消耗
time ls
# 显示时间消耗和资源消耗
\time ls
# 显示更详细的信息
\time -v ls

11. sleep

sleep可以让程序休息指定的时间。使用数值+单位来指定时间。

单位有s(秒),m(分钟),h(小时),d(天),默认使用秒。不同单位的多个时间可以联合使用,需用空格分开。

数值可以是浮点数,用来指定更小级别的睡眠。不过sleep对低于10ms的时间存在误差。

note-Linux大棚命令百篇1 Shell基础及工具篇相关推荐

  1. SHELL基础知识-工具篇-paste、tr

    1.paste工具 paste工具用于合并文件行 常用选项: -d:自定义间隔符,默认是tab -s:串行处理,非并行 2. tr工具 tr用于字符转换,替换和删除:主要用于删除文件中控制字符或进行字 ...

  2. shell基础二十篇 一些笔记

    shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read (read命令更具体的说明见博客收藏的一 ...

  3. Linux(12)-命令行的使用,shell脚本

    命令行的使用,shell脚本 1.终端shell,man 2.shell 编程 2.1 shell脚本 2.2 注释 2.3 指明所用的shell 2.4 支持函数 2.5 使用变量 2.6 解析命令 ...

  4. Linux shell篇---之一--shell基础

    一.shell基础 1.shell的基本概念 shell就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具. 用户界面shell(还有其他用户界面如kde等图形界面)-->内核--& ...

  5. Linux学习总结(十七)-shell 基础知识

    该篇内容很杂,但还是不难理解,就不逐个贴图举例. 一 先介绍几种常用字符: 1 * 匹配任意个任意字符 2 ?匹配一个任意字符 3 # 注释符号,符号后的语句不被执行 4 \脱意字符,后面跟带含义字符 ...

  6. 『面试知识集锦100篇』2.linux篇丨shell基础命令全集,我奶奶的速查手册!!

    目录 第一部分:基础知识 一.Linux 文件基本属性 二.Linux 磁盘管理 2.1 df命令 2.2 du命令 2.3 磁盘检验

  7. linux的命令行操作和shell的区别

    这个问题也是突然想起来的,因为我身边的同事有时候会把这两个区别的表述,所以我就好奇了,到底是什么关系呢,他们都能操作Linux系统啊..后来百度一下才知道大致的区别. 一.什么是shell 答:    ...

  8. Linux相关命令、Vi、shell编程

    一. 系统用户.系统组管理 1.useradd 一个用户可以属于多个组,主组只有一个 useradd -c /-d /-D / -g/ -G/ -m/ -s/ -r/ -u -c 密码提示 -d 指定 ...

  9. Linux常用命令、Vim、Shell、计划任务

    2019独角兽企业重金招聘Python工程师标准>>> 以下命令总结于<Linux就该这么学> #常用系统工作命令 man    #帮助命令 echo $SHELL (H ...

最新文章

  1. Python组合数据类型之字典类型
  2. Cell Reports:中大骆观正+上科大季泉江-CRISPR引导的细菌靶向遗传筛选系统
  3. HTML DOM getElementById() 方法
  4. linux下如何删除整行文本格式,Shell中如何删除文本比较长的行的实现方法
  5. 电脑有回声_电脑麦克属性调整(用于回声消除)
  6. 你连原理都还没弄明白?java的基本单位
  7. 房产众筹项目质疑声中再推出
  8. 特征值 模拟 第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛
  9. 博后招募 | 澳大利亚悉尼大学徐畅老师招收深度学习方向博士后/全奖博士
  10. 视觉SLAM常用的数据集集合【3】
  11. 常用的正则化方法总结
  12. arch linux 时间,archlinux入门--设置时钟 - webdancer's Blog
  13. uniapp语音识别_uni-app开发APP语音播报功能
  14. python中对象和类的关系_Python面向对象之类与类之间的关系
  15. K8s宣布弃用Docker?千万别慌!
  16. 三元组顺序表表示的稀疏矩阵加法_知识表示学习记录(1)
  17. 【毕设教程】物联网/嵌入式/单片机毕业设计项目开发流程
  18. 代理猎手(Proxy Hunter)教程(详细图文)
  19. R. Shankar《Principles of Quantum Mechanics (2nd)》(山卡《量子力学原理(第二版)》)双语目录
  20. 如何使用Bootbox

热门文章

  1. 塞尔达传说顺序_您可能错过的有争议的塞尔达传说
  2. 化工集团公司数字化转型有力抓手“数字化示范项目建设
  3. 服务器微信接口返回乱码,微信开发时,返回的消息中文乱码问题
  4. 2021阿里云、腾讯云、华为云、滴滴云评测比较
  5. 视觉SLAM14讲笔记分享——第四章【李群与李代数】
  6. python怎么做大数据_python可以做大数据
  7. 学 Python 的乐园,坚持一年,值了!
  8. 用pandas的isin,~+isin筛选数据
  9. Android获取天气预报Demo
  10. 田野调查手记·浮山摩崖石刻(十三)