Linuxshell编程学习笔记第一章:shell基础●umask--查看当前用户创建文件或文件夹时的默认权限eg:[test@szbirdora1]$umask0002[test@szbirdora1]$ls-lh-rw-rw-r--testtestmyfiledrwxrwxr-xtesttest1上面的例子中我们看到由test默认创建的文件myfile和文件夹1的权限分别为664,775.而通过umask查到的默认权限为002.所以可以推断出umask的计算算法为:umaskfiledirectory067156245334423512601700●连接ln硬连接lnsourcefiletargetfile连接后的target文件大小和source文件一样软连接ln-ssourcefiletargetfile类似于windows的快捷方式●shellscript基本结构#!/bin/bash--------bashshell开头必须部分#description--------注释部分(可有可无,为了阅读方便最好加以说明)variablename=value---------变量部分,声明变量,赋值controlsegment---------流程控制结构,如判断、循环、顺序eg.helloworld.sh#!/bin/bash#Thisisahelloworldshellscriptprintchar=helloworldecho$printchar[test@szbirdora1]$shhelloworld.shhelloworld●shell特性①别名aliaseg.aliasll=“ls-l”②管道a|b将a命令的输出作为b命令的输入eg.ls|sort将ls列举的项排序③命令替换a`b`将b命令的输出作为a命令的输入eg.ls`catmyfile`列举出catmyfile的输出项④后台运行nohupcommand&可通过jobs-l查看后台运行的脚本⑤重定向,可以改变程序运行的输出来源和输入来源⑥变量可以用$varname来调用变量⑦特殊字符`用来替换命令\用来使shell无法认出其后的特殊字符,使其失去特殊含义;允许一行放多个命令()创建成组的命令??{}创建命令块??第二章:变量和运算符●本地变量:在用户现在的shell生命期的脚本中使用。设置变量:various_name=value.可用set来查看。用readonly可以使变量只读。●环境变量:用于当前用户下所有用户进程(不限于现在的shell)。设置变量:exportvarious_name=value。用env查看。用readonly可以使变量只读。●变量替换echo${variablename}显示实际值到variablenameecho${variablename:+value}如果设置了variablename,则显示其值,否则为空echo${variablename:?value}如果未设置variablename,则显现用户定义错误信息valueecho${variablename:-value}如果未设置,则显示其值echo${variablename:=value}如果未设置,则设置其值,并显示●清除变量unsetvariablename●位置变量位置变量表示$0,$1,$2...$9$0----脚本名字$1----根据参数位置表示参数1eg.#!/bin/bash#parm.shechoThisisscriptname:$0echoThisisparameter1:$1echoThisisparameter2:$2[test@szbirdora1]$shparm.shabThisisscriptname:parm.shThisisparameter1:aThisisparameter2:b●向系统中传递位置变量#!/bin/bash#parm.shfind/u01/test/1-name$1-print[test@szbirdora1]$shparm.shmyfile/u01/test/1/myfile●标准变量bash默认建立了一些标准环境变量,可在/etc/profile中定义EXINITHOMEIFSLOGNAME--当前登录用户名MAILMAILPATHPATHTERM--终端信息TZ--时区PS1--登录提示,如[test@szbirdora1]$[test@szbirdora1]$echo$PS1[\u@\h\W]\$--\u-user--\h-host--\W-documentPS2--一命令多行,换行提示,如PWD--当前目录MAILCHECK--每隔多少秒检查是否有新邮件[test@szbirdora1]$echo$MAILCHECK60SHELLMANPATH--帮助文档位置TERMINFO--终端信息●特殊变量$#传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个$$脚本运行的当前进程ID号$!后台运行的最后一个进程的进程ID号$@传递到脚本的参数列表,并在引号中返回每个参数$-显示shell使用的当前选项,与set命令功能相同$?显示最后命令的退出状态,0表示没有错误,其他表示有错误eg.#!/bin/bash#parmechothisisshellname:$0echothisisparm1:$1echothisisparm2:$2echoshowparmnumber:$#echoshowparmlist:$*echoshowprocessid:$$echoshowprecommstat:$?[test@szbirdora1]$shparm.shabthisisshellname:parm.shthisisparm1:athisisparm2:bshowparmnumber:2showparmlist:abshowprocessid:24544showprecommstat:0●影响变量的命令declare设置或显示变量-f只显示函数名-r创建只读变量-x创建转出变量-i创建整数变量使用+替代-,可以颠倒选项的含义export-p显示全部全局变量shift[n]移动位置变量,调整位置变量,使$3赋予$2,使$2赋予$1n前移ntypeset和declare同义注意:双引号不能解析$,\,`三个字符,所以在双引号中可以引用变量、转义字符、替换变量单引号可以解析,所以单引号中引用变量等无效[test@szbirdora1]$echo$testtest[test@szbirdora1]$echo'$test'$test●运算符类型⒈按位运算符~取反左移运算符右移运算符&与|或^异或$[]表示形式告诉shell对方括号中表达式求值$[a+b]2.逻辑运算符&&||,,=,!=3.赋值运算符letvariablename1+=variablename1+varablename2第三章shell的输入和输出1.echoecho[option]string-e解析转移字符-n回车不换行,linux系统默认回车换行转移字符\c\t\f\n#!/bin/bash#echoecho-ethisecho's3newlne\n\n\nechoOKechoechothisisecho's3ewline\n\n\nechothislogfilehaveallbeendonemylogfile.txt[test@szbirdora~]$shechod.shthisecho's3newlneOKthisisecho's3ewline\n\n\n上面可以看到有-e则可以解析转移字符,没有不能解析。echo空输出为空2.read可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量readvariable1variable2eg.#!/bin/bash#readnameecho-nfirstname:readfirstnameecho-nlastname:readlastnameechothisnameis$firstname$lastname3.cat显示文件的内容,创建内容,还可以显示控制字符cat[options]filename1filename2-v显示控制字符(Windows文件)cat命令不会分页显示,要分页可以采用more、less4.管道|5.tee把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中,一般与管道合用tee[options]files-a在文件中追加eg.[test@szbirdora1]$echo|teemyfile[test@szbirdora1]$catmyfile将myfile文件置空6.文件重定向commandfilename---覆盖输出commandfilename---追加输出commandfilename&1---把标准输出和标准错误重定向commanddelimiter---输入直到delimiter分解符commandfilename----输入文件内容到命令command----关闭标准输入nullfile.txt---创建字节为0的文件command1filenamecommand3---按从左到右顺序执行eg.说明:myfile为空间[test@szbirdora1]$df-lhmyfile[test@szbirdora1]$catmyfileFilesystemSizeUsedAvailUse%Mountedon/dev/sda120G3.3G16G18%/none2.0G02.0G0%/dev/shm/dev/sda279G17G59G23%/u01/dev/sda428G3.9G22G15%/u02[test@szbirdora1]$df-lhmyfile[test@szbirdora1]$catmyfileFilesystemSizeUsedAvailUse%Mountedon/dev/sda120G3.3G16G18%/none2.0G02.0G0%/dev/shm/dev/sda279G17G59G23%/u01/dev/sda428G3.9G22G15%/u02[test@szbirdora1]$df-lhmyfile[test@szbirdora1]$catmyfileFilesystemSizeUsedAvailUse%Mountedon/dev/sda120G3.3G16G18%/none2.0G02.0G0%/dev/shm/dev/sda279G17G59G23%/u01/dev/sda428G3.9G22G15%/u02FilesystemSizeUsedAvailUse%Mountedon/dev/sda120G3.3G16G18%/none2.0G02.0G0%/dev/shm/dev/sda279G17G59G23%/u01/dev/sda428G3.9G22G15%/u02[test@szbirdora1]$catmyfileexitChinaHubeiSuizhouexit[test@szbirdora1]$catmyfileChinaHubeiSuizhou7.exec可以用来替代当前shell。现有任何环境变量都会清除第四章控制流结构1.if语句if条件1then命令1elif条件2then命令2else命令3fi------------------if条件then命令fieg:#!/bin/bash#iftest#thisisacommentlineif[10-lt12];then#yes10islessthan12echoyes,10islessthan12elseechonofi注意:if语句必须以fi终止10前一个空格,“12”后也有一个空格。这个条件都是通过test命令来指定。条件表达为teste