0
点赞
收藏
分享

微信扫一扫

shell编程(一)入门hello world!


目录

​​一.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编程(一)入门hello world!_shell脚本

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

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

             

四.基本语法

           

            变量

               

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

        1.环境变量

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

        2.本地变量

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

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

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

                      1.只有String类型

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

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

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

                     3.

shell编程(一)入门hello world!_shell脚本_02

                         

shell编程(一)入门hello world!_shell_03

 

                         var =hello 

                         变量名=变量值

                         echo  $var ===取变量值

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

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

                         unset            VARNAME   

                   04通配符

                               文件名代换(globbing)

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

                               

 

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

                               ? 匹配一个任意字符

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

                               

 

                                  

shell编程(一)入门hello world!_环境变量_04

                               注意,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命令组成的

                    例如:

                                         

shell编程(一)入门hello world!_c语言_05

                   实验结果如下:

                                         

shell编程(一)入门hello world!_shell脚本_06

 

                                       

          3.case/esac

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

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

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

                         例子:

                                         

shell编程(一)入门hello world!_shell脚本_07

                                         

shell编程(一)入门hello world!_环境变量_08

 

          4.循环

                    for/do/done

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

                     

shell编程(一)入门hello world!_shell_09

                     

shell编程(一)入门hello world!_shell_10

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

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

                    

shell编程(一)入门hello world!_shell_11

 

                     break和contonue

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

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

                      即break 跳出,contine跳过

        

 

                          

 

 

 

              

         

               

 

               

 

 

 

 

 

 

 

 

 

 

 

 

                   

 

                          

 

  

                     

 

 

 

 

        

举报

相关推荐

0 条评论