代码编织梦想

目录

一.shell编程的历史

二.由于历史原因,unix系统上有很多种 shell:

三.内建命令和小括号

四.基本语法

五. shell脚本语法

          

一.shell编程的历史

             shell的历史是解释执行用户的命令,用户输入一条命令,shell就解释执行一条,这种方式称为交互式(Interactive),shell还有一种执行命令的方式 称为批处理

  (Batch),用户事先写一个shell脚本(script),其中有很多流程控制语句 但shell脚本是解释执行的,不需要编译,shell程序从脚本中一行一行读取并执行这些命令,相当于用户把

  脚本的命令一行一行敲到shell提示符下执行.

二.由于历史原因,unix系统上有很多种 shell:

                        1.sh(bourne  shell)

                        2.csh

                        3.ksh

                        4.tcsh

                        5.bash

三.内建命令和小括号

          Shell 内建命令,就是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件。

          type 来确定一个命令是否是内建命令

            

               不加小括号,改变当前工作目录

               加小括号,不改变当前工作目录

             

四.基本语法

           

            变量

               

            按照惯例,shell变量通常由字母加下划线开头,由任意长度的字母,数字下划线组成.有两种类型的shell变量:

        1.环境变量

                     环境变量可以从父进程传递给子进程,因此shell变量可以从当前shell进程传给fork出来的子进程.用printenv命令可以显示当前shell进程的环境变量

        2.本地变量

                    只存在于当前shell进程,用set命令显示当前shell进程中定义的所有变量(包括本地变量和环境变量)和函数

                   环境变量是任何进程都有的概念,而本地变量是shell特有的概念

                   在环境变量和本地变量的定义和用法相似.在shell中定义或赋值一个变量:

                      1.只有String类型

                      2.变量  环境变量和本地变量

                           环境变量======相当于c语言中的全局变量

                           本地变量======相当于c语言中的局部变量

                     3.

                         

 

                         var =hello 

                         变量名=变量值

                         echo  $var ===取变量值

                         export  var 将本地变量改为环境变量

                         unset    命令可以删除已定义的环境变量   

                         unset            VARNAME   

                   04通配符

                               文件名代换(globbing)

                               这些用于匹配的字符串称为通配符(wildcard),如:*? [] 具体如下:

                               

 

                               *  匹配0个或多个任意字符

                               ? 匹配一个任意字符

                               [ ]  匹配方括号中任意一个字符的一次出现

                               

 

                                  

                               注意,globbing 所匹配的文件名是由shell展开的,也就是说在参数 还没传给程序之前就已经展开,比如上述ls

                              cho[012].doc 如果当前目录下有cho0.doc和cho1.doc则传递给ls命令的参数实际上是这两个文件名,而不是匹配字符串

 

 

          3. 命令代换

                            由" "反引号括起来的也是一条命令,shell先执行该命令,然后将输出结果立即带换到当前命令行中,例如

                            定义一个变量存放date命令的输出:

                                  Date  ="date"

                                  echo $Date

                            命令代换也可以用$()表示

                            $(date)

 

 

           4.算数代换

 

                          使用$(())  ,用于算术计算,(())中的shell变量取值将转成整数同样的含义$[]等价,例如:

                          VAR=45;

                          echo $(($VAR+3)) 等价于echo $[VAR+3]或$[$VAR+3]

                          $(())中只能用于+-*/和()运算符,并只能做整数运算

                          $[base#n],其中base表示进制,n按照base进制解释,后面再有运算数按十进制解释

           5.转义字符

                           和 c语言类似,\在shell中被用作转义字符,用于除去紧跟其身后的单个字符的意义(回车除外),换句话说,紧跟其后的字符取字面值.

           6.单引号

                            和c语言相同,shell脚本中的单引号和双引号都是字符中的界定符,而不是字符的界定符,单引号用于保持引号内所有字符的字面值,即使引号内的\和

                            回车也不能出现单引号

           7.双引号

                           被双引号括住的内容,将被视为单一字串.他防止通配符扩展但允许变量扩展.

 

       五. shell脚本语法

               1.条件测试

                     命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit status为0,

                     如果测试结果为假,则该命令的Exit Status为1

                     (注意与c语言的逻辑正好相反)

                      虽然看起来很奇怪,但左括号[确实是一个命令的名字,传给命令的各个参数之间应该用空格隔开,如:

                         [ -d DIR ] 如果DIR存在并且是一个目录则为真

                         [-f file ] 如果file存在且是一个普通文件

                         [- z string] 如果string的长度为0则为真

                         [- n string] 如果string的长度不为零则为真

                         [string1 =string2] 如果string的长度不为零则为真

                         [string1!=string2] 如果两个字符串不相同则为真

                          

                             [arg1 op arg2]  arg1和arg2应该是整数或者取值为整数的变量

                              op是 -eq 等于

                                        -ne 不等于

                                       -lt   小于

                                       -le 小于等于

                                        -gt 大于

                                         -ge  大于等于

                                        之中的一个

 

                                作为一个好的shell编程习惯,应该总是把变量取值放在双引号之中

                                  

               2.分支 if/then/elif/else/fi

                           和c语言类似,在shell中if,then,elif,else,fi这几条命令实现分支控制.这种流程控制语句本质上也是由若干shell命令组成的

                    例如:

                                         

                   实验结果如下:

                                         

 

                                       

          3.case/esac

              case命令 可类比c语言的switch/case语句,esac表示case语句块的结束.c语言的case只能匹配整型或者字符型常量表达式,而

            shell脚本的case可以匹配字符串和wildCard,每个分支可以有若干个命令,末尾必须以;;结束.执行时找到第一个匹配的分支并执行相应的命令

            然后直接跳到esac之后,不需要像c语言一样用break跳出循环

                         例子:

                                         

                                         

 

          4.循环

                    for/do/done

                    shell脚本的for循环结构和c语言的for循环结构不一样,他类似于某些编程语言的foreach循环.例如:

                     

                     

                      fruit是一个循环变量,第一次循环$fruit的取值是apple,第二次取值是banana,第三次取值是pear

                    例子2.将当前目录下的chap0.chap1,chap2等文件名改成 chap~,chap1~,chap2~(按照惯例,末尾有~字符的文件名表示临时文件)

                    

 

                     break和contonue

                      break[n]可以指定跳出几层循环

                      continue跳出本次循环,但不会跳出循环

                      即break 跳出,contine跳过

        

 

                          

 

 

 

              

         

               

 

               

 

 

 

 

 

 

 

 

 

 

 

 

                   

 

                          

 

  

                     

 

 

 

 

        

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_42369687/article/details/111084552

(IDEA)SpringBoot项目部署到阿里云-爱代码爱编程

SpringBoot项目部署到阿里云 1 项目打包 点击IDEA右边的Maven,打开Lifecycle,点击package 之后在你的target下会生成一个jar包 之后将这个jar包发送到你的阿里云服务器上 2 启动项目 先使用命令查看你的项目的端口号是否被占用 lsof -i:端口号 如果显示被占用,就先结束该进程,可以看到这个进程的

shell颜色代码(ANSI控制码)-爱代码爱编程

Shell 颜色代码 代码执行结果总结(表格形式; \E 标识符在 PS1 环境变量中不生效,只能用\033)ANSI 其它控制码 代码 # col.sh # 颜色代码标识 \003 可以替换为 \E # 多个 ANSI 控制码可同时使用,用分号(;)作为分隔符, 红底绿字闪烁:echo -e "\E[32;41;05mtest\E[0m"

Jetson温度监测/调节风扇转速/开机自启动风扇-爱代码爱编程

Jetson Xavier NX开机的时候风扇默认不转的,在温度升高后才会转动。 1 温度监测 1.1 第一种方法用sensors命令 首先需要安装 sudo apt install lm-sensors 然后运行sensors sensors 运行效果如下: 1.2 第二种方法用jtop(英伟达官方) 首先需要安装pip3,用pip

linux常用命令-爱代码爱编程

cd命令(change directory)切换目录cd .. 返回上级目录cd或者cd ~返回home目录cd / 返回根目录cd ../.. 返回上两级目录ls命令(list) – 显示指定工作目录下的内容及属性信息detailscat命令 – 在终端设备上显示文件内容details cat test.txt cp命令(copy) – 复制文件或

ubuntu18.04设置开机启动命令/脚本的三种方法(可sudo)-爱代码爱编程

很多时候想开机时便启动想要启动的命令(甚至是需要sudo的命令)。 但是如何设置呢,一般来说有以下三种方法。 (本文针对的是ubuntu18.04设置开机启动命令或者脚本) 1 不用sudo的命令开机自启动 1.1 方法一(开机自动执行一条指令) 1.在终端中输入 gnome-session-properties 2.点右方的add加入 填写

shell自动化编程学习(一)-爱代码爱编程

学习linux,shell是绕不过去的槛。以此记录学习,共勉。 一、Shell中的变量 1.1 系统变量 常用系统变量 $HOME、$PWD、$SHELL、$USER等 (1)查看系统变量的值 (2)显示当前shell中所有变量 set 1.2 自定义变量 1.基本语法: (1)声明变量:变量名=变量值 (2)撤销变量:unset