Shell基础

1 Shell命令的基本格式

基本格式

command [选项] [参数]

[]表示可选的,也就是可有可无。有些命令不写选项和参数也能执行,有些命令在必要的时候可以附带选项和参数。

短格式选项和长格式选项

Linux 的选项又分为短格式选项和长格式选项。

  • 短格式选项是长格式选项的简写,用一个减号-和一个字母表示,例如ls -l
  • 长格式选项是完整的英文单词,用两个减号--和一个单词表示,例如ls --all

一般情况下,短格式选项是长格式选项的缩写,也就是一个短格式选项会有对应的长格式选项。当然也有例外,比如 ls 命令的短格式选项-l就没有对应的长格式选项,所以具体的命令选项还需要通过帮助手册来查询。

2 单引号、双引号、反引号

  • 单引号:用于希望其中的内容原样输出的场景。

    a=123
    echo 'a=$a'
    echo 'echo 1'
    # 输出 a=$a ,不会做取变量的操作
    # 输出 echo 1,不会执行echo 1的命令
  • 双引号:用于希望在其中填充变量执行命令的场景。

    a=123
    echo "a=$a"
    echo "`cat 2.txt`"
    echo "cat 2.txt"
    # 执行结果
    # a=123 执行了取变量的操作
    # hello world! 执行了反引号中的命令
    # cat 2.txt 与写了反引号做对比
  • 反引号:用于在双引号中引用命令,表示执行这个命令。或者将命令的结果赋值给一个变量的场景。支持嵌套

  • 将命令的结果赋值给变量

    variable=`command`
    variable=$(command)
    # 推荐第二种方式,可读性更好,单引号与反引号不好区分
  • 变量的输出

    #!/bin/bash
    ps=`ps -ef`
    echo $ps ps1=`ps -ef`
    echo "$ps1"

    注意:如果被替换的命令的输出内容包括多行(也即有换行符),或者含有多个连续的空白符,那么在输出变量时应该将变量用双引号包围,否则系统会使用默认的空白符来填充,这会导致换行无效,以及连续的空白符被压缩成一个。

    具体执行效果可以运行上面的shell脚本,观察可知,带双引号的变量输出会保留原本的格式,而不带的,换行会被压缩一个空格,格式乱了,不利于接下来的过滤信息。所以推荐使用双引号来输出变量。

3 关于$*与$@

  • 相同点:两者都可用于从函数中取参数

  • 不同点

    • 当不被双引号包含时,两者没有任何区别

    • 当被双引号包含时,$@会将参数分割,而$*会将所有参数视为一个整体

#!/bin/bash

# $@ 不带双引号
for var in $@; do
echo "$var"
done # $* 不带双引号
for var in $*; do
echo "$var"
done # $* 带双引号
for var in "$*"; do
echo "$var"
done # $@ 带双引号
for var in "$@"; do
echo "$var"
done

4 字符串操作

4.1 字符串的赋值

可以使用三种方式进行字符串的赋值

a=string
b='string'
c="string"

4.2 字符串的拼接

直接进行拼接就好或者在双引号内部拼接

a="user"
b="wang"
echo "$a is $b"
# 输出 user is wang

4.3 字符串的截取

字符串的截取是经常用到的操作,例如路径截取、版本号截取

主要分为两种方式:

  1. 已知想要的字符串的起始和结束的下标,可以通过指定下标的方式截取

    语法:${string:start:length}
  2. 已知想要的字符串是什么结构,不确定起始和结束的下标,可以通过子串匹配的方式截取

    ${string#*chars} # 使用#截取右边的所有字符,第一个匹配的
    ${string##*chars} # 使用##截取右边的所有字符,最后一个匹配的
    ${string%chars*} #使用% 截取左边的所有字符,第一个匹配的
    ${string%%chars*} #使用%% 截取左边的所有字符,最后一个匹配的

测试程序

#!/bin/bash
a='hello aa, hello bb'
# 1
echo "1 ---指定截取位置---"
# 指定截取位置 从左向右计数,下标从0开始计数
echo "${a:0:5}"
echo "${a:10}"
# 指定截取位置 从右向左计数,下标从1开始计数
echo -----
echo "${a:0-8:8}"
echo "${a:0-8}" # 2
# 匹配子串
echo "2 ---匹配子串截取---"
# 从左边开始匹配
echo "${a#*'hello'}" # 可以使用单引号引用字符串
echo "${a##*hello}"
# 从右边开始匹配
echo -----
echo "${a%hello*}"
echo "${a%%hello*}"

汇总

格式 说明
$ 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
$ 从 string 字符串的左边第 start 个字符开始截取,直到最后。
$ 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
$ 从 string 字符串的右边第 start 个字符开始截取,直到最后。
$ 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
$ 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
$ 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
$ 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

4.4 字符串的替换

#用变量替换${a//}做字符串替换
${a/要被取代的字串/新的字串} # #变量a中的第一个匹配的字符串会被替换
${a//要被取代的字串/新的字串} #变量a中所有匹配的字符串都会被替换,多了一个 /
#用sed做字符串替换
sed 's/要被取代的字串/新的字串/' # 用来替换第一个匹配的字符串
sed 's/要被取代的字串/新的字串/g' # 用来替换所有匹配的字符串,多了一个 g

Shell命令-常用操作的更多相关文章

  1. Linux Shell数组常用操作详解

    Linux Shell数组常用操作详解 1数组定义: declare -a 数组名 数组名=(元素1 元素2 元素3 ) declare -a array array=( ) 数组用小括号括起,数组元 ...

  2. linux shell 命令常用快捷键

    下面是一些shell的常用快捷键,快捷键玩熟悉了在一定程度上是可以提高工作效率滴… Ctrl + a 切换到命令行开始 Ctrl + e 切换到命令行末尾 Ctrl + l 清除屏幕内容 Ctrl + ...

  3. Shell命令行操作

    1.1 shell提示符 [me@linuxbox ~]$ 如果最后一个字符是"#",表示当前终端会话有超级用户权限.使用root用户登录或者使用能提供超级用户权限的终端能获得该权 ...

  4. top 命令常用操作

    1.显示进程参数 top -c 下面操作为top命令后操作 2.按cpu/mem排序 shift + p/m 3.高亮 排序列 按x键 4.高亮 变化进程行 按b键 5.显示cpu每核的运行状态 按1 ...

  5. linux shell 字符串常用操作

    1.shell内置的字符串操作 表达式 含义 ${#string} $string的长度 ${string:position} string中,从位置$position开始提取字符串 ${string ...

  6. Shell命令-网络操作之基础之telnet、ssh

    文件及内容处理 - telnet.ssh 1. telnet:使用TELNET协议远程登录 telnet命令的功能说明 telnet 命令用于远端登入.执行 telnet 指令开启终端机阶段作业,并登 ...

  7. vi命令常用操作

    一.vi的操作模式  vi提供两种操作模式:输入模式(insert mode)和指令模式(command mode).在输入模式下,用户可输入文本资料.在指令模式下,可进行删除.修改等各种编辑动作.  ...

  8. Shell命令-网络操作之基础之scp、wget

    文件及内容处理 - scp.wget 1. scp:用于不同主机之间复制文件 scp命令的功能说明 scp 命令用于 Linux 之间复制文件和目录.scp 是 secure copy 的缩写, sc ...

  9. Shell命令-网络操作之基础之ping、route

    文件及内容处理 - ping.route 1. ping:测试主机之间网络的连通性 ping命令的功能说明 ping 命令用于检测主机.执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信 ...

  10. 一些风骚的shell命令行操作

    1.用你最喜欢的编辑器来敲命令 command <CTRL-x CTRL-e> 在已经敲完的命令后按<CTRL-x CTRL-e>,会打开一个你指定的编辑器(比如vim,通过环 ...

随机推荐

  1. Oracle 一对多将多行数据整理为一行

    在开发中一对多的关系经常用到,昨天遇到一个客户问题,要求将所有反馈任务的信息整理为一行展示并导出excel. 我数据库对应关系:通任务task对应feedback表多个反馈,也就是说每个任务都有很多条 ...

  2. 一文带你快速入门 Go 语言微服务开发 - Dubbo Go 入门实践总结

    更多详细示例可直接访问 Dubbo 官网 或搜索关注官方微信公众号:Apache Dubbo 1. 安装Go语言环境 建议使用最新版 go 1.17 go version >= go 1.15 ...

  3. day31 1 tomcat介绍与创建web项目 & 2 继承HttpServlet类、配置webxml全局配置文件 & 3 servlet生命周期 & 4 请求对象HttpServletRequest与响应对象HttpServletResponse

    Servlet Java Servlet是运行在Web服务器或应用服务器上的程序,作为客户端(Web浏览器或其他HTTP客户端)和服务端(HTTP服务器上的数据库或应用程序)之间的中间层. 使用Ser ...

  4. MISC图片批量处理jio本

    此处以ctfshow中MISC入门题目作为切入点 感兴趣的同学可以一边做题一边参照 批量修改PNG图片的宽 import zlib import struct filename = "fla ...

  5. 【每日一题】【map、数组、二维数组排序、静态函数和库函数】2022年2月24日-NC97 字符串出现次数的TopK问题

    描述给定一个字符串数组,再给定整数 k ,请返回出现次数前k名的字符串和对应的次数.返回的答案应该按字符串出现频率由高到低排序.如果不同的字符串有相同出现频率,按字典序排序.对于两个字符串,大小关系取 ...

  6. Qt VideoMeeting_Intercom师生对讲开发中实际上遇到的一些问题,终于结项了,也照例写一下总结吧。

    layout: post title: Qt VideoMeeting_Intercom师生对讲开发中实际上遇到的一些问题,终于结项了,也照例写一下总结吧. description: 软件开发,初次开 ...

  7. java逻辑运算&&与&的区别

    本文主要阐述&&(短路与)和&(逻辑与)的运算异同:a && b 和 a&b : 共同之处是只有a和b同时为真时,结果才为真,否则为假 不同点在于 a ...

  8. 论文解读(CAN)《Contrastive Adaptation Network for Unsupervised Domain Adaptation》

    论文信息 论文标题:Contrastive Adaptation Network for Unsupervised Domain Adaptation论文作者:Guoliang Kang, Lu Ji ...

  9. [深度学习] caffe分类模型训练、结果可视化、部署及量化笔记

    本文为本人caffe分类网络训练.结果可视化.部署及量化具体过程的心得笔记.caffe目前官方已经停止支持了,但是caffe是目前工业落地最常用的深度学习框架,用的人挺多.其实主要怕自己忘了,弄个备份 ...

  10. MongoDB - 分片简介

    简介 什么是分片 高数据量和高吞吐量的数据库应用会对单机的性能造成较大压力,大的查询会将单机的 CPU 耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存压力转移到磁盘 IO 上. 为了解决这 ...