2023年8月2日发(作者:)
Linux脚本设计1——vi编辑器使⽤、变量及运算符
对⼤部分语⾔来说,需要作者实现全部功能,linux shell脚本语⾔相当于站在“巨⼈”的肩膀上,有很多实⽤的程序已经在linux系统中实现了,编写linux程序时候只需要调⽤这些程序,当然写程序之前你还是需要规划好你的产品代表的功能。 找到实⽤的程序后,先搞清楚它的功能,再将它加⼊到⾃⼰的程序中。编程者只需要像组装零件⼀样,最终组装成⼀个变形⾦刚~~
对使⽤windows操作系统作为底层平台的程序来说,⼀般会有exe后缀名(有没有其实都⼀样,只是⼀种⽂件的分类标致⽽已)。这个后缀标致代表的意思是:该程序已经转换成了机器码(0 1表⽰),可以⽴即执⾏。 对linux shell程序来说过程是这样的:⾸先程序进⾏编译(将程序翻译成机器码),并且是每次只读⼀⾏,然后翻译成机器码,接着就执⾏⼀⾏,然后再返回程序,重复上述过程,这样会影响程序执⾏效率。 总的来说是:读取⼀⾏,翻译⼀⾏,执⾏⼀⾏ ⼀般来说,单任务处理系统,⼀个程序只要⼀运⾏就会接管对计算机的控制,决定屏幕输出什么内容以及什么。linux是多任务处理,多个任务可以通过分时机制实现多任务运⾏。 要完成⼀个⼤的主题(功能),它⾥⾯会有很多⼩的功能。就是说对于⼀个很⼤的框架来说,我们可以设计、规划成⽐较⼩的框架,⼀个个实现,⽤户界⾯与它后台实际运⾏的⼦程序是相对应的。规划好整体架构和⽤户界⾯后,⼀步步实现⼩的功能,然后搭建出整体。2.
2.1
命令、指令:同⼀个意思,⼀般来说,这些指令、命令都是⼀些实⽤的程序,在系统的环境变量中可以找到这些指令的位置,执⾏这些命令、指令可以得到相应的结果,这些都是计算机的⼀部分。 代码:多个命令指令及编写语句的集合。 程序:为完成⼀项任务的代码。——这个定义太笼统了,等于没有定义。 Shell也和C、java⼀样是⼀种编程语⾔。有⾃⼰的关键字、语法,通过关键字的组合编写出实⽤的语句,就像我们使⽤⾃⼰的母语⼀样,以正确的⽅式发送给计算机,计算机就能懂。每⼀种语⾔都有⾃⼰的关键字,英语、中⽂都⼀样,计算机也有,关键字也称为保留字,在编写程序时,对于⽤户⾃定义的部分如变量、函数名等等都不允许使⽤。
同其他编程语⾔⼀样Shell也有⾃⼰的流程控制语句 :if,else,elif,then :while,for in,continue :case 其他:let,read,echo,clear2.3
shell是⼀类shell的统称,包括很多种,如C shell,bash,Korn shell等,不同shell代表不同的编程环境。通常shell程序是在/bin⽬录下。启动这三种shell分别命令是 C shell:csh bash:bash Korn shell:ksh 在/bin⽬录下可以看到常⽤的命令 这⾥选⽤bash 即Borne Again shell
2.4
这种是不将脚本放在⽂件中,直接命令提⽰符后⾯写命令,命令之间⽤分号;隔开,每⼀⾏最多允许255个字符 这种是将命令放在⽂件中,命令放在⽂件中,命令可以单独放⼀⾏,⾏尾没有分号 通常简单的查看信息可以⽤第⼀种,⽽复杂的任务使⽤第⼆种,⽐如为了查看⽇期,没有必要建⼀个⽂件,写个命令,然后修改执⾏权限,再执⾏,这样做等于把简单的事情复杂化。复杂的任务通常需要第⼆种,对于⼀个⼤的任务来说,需要分成⼩的任务,然后分别解决⼩的问题,再组装设计成⼀个整体。 注意:对于第⼆种来说,也可以把命令放在⼀⾏,命令间⽤分号隔开。执⾏时候有两种办法 脚本绝对路径,执⾏即可如/home/hadoop/Demo/ 如果当前⽤户处在Demo⽬录,则可以⽤./,./表⽰当前⽬录的意思 另⼀种办法是直接执⾏脚本,在任何⼀个⽬录在拥有权限的情况下,执⾏,这种执⾏需要将程序所在的⽬录放在系统的命令路径变量PATH⾥⾯,将路径放在PATH⾥⾯后,系统根据路径,找到执⾏⽬录,就可以执⾏了。PATH变量是放在/etc/profile⾥⾯的,可以在这个⽂件⾥⾯添加,也可以⽤export Demo=/home/hadoop/Demo⽅式添加,然后使⽤source /etc/profile⽅式刷新⽂件,再执⾏就可以了 对于linux有些使⽤字符串的命令来说,需要带双引号,不带也⾏,建议带上,这样显得字符串是⼀个整体,结构性更强。 例如echo Hello World 与echo "Hello World"执⾏结果是⼀样的,建议⽤上双引号,当语句复杂时候,带上双引号会使语句结构清晰。另外如果不带上双引号的话,那么有些单词缩写this‘s是不显⽰单引号的’的,所以带上是万能的,不带是有风险的。2.5
可以⽤户可以查看⽂本(程序),⽆法向其中输⼊内容,输⼊vi命令后回车就进⼊命令模式,在其他模式下按ESC键也可以返回命令模式。ESC即escape (character):逃跑标识,即退出 可以向⽂本中输⼊新的内容,按许多字母键都可以进⼊此模式,如a,i(⼤部分shell都⽀持的),SUSE操作系统按s,q也可以进⼊此状态按冒号:键可以进⼊最后⾏模式,⽤户可以搜索内容、保存⽂件、退出vi等。
1i(⼩写):从命令模式切换到插⼊模式,插⼊的东西在当前光标之前a(⼩写):从命令模式切换到插⼊模式,插⼊的东西在当前光标之后:(冒号):从命令模式切换到最后⾏模式Esc:从插⼊模式切换到命令模式依靠上述⼏种命令,可以实现⼏种模式的相互切换2下⾯命令针对的对象都是光标并且是在命令模式下实现的光标移动是⽂本编辑必不可少的部分,在使⽤如下命令之前可以试试⽅向键,因为不少⼯具是⽀持⽅向键光标的移动的,还有Page Up和Page Down键⽀持翻页,这四种如果⽀持,那⾜以实现光标移动,⽆须在看下⾯的命令。h,j,k,l四个键是对应⽅向键的,可以实现上下移动。不⽤死记四个键代表往哪个⽅向移动,尝试⼀下就可以知道了。h:光标左移⼀个字符j:光标下移⼀⾏k:光标上移⼀⾏l:光标右移⼀个字符+:光标移动⾄下⼀⾏⾏⾸-:光标移动⾄上⼀⾏⾏⾸0:光标移动到本⾏⾏⾸$:光标移动到本⾏⾏尾3Ctrl +F:向前翻⼀页 F:forwardCtrl+B:向后翻⼀页 B:backward对⽂本的操作命令(命令模式下):⼀般来说对⽂本⽆⾮有增删改查复制粘贴以及对操作的是否取消4/需要查找的字符名称:查找字符/:查找上⼀次查找的内容,:查找上⼀次查找的内容,并且是向⾏⾸查找:n:最后⾏模式,n代表⾏号,表⽰切换到第n⾏,如果n为0表⽰是⾸⾏,如果是美元符号$表⽰的是⽂件的最后⼀⾏5i:插⼊光标前(insert)I(⼤写i):插⼊本⾏⾏⾸a:插⼊光标后(add)A:插⼊本⾏⾏尾6yy:拷贝当前光标所在⾏到缓冲区p:paste即粘贴,将缓冲区内容粘贴⾄当前光标后,注意粘贴时候:缓冲区只保留最后⼀次yy内容所以粘贴时候也是最后⼀次yy的内容。7dd:删除光标所在⾏5dd:删除包含当前⾏开始的向后5⾏内容(注意:当前⾏也算作被删除的⼀⾏)x:删除光标所在处的字符X:删除光标左边的字符8u:取消最后⼀次修改U:取消当前⾏的所做的所有修改是否保存⽂件及退出vi编辑器(注意字母前⾯的冒号:)ZZ:退出vi并保存所有修改:wq!(包含wq前⾯的冒号:):强制退出,并保存所有修改:w:保存所做修改,不退出vi:q:退出vi:q!:退出vi,不保存修改编写⼀个菜单显⽰程序主要使⽤echoecho 后⾯带的字符串,通java⼀样,也是需要⽤双引号括起3.
1.
$ echo $HOME /home/redbooks 2.
$ export HELLO="Hello!" $ echo $HELLO Hello! 3.
$ env HOSTNAME= PVM_RSH=/usr/bin/rsh Shell=/bin/bash TERM=xterm HISTSIZE=1000 ... 4.
$ set BASH=/bin/bash BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu") BASH_VERSION='2.05b.0(1)-release' COLORS=/etc/DIR_ COLUMNS=80 DIRSTACK=() DISPLAY=:0.0 ... 5.
set可以设置某个环境变量的值。清除环境变量的值⽤unset命令。如果未指定值,则该变量值将被设为NULL。⽰例如下: $ export TEST="" #增加⼀个环境变量TEST $ env|grep TEST #此命令有输⼊,证明环境变量TEST已经存在了 $ unset $TEST #删除环境变量TEST $ env|grep TEST #此命令没有输出,证明环境变量TEST已经存在了 6. 使⽤readonly命令设置只读变量 如果使⽤了readonly命令的话,变量就不可以被修改或清除了。⽰例如下: $ export TEST="" #增加⼀个环境变量TEST $ readonly TEST #将环境变量TEST设为只读 $ unset TEST #会发现此变量不能被删除 -bash: unset: TEST: cannot unset: readonly variable $ TEST="New" #会发现此也变量不能被修改 -bash: TEST: readonly variable 环境变量的设置位于/etc/profile⽂件 如果需要增加新的环境变量可以添加下属⾏ export path=$path:/path1:/path2:/pahtN 按变量的⽣存周期来划分,Linux变量可分为两类: 1.1 永久的:需要修改配置⽂件,变量永久⽣效。 1.2 临时的:使⽤export命令声明即可,变量在关闭shell时失效。 2. 2.1 在/etc/profile⽂件中添加变量【对所有⽤户⽣效(永久的)】 ⽤VI在⽂件/etc/profile⽂件中增加变量,该变量将会对Linux下所有⽤户有效,并且是“永久的”。 例如:编辑/etc/profile⽂件,添加CLASSPATH变量 # vi /etc/profile export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib 注:修改⽂件后要想马上⽣效还要运⾏# source /etc/profile不然只能在下次重进此⽤户时⽣效。 2.2 在⽤户⽬录下的.bash_profile⽂件中增加变量【对单⼀⽤户⽣效(永久的)】 ⽤VI在⽤户⽬录下的.bash_profile⽂件中增加变量,改变量仅会对当前⽤户有效,并且是“永久的”。 例如:编辑guok⽤户⽬录(/home/guok)下的.bash_profile $ vi /home/guok/.e 添加如下内容: export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib 注:修改⽂件后要想马上⽣效还要运⾏$ source /home/guok/.bash_profile不然只能在下次重进此⽤户时⽣效。 2.3 直接运⾏export命令定义变量【只对当前shell(BASH)有效(临时的)】 在shell的命令⾏下直接使⽤[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其⼦shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使⽤的话还需要重新定义。 3. 3.1 使⽤echo命令查看单个环境变量。例如: echo $PATH 3.2 使⽤env查看所有环境变量。例如: env 3.3 使⽤set查看所有本地定义的环境变量。 unset可以删除指定的环境变量。 4. PATH 决定了shell将到哪些⽬录中寻找命令或程序 HOME 当前⽤户主⽬录 HISTSIZE 历史记录数 LOGNAME 当前⽤户的登录名 HOSTNAME 指主机的名称 SHELL 当前⽤户Shell类型 LANGUGE 语⾔相关的环境变量,多语⾔可以修改此环境变量 MAIL 当前⽤户的邮件存放⽬录 PS1 基本提⽰符,对于root⽤户是#,对于普通⽤户是$3.2
⽤$引⽤变量,引⽤的位置不限,⽐如进⾏⽇志备份的时候可以在⽇志嵌⼊⽇期,这样打⽇志的时候就可以记录⽇期,脚本如下: today=`date +%y%m%d`//注意这⾥引⽤的单引号不是普通的单引号,是美式键盘~同⼀个按键下⾯的符合`,它的作⽤是能将包起的命令输出结果赋值 //给左边的变量,不是双引号下⾯的单引号 ls /usr/bin >log.$today echo "it costs $15" 输出结果是it costs 5,显然这个不是我们想要的。系统把$1当做⼀个变量的饮⽤,⽽不是15美元,要想显⽰,需要⽤转义字符,即$即可。1、 程序从键盘或者⽂件获得数据2、 程序处理数据3、 把数据显⽰在屏幕上或存储在⽂件中局部变量:由程序员建⽴,仅供程序⾃⾝⽤环境变量:由程序员建⽴,供所有⼈使⽤shell中使⽤两种数据类型:数值型和字符串型 字母,数字,下划线组成,并且开头必须是字母,变量中间不能有空格。
使⽤关键字declare或export
在程序任何⼀处声明变量都是可以的,但是并不⿎励这么⼲,因为这样会使程序的可读性变低,不知道从哪⾥冒出⼀个变量。可以把变量集中放置⼀个程序⽂件的开始,这样⽅便看。declare length width 变量之间⽤空格隔开。
使⽤语法let 变量名=变量值使⽤let关键字让的意思 让某个变量值是XXX注意:shell中赋值时候等号=两边的变量名和变量值之间没有空格,这与java是不同的,如果写了空格会报错的字符串变量需要使⽤declare或者export来声明,但是let只能声明数值型变量值可以是字符串,字符串必须像java⼀样带上双引号引⽤变量时候需要带上美元符号$declare name =“hola”declare name2 = “$name”//注意使⽤了双引号,还有美元符号$数值型变量也可以复制let length=10let width=$lengthlet high=”$length-$width”注意双引号要加上。备注:也可以不⽤let关键字声明变量,直接⽤变量=变量值的⽅式定义,这样更加简单,系统会⾃动识别变量的类型进⾏存储。
read作⽤是使计算机等待⽤户将输⼊的内容存储在缓冲区,然后读取这些东西放在声明的变量中,程序运⾏时候,输⼊完数据需要使⽤enter回车键输⼊。如:read response 就是讲⽤户输⼊的内容,放在response中#!/bin/bash表⽰在所有命令执⾏前,启动bash通常情况下数据信息输出时候输出的位置都是在终端上显⽰,但也有很多时候并不需要把信息输出到终端位置,⽽是输出到⽂件中。把数据输出到⽂件的过程称为输出重定向(redirection),也就是改变数据输出流向。重定向使⽤运算符>⼤于符号>⽂件名1、 如果⽂件名对应的⽂件不存在,那么系统将重新创建⼀个新⽂件,并将数据存储在新⽂件中2、 如果⽂件名对应的⽂件已经存在,那么输出的内容将覆盖掉原有的内容。3、 如果使⽤echo “内容”>⽂件名,那么echo后的内容在屏幕上将不再显⽰,⽽只是存储在⽂件名对应的⽂件中4、 如果要向⽂件中添加数据,⽽不是覆盖数据,使⽤关键字>>,这个运算符将数据添加到⽂件末尾,⽽不是覆盖原有的数据⽂件。并且是换到新⼀⾏来添加的。
算术运算符:即加减乘除外加求余运算符%逻辑运算符:或且⾮/或与⾮⽐较运算符:另外介绍运算符的优先级算术运算符:求余运算符就是计算两个数相除后的余数(整除部分另外多出来的部分)注意赋值时候:let high=”$length-$width”注意双引号要加上。注意:shell中赋值时候等号=两边的变量名和变量值之间没有空格,这与java是不同的,如果写了空格会报错的!⾮,进⾏⾮判断,如果a=300是真,则a!=300是假&& 与两个都为真,则为真|| 或:有⼀个真即可能够⽐较两个数值或者字符串-eq equals 等于-ne not equals 不等于-gt greater than ⼤于-ge greater equals ⼤于等于-lt less than ⼩于-le ⼩于等于test $a ⽐较运算符 $b如果⽐较结果是符合逻辑的,那么返回⼀个真值,如果不符合,则返回⼀个假值。注意:实际⽐较值和具体的环境有关,有的符合逻辑返回的是0,不符合的返回是1
2023年8月2日发(作者:)
Linux脚本设计1——vi编辑器使⽤、变量及运算符
对⼤部分语⾔来说,需要作者实现全部功能,linux shell脚本语⾔相当于站在“巨⼈”的肩膀上,有很多实⽤的程序已经在linux系统中实现了,编写linux程序时候只需要调⽤这些程序,当然写程序之前你还是需要规划好你的产品代表的功能。 找到实⽤的程序后,先搞清楚它的功能,再将它加⼊到⾃⼰的程序中。编程者只需要像组装零件⼀样,最终组装成⼀个变形⾦刚~~
对使⽤windows操作系统作为底层平台的程序来说,⼀般会有exe后缀名(有没有其实都⼀样,只是⼀种⽂件的分类标致⽽已)。这个后缀标致代表的意思是:该程序已经转换成了机器码(0 1表⽰),可以⽴即执⾏。 对linux shell程序来说过程是这样的:⾸先程序进⾏编译(将程序翻译成机器码),并且是每次只读⼀⾏,然后翻译成机器码,接着就执⾏⼀⾏,然后再返回程序,重复上述过程,这样会影响程序执⾏效率。 总的来说是:读取⼀⾏,翻译⼀⾏,执⾏⼀⾏ ⼀般来说,单任务处理系统,⼀个程序只要⼀运⾏就会接管对计算机的控制,决定屏幕输出什么内容以及什么。linux是多任务处理,多个任务可以通过分时机制实现多任务运⾏。 要完成⼀个⼤的主题(功能),它⾥⾯会有很多⼩的功能。就是说对于⼀个很⼤的框架来说,我们可以设计、规划成⽐较⼩的框架,⼀个个实现,⽤户界⾯与它后台实际运⾏的⼦程序是相对应的。规划好整体架构和⽤户界⾯后,⼀步步实现⼩的功能,然后搭建出整体。2.
2.1
命令、指令:同⼀个意思,⼀般来说,这些指令、命令都是⼀些实⽤的程序,在系统的环境变量中可以找到这些指令的位置,执⾏这些命令、指令可以得到相应的结果,这些都是计算机的⼀部分。 代码:多个命令指令及编写语句的集合。 程序:为完成⼀项任务的代码。——这个定义太笼统了,等于没有定义。 Shell也和C、java⼀样是⼀种编程语⾔。有⾃⼰的关键字、语法,通过关键字的组合编写出实⽤的语句,就像我们使⽤⾃⼰的母语⼀样,以正确的⽅式发送给计算机,计算机就能懂。每⼀种语⾔都有⾃⼰的关键字,英语、中⽂都⼀样,计算机也有,关键字也称为保留字,在编写程序时,对于⽤户⾃定义的部分如变量、函数名等等都不允许使⽤。
同其他编程语⾔⼀样Shell也有⾃⼰的流程控制语句 :if,else,elif,then :while,for in,continue :case 其他:let,read,echo,clear2.3
shell是⼀类shell的统称,包括很多种,如C shell,bash,Korn shell等,不同shell代表不同的编程环境。通常shell程序是在/bin⽬录下。启动这三种shell分别命令是 C shell:csh bash:bash Korn shell:ksh 在/bin⽬录下可以看到常⽤的命令 这⾥选⽤bash 即Borne Again shell
2.4
这种是不将脚本放在⽂件中,直接命令提⽰符后⾯写命令,命令之间⽤分号;隔开,每⼀⾏最多允许255个字符 这种是将命令放在⽂件中,命令放在⽂件中,命令可以单独放⼀⾏,⾏尾没有分号 通常简单的查看信息可以⽤第⼀种,⽽复杂的任务使⽤第⼆种,⽐如为了查看⽇期,没有必要建⼀个⽂件,写个命令,然后修改执⾏权限,再执⾏,这样做等于把简单的事情复杂化。复杂的任务通常需要第⼆种,对于⼀个⼤的任务来说,需要分成⼩的任务,然后分别解决⼩的问题,再组装设计成⼀个整体。 注意:对于第⼆种来说,也可以把命令放在⼀⾏,命令间⽤分号隔开。执⾏时候有两种办法 脚本绝对路径,执⾏即可如/home/hadoop/Demo/ 如果当前⽤户处在Demo⽬录,则可以⽤./,./表⽰当前⽬录的意思 另⼀种办法是直接执⾏脚本,在任何⼀个⽬录在拥有权限的情况下,执⾏,这种执⾏需要将程序所在的⽬录放在系统的命令路径变量PATH⾥⾯,将路径放在PATH⾥⾯后,系统根据路径,找到执⾏⽬录,就可以执⾏了。PATH变量是放在/etc/profile⾥⾯的,可以在这个⽂件⾥⾯添加,也可以⽤export Demo=/home/hadoop/Demo⽅式添加,然后使⽤source /etc/profile⽅式刷新⽂件,再执⾏就可以了 对于linux有些使⽤字符串的命令来说,需要带双引号,不带也⾏,建议带上,这样显得字符串是⼀个整体,结构性更强。 例如echo Hello World 与echo "Hello World"执⾏结果是⼀样的,建议⽤上双引号,当语句复杂时候,带上双引号会使语句结构清晰。另外如果不带上双引号的话,那么有些单词缩写this‘s是不显⽰单引号的’的,所以带上是万能的,不带是有风险的。2.5
可以⽤户可以查看⽂本(程序),⽆法向其中输⼊内容,输⼊vi命令后回车就进⼊命令模式,在其他模式下按ESC键也可以返回命令模式。ESC即escape (character):逃跑标识,即退出 可以向⽂本中输⼊新的内容,按许多字母键都可以进⼊此模式,如a,i(⼤部分shell都⽀持的),SUSE操作系统按s,q也可以进⼊此状态按冒号:键可以进⼊最后⾏模式,⽤户可以搜索内容、保存⽂件、退出vi等。
1i(⼩写):从命令模式切换到插⼊模式,插⼊的东西在当前光标之前a(⼩写):从命令模式切换到插⼊模式,插⼊的东西在当前光标之后:(冒号):从命令模式切换到最后⾏模式Esc:从插⼊模式切换到命令模式依靠上述⼏种命令,可以实现⼏种模式的相互切换2下⾯命令针对的对象都是光标并且是在命令模式下实现的光标移动是⽂本编辑必不可少的部分,在使⽤如下命令之前可以试试⽅向键,因为不少⼯具是⽀持⽅向键光标的移动的,还有Page Up和Page Down键⽀持翻页,这四种如果⽀持,那⾜以实现光标移动,⽆须在看下⾯的命令。h,j,k,l四个键是对应⽅向键的,可以实现上下移动。不⽤死记四个键代表往哪个⽅向移动,尝试⼀下就可以知道了。h:光标左移⼀个字符j:光标下移⼀⾏k:光标上移⼀⾏l:光标右移⼀个字符+:光标移动⾄下⼀⾏⾏⾸-:光标移动⾄上⼀⾏⾏⾸0:光标移动到本⾏⾏⾸$:光标移动到本⾏⾏尾3Ctrl +F:向前翻⼀页 F:forwardCtrl+B:向后翻⼀页 B:backward对⽂本的操作命令(命令模式下):⼀般来说对⽂本⽆⾮有增删改查复制粘贴以及对操作的是否取消4/需要查找的字符名称:查找字符/:查找上⼀次查找的内容,:查找上⼀次查找的内容,并且是向⾏⾸查找:n:最后⾏模式,n代表⾏号,表⽰切换到第n⾏,如果n为0表⽰是⾸⾏,如果是美元符号$表⽰的是⽂件的最后⼀⾏5i:插⼊光标前(insert)I(⼤写i):插⼊本⾏⾏⾸a:插⼊光标后(add)A:插⼊本⾏⾏尾6yy:拷贝当前光标所在⾏到缓冲区p:paste即粘贴,将缓冲区内容粘贴⾄当前光标后,注意粘贴时候:缓冲区只保留最后⼀次yy内容所以粘贴时候也是最后⼀次yy的内容。7dd:删除光标所在⾏5dd:删除包含当前⾏开始的向后5⾏内容(注意:当前⾏也算作被删除的⼀⾏)x:删除光标所在处的字符X:删除光标左边的字符8u:取消最后⼀次修改U:取消当前⾏的所做的所有修改是否保存⽂件及退出vi编辑器(注意字母前⾯的冒号:)ZZ:退出vi并保存所有修改:wq!(包含wq前⾯的冒号:):强制退出,并保存所有修改:w:保存所做修改,不退出vi:q:退出vi:q!:退出vi,不保存修改编写⼀个菜单显⽰程序主要使⽤echoecho 后⾯带的字符串,通java⼀样,也是需要⽤双引号括起3.
1.
$ echo $HOME /home/redbooks 2.
$ export HELLO="Hello!" $ echo $HELLO Hello! 3.
$ env HOSTNAME= PVM_RSH=/usr/bin/rsh Shell=/bin/bash TERM=xterm HISTSIZE=1000 ... 4.
$ set BASH=/bin/bash BASH_VERSINFO=([0]="2"[1]="05b"[2]="0"[3]="1"[4]="release"[5]="i386-redhat-linux-gnu") BASH_VERSION='2.05b.0(1)-release' COLORS=/etc/DIR_ COLUMNS=80 DIRSTACK=() DISPLAY=:0.0 ... 5.
set可以设置某个环境变量的值。清除环境变量的值⽤unset命令。如果未指定值,则该变量值将被设为NULL。⽰例如下: $ export TEST="" #增加⼀个环境变量TEST $ env|grep TEST #此命令有输⼊,证明环境变量TEST已经存在了 $ unset $TEST #删除环境变量TEST $ env|grep TEST #此命令没有输出,证明环境变量TEST已经存在了 6. 使⽤readonly命令设置只读变量 如果使⽤了readonly命令的话,变量就不可以被修改或清除了。⽰例如下: $ export TEST="" #增加⼀个环境变量TEST $ readonly TEST #将环境变量TEST设为只读 $ unset TEST #会发现此变量不能被删除 -bash: unset: TEST: cannot unset: readonly variable $ TEST="New" #会发现此也变量不能被修改 -bash: TEST: readonly variable 环境变量的设置位于/etc/profile⽂件 如果需要增加新的环境变量可以添加下属⾏ export path=$path:/path1:/path2:/pahtN 按变量的⽣存周期来划分,Linux变量可分为两类: 1.1 永久的:需要修改配置⽂件,变量永久⽣效。 1.2 临时的:使⽤export命令声明即可,变量在关闭shell时失效。 2. 2.1 在/etc/profile⽂件中添加变量【对所有⽤户⽣效(永久的)】 ⽤VI在⽂件/etc/profile⽂件中增加变量,该变量将会对Linux下所有⽤户有效,并且是“永久的”。 例如:编辑/etc/profile⽂件,添加CLASSPATH变量 # vi /etc/profile export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib 注:修改⽂件后要想马上⽣效还要运⾏# source /etc/profile不然只能在下次重进此⽤户时⽣效。 2.2 在⽤户⽬录下的.bash_profile⽂件中增加变量【对单⼀⽤户⽣效(永久的)】 ⽤VI在⽤户⽬录下的.bash_profile⽂件中增加变量,改变量仅会对当前⽤户有效,并且是“永久的”。 例如:编辑guok⽤户⽬录(/home/guok)下的.bash_profile $ vi /home/guok/.e 添加如下内容: export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib 注:修改⽂件后要想马上⽣效还要运⾏$ source /home/guok/.bash_profile不然只能在下次重进此⽤户时⽣效。 2.3 直接运⾏export命令定义变量【只对当前shell(BASH)有效(临时的)】 在shell的命令⾏下直接使⽤[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其⼦shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使⽤的话还需要重新定义。 3. 3.1 使⽤echo命令查看单个环境变量。例如: echo $PATH 3.2 使⽤env查看所有环境变量。例如: env 3.3 使⽤set查看所有本地定义的环境变量。 unset可以删除指定的环境变量。 4. PATH 决定了shell将到哪些⽬录中寻找命令或程序 HOME 当前⽤户主⽬录 HISTSIZE 历史记录数 LOGNAME 当前⽤户的登录名 HOSTNAME 指主机的名称 SHELL 当前⽤户Shell类型 LANGUGE 语⾔相关的环境变量,多语⾔可以修改此环境变量 MAIL 当前⽤户的邮件存放⽬录 PS1 基本提⽰符,对于root⽤户是#,对于普通⽤户是$3.2
⽤$引⽤变量,引⽤的位置不限,⽐如进⾏⽇志备份的时候可以在⽇志嵌⼊⽇期,这样打⽇志的时候就可以记录⽇期,脚本如下: today=`date +%y%m%d`//注意这⾥引⽤的单引号不是普通的单引号,是美式键盘~同⼀个按键下⾯的符合`,它的作⽤是能将包起的命令输出结果赋值 //给左边的变量,不是双引号下⾯的单引号 ls /usr/bin >log.$today echo "it costs $15" 输出结果是it costs 5,显然这个不是我们想要的。系统把$1当做⼀个变量的饮⽤,⽽不是15美元,要想显⽰,需要⽤转义字符,即$即可。1、 程序从键盘或者⽂件获得数据2、 程序处理数据3、 把数据显⽰在屏幕上或存储在⽂件中局部变量:由程序员建⽴,仅供程序⾃⾝⽤环境变量:由程序员建⽴,供所有⼈使⽤shell中使⽤两种数据类型:数值型和字符串型 字母,数字,下划线组成,并且开头必须是字母,变量中间不能有空格。
使⽤关键字declare或export
在程序任何⼀处声明变量都是可以的,但是并不⿎励这么⼲,因为这样会使程序的可读性变低,不知道从哪⾥冒出⼀个变量。可以把变量集中放置⼀个程序⽂件的开始,这样⽅便看。declare length width 变量之间⽤空格隔开。
使⽤语法let 变量名=变量值使⽤let关键字让的意思 让某个变量值是XXX注意:shell中赋值时候等号=两边的变量名和变量值之间没有空格,这与java是不同的,如果写了空格会报错的字符串变量需要使⽤declare或者export来声明,但是let只能声明数值型变量值可以是字符串,字符串必须像java⼀样带上双引号引⽤变量时候需要带上美元符号$declare name =“hola”declare name2 = “$name”//注意使⽤了双引号,还有美元符号$数值型变量也可以复制let length=10let width=$lengthlet high=”$length-$width”注意双引号要加上。备注:也可以不⽤let关键字声明变量,直接⽤变量=变量值的⽅式定义,这样更加简单,系统会⾃动识别变量的类型进⾏存储。
read作⽤是使计算机等待⽤户将输⼊的内容存储在缓冲区,然后读取这些东西放在声明的变量中,程序运⾏时候,输⼊完数据需要使⽤enter回车键输⼊。如:read response 就是讲⽤户输⼊的内容,放在response中#!/bin/bash表⽰在所有命令执⾏前,启动bash通常情况下数据信息输出时候输出的位置都是在终端上显⽰,但也有很多时候并不需要把信息输出到终端位置,⽽是输出到⽂件中。把数据输出到⽂件的过程称为输出重定向(redirection),也就是改变数据输出流向。重定向使⽤运算符>⼤于符号>⽂件名1、 如果⽂件名对应的⽂件不存在,那么系统将重新创建⼀个新⽂件,并将数据存储在新⽂件中2、 如果⽂件名对应的⽂件已经存在,那么输出的内容将覆盖掉原有的内容。3、 如果使⽤echo “内容”>⽂件名,那么echo后的内容在屏幕上将不再显⽰,⽽只是存储在⽂件名对应的⽂件中4、 如果要向⽂件中添加数据,⽽不是覆盖数据,使⽤关键字>>,这个运算符将数据添加到⽂件末尾,⽽不是覆盖原有的数据⽂件。并且是换到新⼀⾏来添加的。
算术运算符:即加减乘除外加求余运算符%逻辑运算符:或且⾮/或与⾮⽐较运算符:另外介绍运算符的优先级算术运算符:求余运算符就是计算两个数相除后的余数(整除部分另外多出来的部分)注意赋值时候:let high=”$length-$width”注意双引号要加上。注意:shell中赋值时候等号=两边的变量名和变量值之间没有空格,这与java是不同的,如果写了空格会报错的!⾮,进⾏⾮判断,如果a=300是真,则a!=300是假&& 与两个都为真,则为真|| 或:有⼀个真即可能够⽐较两个数值或者字符串-eq equals 等于-ne not equals 不等于-gt greater than ⼤于-ge greater equals ⼤于等于-lt less than ⼩于-le ⼩于等于test $a ⽐较运算符 $b如果⽐较结果是符合逻辑的,那么返回⼀个真值,如果不符合,则返回⼀个假值。注意:实际⽐较值和具体的环境有关,有的符合逻辑返回的是0,不符合的返回是1
发布评论