shell编程_shell $1-程序员宅基地

技术标签: c++  shell编程  linux  bash  

第1章 Shell概述

  • shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核

第2章 Shell 解析器

  • linux 提供的Shell 解析器有很多,最常用的俩个解析器为:sh和bash。

  • Centos默认的解析器是bash

    [root@zjh home]# echo $SHELL
    /bin/bash
    

第3章 Shell脚本入门

  • 脚本格式

    脚本以#!/bin/bash 开头(指定解析器)

  • 第一个Shell 脚本:helloworld

    # 创建脚本
    [root@zjh home]# cat helloworld.sh 
    #!/bin/bash
    echo "hello zjh"
    
    # 执行脚本方式1
    [root@zjh home]# bash helloworld.sh 
    hello zjh
    
    # 执行脚本方式2
    [root@zjh home]# ./helloworld.sh
    -bash: ./helloworld.sh: 权限不够
    

    方式1,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限;

    方式2,本质是脚本自己需要执行,所以需要执行权限

  • 第二个Shell 脚本:多命令处理

    需求 :在linux家目录下创建一个bangzhang.txt并在文件中写入"I IOVE YOU"字符.

    [root@zjh home]# touch batch.sh
    [root@zjh home]# vim batch.sh
    
    #!/bin/bash
    cd /home/linux/
    touch banzhang.txt
    echo "I LOVE YOU" >> banzhang.txt
    

第4章 Shell中的变量

4.1 系统变量
  • 常用系统变量 $HOME $PWD $SHELL $USER

    [root@zjh home]# echo $HOME
    /home/linux
    [root@zjh home]# echo $PWD
    /home/linux/datas
    [root@zjh home]# echo $SHELL
    /bin/bash
    [root@zjh home]# echo $USER
    linux
    
4.2自定义变量
  • 1.基本语法

    定义变量:变量=值 等号两边不能留有空格

    撤销变量:unset 变量

    输出变量:echo $变量

    声明静态变量: readonly 变量,注意:不能unset

    [root@zjh home]# A=1
    [root@zjh home]# echo $A
    1
    [root@zjh home]# unset A
        
    # readonly 变量,注意:不能unset
    [root@zjh home]# readonly B=2
    [root@zjh home]# echo $B
    2
        
    [root@zjh home]# B=9
    -bash : B: readonly variable
        
        
    
  • 2.变量定义规则

    1. 变量名称可以由字母,数字和下划线组成,不能以数字开头,环境变量名建议大写

    2. 等号两侧不能有空格

    3. 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

    4. 变量的值如果有空格,需要使用双引号或单引号括起来

[root@zjh home]# D="A B C"
[root@zjh home]# echo $D
A B C
    
[root@zjh home]# C=1+2
[root@zjh home]# echo $c
1+2


  • 可把变量提升为全局变量,可供其他shell程序使用:
    export 变量
4.3 特殊变量:$n
  • $n——n为数字,$0 代表脚本名称,10以内参数用$1- 9 表 示 , 10 以 上 需 要 用 大 括 号 9表示,10以上需要用大括号 910{10}.
#!/bin/bash
echo "$0" "$1" "$2" "$3"
[root@zjh home]# sh parameter.sh
parameter.sh
  
[root@zjh home]# sh parameter.sh 10 lal 20
parameter.sh 10 lal 20

####4.4 特殊变量:$#

  • $#——获取所有输入参数个数,常用于循环
[root@zjh home]# vim parameter.sh
#!/bin/bash
echo "$0" "$1" "$2"
echo $#
[root@zjh home]# bash parameter.sh
parameter.sh
0
[root@zjh home]# bash parameter.sh 10 lala 20
parameter.sh 10 lala 20
3

####4.5 特殊变量: ∗ 和 * 和 @

  • $* ——代表命令行中所有的参数,把所有参数看成一个整体

  • $@ ——也代表命令行中所有的参数,不过把每个参数区分对待

[root@zjh home]# vim parameter.sh
echo "$0" "$1" "$2" "$3"
echo $#
echo $*
echo #@
[root@zjh home]# sh parameter.sh 1 2 3
parameter.sh 1 2 3
3
1 2 3
1 2 3
4.6 特殊变量:$?
  • $?——最后一个执行的命令的返回状态。如果这个变量的值为0,则最后一个命令正确执行

    ​ 如果这个值为非0(具体哪一个数,由命令自己来决定),则证明上一个命令执行不正确

[root@zjh home]# sh parameter.sh 1 2 3
parameter.sh 1 2 3
3
1 2 3
1 2 3
    
[root@zjh home]# $?                          执行失败返回非0
-bash:0 : command not found
[root@zjh home]#  echo $?
127
    
[root@zjh home]#  sh parameter.sh 1 2 3       执行成功返回0
parameter.sh 1 2 3
3
1 2 3
1 2 3
    
[root@zjh home]# echo $?
0

第5章 运算符

5.1 基本语法
  • $((运算式)) 或者 $[运算式]
  • expr +. -, *, /, % 加,减,乘,除,取余
     注意:expr运算符间要有空格
5.2 实例实操

计算3+2的值

[root@zjh home]# expr 2 + 3
5
[root@zjh home]# expr 2+3
error

计算(2+3)x4的值

[root@zjh home]# expr `expr 2 + 3` \* 4
20
[root@zjh home]#  a=$[(2+3)*4]
[root@zjh home]#  echo $a
20

第6章条件判断

6.1基本语法

[ condition ] (注意 condition前后要有空格)

注意:条件非空即为true, [atguigu] 返回 true, []返回false

6.2常用条件判断
符号 描述
-lt (less than) 小于
-le (less equal) 小于等于
-eq (equal) 等于
-gt (greater than) 大于
-ge (greater equal) 大于等于
-ne (no eqeual) 不等于
文件权限判断
  • -r 有读的权限
  • -w 有写的权限
  • -x 有执行的权限
文件类型判断
  • -f 文件存在并且是一个常规文件 (file)
  • -e 文件存在 (exixtence)
  • -d 文件存在病是一个目录 (directory)
6.3 案例实操
# 判断23是否大于2
[root@zjh home]# $ [ 23 -gt 2 ]
[root@zjh home]# echo $?
0

[root@zjh home]# $ [ 23 -le 2 ]   
[root@zjh home]# echo $?           #返回值非0说明上一条指令执行错误,也就是[ 23 -le 2 ] 
1                                  #是错误的
    
# 判断helloworld.sh是否有写入权限
[root@zjh home]#  [ -w hellowrld.sh ]
[root@zjh home]#  echo $?
0

# 判断目录中文件是否存在
[root@zjh home]#  [ -e /home/linux/datas ]
[root@zjh home]#  echo $?
0
    
    
#多条件判断
[root@zjh home]# [ condition ] && echo OK || echo notok 
OK
[root@zjh home]# [ condition ] && [] || echo notol
notok

第7章 流程控制(重点)

7.1 if语句
  • 注意事项:[ 条件判断 ],中括号和条件判断之间必须有空格。

  • if 后要有空格

[root@zjh home]# cat if.sh
#!/bin/bash
if [ $1 -eq 1 ]
then
	echo "我最帅"
elif [ $1 -eq 2 ]
then
	echo "我最好看"
fi
    
[root@zjh home]# bash if.sh 2
我最好看
7.2 case语句

注意事项

  • case 行尾必须为单词"in", 每一个模式匹配必须以右括号“)”结束。
  • 双分号“;;” 表示命令序列结束,相当于java中的break.
  • 最后的“*)” 表示默认模式,相当于java中的default.
[root@zjh home]# cat case.sh
#!/bin/bash
case $1 in
1)
	echo "班长"
;;
2)
	echo "学委"
;;
3)
	echo "体委"
;;
*) 
    exho "人妖"
esac
[root@zjh home]# bash case.sh 4
人妖
7.3 for循环
语法1
[root@zjh home]# cat for.sh
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
	s=$[$s+$i]	
done
echo $s
[root@zjh home]# bash for.sh
5050
语法2
[root@zjh home]# cat for2.sh
#!/bin/bash
for i in $*
do
	echo $i
done
 
for i in $@
do
    echo $j
done
    
[root@zjh home]# bash for2.sh 1 2              //看不出什么区别
1
2
1
2
[root@zjh home]# cat for2.sh
#!/bin/bash
for i in "$*"
do
	echo $i
done
 
for i in "$@"
do
    echo $j
done
    
[root@zjh home]# bash for2.sh 1 2             //能看出明显区别
1 2                                           //$* 是把输入的看成一个整体全部赋给i
1                                             //$@ 是把输入分开传送,依次循环赋给j
2
7.4 while 循环
[root@zjh home]# cat while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]    //i是变量,我们这里使用的是i的值i的值为$i
do
	s=$[$s + $i]
	i=$[$i + 1]
done
echo $s

[root@zjh home]# bash while.sh
5050

第8章 read读取控制台输入

read(选项)(参数)
  • -p 指定读取值时的提示符
  • -t 指定读取值时等待的时间(秒)

参数:

变量:指定读取值得变量名

实际上就是把选项输入的值,赋给变量(参数)

# 提示7秒内,读取控制台输入的名称
[root@zjh home]# cat read.sh
#!/bin/bash
read -t 7 -p "input your name" NAME
echo $NAME
    
[root@zjh home]# bash read.sh            //如果7秒没有输入自动结束
[root@zjh home]# bash read.sh
input your name   zjh
zjh

第9章 函数

9.1 系统函数
  • basename 基本语法

    basename[string / pathname] [suffix] ——basename命令会删掉所有的前缀包括最后一个(’/’)字符,然后将字符串显示出来。

    选项:

    suffix 为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉

    # 方式1
    [root@zjh home]# basename /home/linux/banzhang.txt
    banzhang.txt
    
    # 方式2
    [root@zjh home]# basename /home/linux/banzhang.txt .txt
    banzhang
    
  • dirname基本语法

    dirname 文件绝对路径——从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

    [root@zjh home]# dirname /home/linux/banzhang.txt
    /home/linux
    
9.2 自定义函数
  • #格式
    [function] funname[()]     //[function] 选择项可写,可不写
    {
        Action;
        [return int;]
    }
    funname
    
  • 经验技巧

    • 必须在调用函数之前,先声明函数,shell脚本是逐步运行。不会像其他语言一样先编译。

    • 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255).

# DESC 计算输入两个参数的值
[root@zjh home]# cat sum.sh
#!/bin/bash
function sum(){
	s=0;
	s=$[$1 + $2]
	echo $s
}

read -p "input your sum1:" P1
read -p "input your sum2:" P2
sum $P1 $P2
    
[root@zjh home]# bash sum.sh
input your sum1:1
input your sum2:2
3

第10章 Shell工具(重点)

10.1 cut

cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出。
cut [选项参数] filename

说明:默认分隔符是制表符

  • -f 列号,提取第几列
  • -d 分隔符,按照指定分隔符分隔列
# DESC 切割cut.txt第一列
[root@zjh home]# cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[root@zjh home]#cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
#在cut.txt文件中切割出guan
[root@zjh home]# cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[root@zjh home]# cat cut.txt | grep guan
guan zhen
[root@zjh home]# cat cut.txt | grep guan | cut -d " " -f 1
guan
#选取系统PATH变量值,第2个“:”开始后的所有路径
[root@zjh home]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/
usr/sbin:/sbin:/home/atguigu/bin

[root@zjh home]# echo $PATH | cut -d : -f 3-              //不加-表示第三列,加=表示第三列之后
/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/atguigu/bin
#切割ifconfig后打印IP地址
[root@zjh ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet:192.168.56.137  netmask:255.255.255.0  broadcast:192.168.56.255
        inet6 fe80::5da3:53d8:5d87:598c  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ad:3d:0f  txqueuelen 1000  (Ethernet)
        RX packets 1818  bytes 139153 (135.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 301  bytes 28358 (27.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@zjh ~]# ifconfig ens33 | grep inet
        inet:192.168.56.137  netmask:255.255.255.0  broadcast:192.168.56.255
            
[root@zjh ~]# ifconfig ens33 | grep inet | cut -d : -f 2       
192.168.56.137 netmask

[root@zjh ~]# ifconfig ens33 | grep inet | cut -d : -f 2 | cut -d " " -f 1
192.168.56.137

####10.2 sed

1. 基本用法

  • sed是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,成为“模式空间”,接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,知道文件末尾,文件内容并没有改变,除非你使用重定向存储输出。

2.选项参数说明

  • sed [选项参数] ‘command’ filename

    • -e 直接在指令列模式上进行sed的动作编辑

3. 命令功能描述

  • a 新增,a的后面可以接字符串,在下一行出现

  • d 删除

  • s 查找并替换

# DESC 在第二行后增加mei nv字符
[root@zjh ~]# sed  "2a mei nv" sed.txt   //2a表示第二行
dong zhen                                //单个一个需求命令的话,不需要-e,后面再说
guan zhen
mei nv
wo wo
lai lai
#删除set.txt文件所有包含wo的行
[root@zjh ~]# sed '/wo/d' sed.txt
dong zhen                                
guan zhen

lai lai
#将sed.txt文件中wo替换为ni
[root@zjh ~]# sed  "s/wo/ni/g" sed.txt     g代表全局变量,把所有的wo替换为ni
dong zhen                               
guan zhen
ni ni
lai lai
#将sed.txt文件中的第二行删除并将wo替换成ni
[root@zjh ~]# sed -e "2d" -e "s/wo/ni/g"  sed.txt
dong zhen                               
ni ni
lai lai
10.3 awk

awk 一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

awk [选项参数] 'pattern1 {action1} pattern2{action2}..' filename
  • -F 指定输入文件分隔符
  • -v 赋值一个用户定义变量
10.4 sort

sort 命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出

sort [选项] (参数)
参数 描述
-n 依照数值大小排序
-r 以相反的顺序排序
-t 设置排序时使用的分隔字符
-k 指定需要排序的列

hen

lai lai


```c++
#将sed.txt文件中wo替换为ni
[root@zjh ~]# sed  "s/wo/ni/g" sed.txt     g代表全局变量,把所有的wo替换为ni
dong zhen                               
guan zhen
ni ni
lai lai
#将sed.txt文件中的第二行删除并将wo替换成ni
[root@zjh ~]# sed -e "2d" -e "s/wo/ni/g"  sed.txt
dong zhen                               
ni ni
lai lai
10.3 awk

awk 一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

awk [选项参数] 'pattern1 {action1} pattern2{action2}..' filename
  • -F 指定输入文件分隔符
  • -v 赋值一个用户定义变量
10.4 sort

sort 命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出

sort [选项] (参数)
参数 描述
-n 依照数值大小排序
-r 以相反的顺序排序
-t 设置排序时使用的分隔字符
-k 指定需要排序的列
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45043334/article/details/124221787

智能推荐

指定mysql jdbctype_MyBatis JdbcType 与Oracle、MySql数据类型对应关系说明-程序员宅基地

文章浏览阅读315次。1. Mybatis JdbcType与Oracle、MySql数据类型对应列表MybatisJdbcTypeOracleMySqlJdbcTypeARRAYJdbcTypeBIGINTBIGINTJdbcTypeBINARYJdbcTypeBITBITJdbcTypeBLOBBLOBBLOBJdbcTypeBOOLEANJdbcTypeCHARCHARCHARJdbcTypeCLOBCLOBCL..._oracle数据库的的text类型的字段,jdbctype是什么类型

Visual Studio Code 配置 C/C++ 运行环境 - 搭配 MinGW 完美 GNU 配置 Editor_gnu::pure visual studio-程序员宅基地

文章浏览阅读2k次,点赞7次,收藏26次。Visual Studio Code 配置 C/C++ 运行环境 - 搭配 MinGW 完美 GNU 配置前言简介MinGWMinGW 下载安装MinGW 系统环境配置Visual Studio CodeVisual Studio Code 安装以及其基本 C/C++ 插件安装Visual Studio Code C/C++ 环境配置功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入..._gnu::pure visual studio

centos 7 下双网卡bond 与 trunk口的交换机通信(用作KVM虚拟机)_centos7网口trunk-程序员宅基地

文章浏览阅读3.2k次,点赞3次,收藏8次。centos 7 下双网卡bond 与 trunk口的交换机通信做这个首先要明白什么是trunk口trunk 是实现不同网络设备的不同Vlan之间的通信 so 网卡也属于网络设备设置vlan后也可以通信先说下我的环境网络工程师在两台交换机上做了两个trunk模式的vlan 两个口分别连接服务器的 1网卡和2网卡这样做bond 可以防止一台交换机损坏的容灾..._centos7网口trunk

数据存储(k8s)-程序员宅基地

文章浏览阅读58次。容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命容器不与Pod中单个容器的生命周期相关,

基于日志结构的文件系统_基于日志的可靠文件系统-程序员宅基地

文章浏览阅读1.7k次。简单概述基于日志的面向事务文件系统其实和数据库的基于日志恢复算法可以称为不同领域的算法的不同实现,但其实道理都是一样的 下面我们先去了解下什么是事务执行单个逻辑功能的一组指令或操作称为事务。处理事务的主要问题是不管出现什么计算机系统的可能失败,都要保证事务的原子性。原子性简单来说就是一件事情要么完全执行,要么什么也不做基于日志的恢复确保原子性的一种方法就是在稳定存储上记录..._基于日志的可靠文件系统

推荐30款最佳的数据可视化工具_可视化软件-程序员宅基地

文章浏览阅读1.2w次。推荐30款最佳的数据可视化工具发表于2014-04-02 13:28| 64049次阅读| 来源CSDN| 0 条评论| 作者张红月开源可视化工具iChartsFusionCharts XTModest MapsRaw摘要:大量繁杂的数据在经过可视化工具处理后,就能以图形化的形式展现在用户面前,清晰直观。随着各种数据的增加,这种可视化工具越来越得到开_可视化软件

随便推点

5.7 Bootstrap 提示工具(Tooltip)插件_bootstrap tooltip-程序员宅基地

文章浏览阅读503次。提示工具(Tooltip)插件是受 Jason Frame 写的jQuery.tipsy 的启发。注意:提示工具(Tooltip)插件不像之前所讨论的下拉菜单及其他插件那样,它不是纯 CSS 插件。提示工具(Tooltip)插件根据需求生成内容和标记,默认情况下是把提示工具(tooltip)放在它们的触发元素后面。下面的实例演示了通过 data 属性使用提示工具(Tooltip)插件的用法。下面的实例演示了提示工具(Tooltip)插件方法的用法。下面的实例演示了提示工具(Tooltip)插件事件的用法。_bootstrap tooltip

N皇后问题(C++)_n皇后问题c++代码-程序员宅基地

文章浏览阅读2.5k次。N皇后问题是一个经典问题,在一个N*N的棋盘上放置N个皇后,每行刚好放置一个并使其不能互相攻击(同一行,同一列,同一斜线上的皇后都会自动攻击)行列可以很好地判断是不是符合题干,主要是对角线上不能重复,由左下至右上的对角线行列下标相加相同,由左上至右下的对角线(行 - 列)相等。计算一共有多少种合法的方法放置N个皇后。_n皇后问题c++代码

(二)在QT中添加ROS项目+简单的利用QT推送消息+RVIZ显示插件接收消息_qt ros-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏43次。参考下面文章。_qt ros

java编码风格和规范_java编码风格有哪几种-程序员宅基地

文章浏览阅读929次,点赞25次,收藏18次。本文介绍了一些常见的Java编码风格和规范,包括命名规范、缩进和空格、注释规范、类和方法设计、异常处理、格式化和代码布局,以及代码复用和继承。遵循这些规范将有助于提高代码的可读性、可维护性和一致性,并促进团队合作和代码质量的提升。_java编码风格有哪几种

OpenSSH 输入验证错误漏洞(CVE-2020-12062)漏洞修复(本人亲测)-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏20次。目录一: 漏洞描述: 二:修复方式 三: 修复流程 1:查找sshd和ssh位置 2:备份sshd 3: 搜索版本信息 4:替换版本信息(最重要的一步) 5:测试一: 漏洞描述:OpenSSH 输入验证错误漏洞(CVE-2020-12062)二:修复方式漏洞安全对使用的软件扫描漏洞,都是依据软件的版本号探测的,直接升级软件风险太大,因此规避风险,修改软件版本号实现其目的!采用方式:修改openSSH显示版本号三: 修复流程1:查找sshd和ssh位.._cve-2020-12062

Java性能优化十四、MySQL 优化2_java 使用mysql 吞吐量骤减-程序员宅基地

文章浏览阅读150次。文章目录MySQL 优化2一、MySQL调优之索引:索引的失效与优化1、MySQL 索引存储结构2、覆盖索引优化查询3、 自增字段作主键优化查询4、 前缀索引优化5、 防止索引失效总结二、如何避免死锁三、什么时候需要分表分库1、什么时候要分表分库2、如何分表分库3、分表分库之后面临的问题1.分布式事务问题2.跨节点 JOIN 查询问题3.跨节点分页查询问题4.全局主键 ID 问题5. 扩容问题总结MySQL 优化2一、MySQL调优之索引:索引的失效与优化1、MySQL 索引存储结构索引是优化数据._java 使用mysql 吞吐量骤减