脚本第一行总是以#!/bin/sh开始,第二行注释写脚本名
 脚本中注释以#开始
 增加脚本执行权限:chmod u+x filename
 运行脚本:        ./filename
 脚本后缀为.shecho通常在脚本语言或批处理文件中在标准输出或文件中显示一行文本或字符串
 echo [选项][字符串]
 1.    使用echo添加内容到文件中
      echo ‘test’ > a.txt //替换a.txt文件中的内容为test
 echo ‘append’ >> a.txt //在a.txt中追加内容append
 2.    输入一行文本并显示在标准输出上
      echo “Tecmintis a community of linuxnerds”
      显示:Tecmintis a community of linuxnerds
 3.    输出一个声明的变量的值
       $ x=10
       $ echo The value of variable X= $x    
 显示:  The value of variable x=10 
 4.    -e后带上’/b’会删除字符间的所有空格
         Linux中’-e’扮演了转义字符反斜线的翻译器
 5.    ’-e’后面带上’/n’会在遇到的地方作为新的一行
 +echo $? 查看命令退出状态是否成功执行
脚本控制流结构
 1.    退出状态
 任何命令进行时都将返回一个退出状态
 echo $?
 退出状态0,退出成功,无错误
 退出状态1,退出失败,某处有错误退出当前进程,shell提供命令exit,一般格式为: exit n
if语句必须以单词fi结束。
 简单的if语句:
      If条件
      then 命令
      fi
 脚本创建步骤:
 1.    用touch命令创建一个文件
 2.    用vi编辑器打开文件
 3.    用vi编辑器编辑文件
 4.    修改文件的执行权限
 5.    执行脚本文件
 脚本的执行:sh xx.sh 等价于 chmod u+x xx.sh    ./xx.shShell变量:
 定义变量:变量命前不加美元符号$
           命名只能使用英文字母,数字和下划线,首字符不能是数字;
           变量名和等号之间不能有空格
           不能有标点符号;
           不能使用bash中的关键字
 使用变量:需要在变量名前加美元符号$
           变量名可用花括号,如echo ${your_name}
 只读变量:使用readonly命令将变量定义为只读
           myUr1=http://www.w3cschool.cc
           readonly myUr1
 删除变量:unset命令删除变量
           unset variable_name
 变量类型:
      运行shell时,会同时存在三种变量:
 1.    局部变量:局部变量在脚本或命令中定义,仅在当前shell中有效;
 2.    环境变量:所有程序,都能访问环境变量
 3.    Shell变量:shell变量是由shell程序设置的特殊变量,shell变量中有一部分是局部变量,一部分是环境变量
     
 Shell字符串:
       字符串是shell编程中最常用最有用的数据类型,字符串可以用单引号,也可以用双引号,也可以不加引号。
 单引号:str=’this is a string’
 1.    单引号屏蔽了所有的特殊符号,单引号里任何字符都会原样输出,单引号字符串中的变量是无效的
 2.    单引号字符串中不能出现单引号
 双引号:your_name=’qinjx’
         Str=”hello,I know you are \”$your_name\”! \n”
 1.    双引号屏蔽了大部分的特殊字符,但$、转移字符\、反引号字符三个除外,双引号里可以有变量
 2.    双引号里可以有转义字符
 *单引号、双引号在shell中主要用于把带有空格的字符串赋给变量。
 反引号:作用是命令替换,将其中的字符串当成shell命令执行,返回命令的执行结果。// 一般用于网络协议中,如HTTP://;
 \\ 一般用于局域网中计算机之间的互访,即在\\后面加一个IP或机器名,就可以互访另一台机器。Shell中的变量通常为控制null,不含任何字符
 Shell变量名称及其所赋值的字符长度没有限制
 Shell变量赋值:直接写变量名,=,所赋值,中间没有空格
 取出shell变量时,需在变量名称前加上$,当赋值中含有空格时,需加双引号First=Isaac middle=bashevis last=singer  //单行可以进行多个变量的赋值,用空格隔开
 Fullname=”Isaac bashevis singer”     //赋值中含有空格时需用双引号
 Oldname=$fullname               //取出变量的值,需在变量名称前加$
 Fullname=”$first $middle $last”      //变量作为第二个变量的新值时,加不加双引号都行,但是多个变量时需加双引号
 echo 表示输出
 echo [string]     //产生脚本输出,echo会解释字符串中的转义序列
 < 改变标准输入
 >改变标准输出,若>后没有目标文件,会新建一个文件
 /bin 存储可执行程序创建新文件 cat > filename,然后直接编辑
 执行跟踪命令 会在每个被跟踪的命令前有个‘+’
 在文件内 set – 开始执行跟踪
                       Set + 结束执行跟踪grep 查找文本/匹配文本
tar压缩或解压缩命令
 -c创建新的包
 -x解压缩文件
 -f使用压缩文件或设备,该选项通常是必选
 -z用gzip压缩或解压缩文件
 -t列出包内容
 -u更新包中的文件
 -v详细报告tar处理文件的信息
 两个linux通用解压命令:1.tar –xvf 压缩包名称        //解压非gzip格式的压缩包
                          2.tar –zxvf 压缩包名称       //解压gzip格式的压缩包
 压缩命令:gzip可将tar –cf创建的包压缩Shell三种变量:本地变量、环境变量、位置变量
 本地变量:仅可以在用户当前shell生命期的脚本中使用的变量
 环境变量:适用于所有登录进程所产生的子进程
 位置变量:用于向shell脚本传递参数,是只读的
 $是变量的替换符号,$variable就表示变量的值unset命令清除变量的值
        unset 变量名
 变量赋值模式
 Variable=value   正常赋值
 Variable+value   对已赋值的变量重新赋值
 Variable:=value   对未赋值变量赋值
 Variable:-value   对未赋值变量赋值,但不存储到变量的对应地址
 Variable:?value   检测变量是否赋值,若未赋值给出错误信息设置变量为只读
          variable=value
          readonly variableshell变量是无类型的,只支持整型和字符型,默认情况下,shell脚本变量是字符型
 若shell变量只包含数值,则为数值型,否则为字符型let命令用于变量执行数值运算
 空字符串变量的数值为0定义环境变量基本格式
    ENVIRON-VARIABLE=value    //环境变量赋值
    export ENVIRON-VARIABLE    //声明环境变量
 给环境变量赋值后,一般用export声明,表明为环境变量,环境变量名称一般由大写字组成
 env命令列出系统中的所有环境变量
 清除环境变量和清除普通变量一样,unset命令bin/sbin是linux中存放可执行文件的文件夹
 shell为每个输入命令搜索PATH中的目录列表
 退出root权限命令 exit或ctrl+djzg@jzg-virtual-machine:~$ 分别为当前用户名,主机名,当前目录名
 环境变量配置文件:.bash_profile、.bashrc、.bash_logout,都位于用户根目录,即home目
 录下,.bash_profile是最重要的配置文件,linux用户登录时,shell会自动执行.bash_profile引用就是将字符串用引用符号引起来,屏蔽特殊字符的特殊含义
 引用符号、意义
 “ ”  双引号   引用除$、反引号、反斜线之外的所有字符
 ‘ ‘   单引号   引用所有字符
 ` `   反引号   shell将反引号的的内容解释为系统命令
 \    反斜线   转义符,屏蔽下一个字符特殊含义双引号 可以保留原格式 空格、换行符等
退出状态:
 最后一次执行命令的退出状态值被保存在 $? 中,所以通过 echo $? 显示退出时执行状态测试结构    test expression
           或  [ expression ]
 整数比较运算格式   test “num1” operator “num2”
                或  [ “num1” operator “num2” ]
 整数比较运算符
 num1 –eq num2    num1 等于num2
 num1 –ge num2    num1 大于等于num2
 num1 –gt num2     num1大于num2
 num1 –le num2     num1小于等于num2
 num1 –lt num2      num1小于num2
 num1 –ne num2     num1不等于num2 字符串运算符
 string             测试string是否不为空
 -n string           测试string是否不为空
 -z string           测试string是否为空
 string1 = string2     测试string1是否等于string2
 string1 != string2    测试string1是否不等于string2文件操作符格式
             test operator file
         或   [ operator file ]
 -d file    测试file是否为目录
 -e file    测试file是否存在
 -f file    测试file是否为普通文件
 -r file    测试file是否为可读
 -w file   测试file是否为可写
 -x file    测试file是否为可执行
 -s file    测试file是否长度不为0
 -L file    测试file是否符号化链接简单的if结构
 if expression
 then
    command
    command
    …
 fi
 if expression; then
 command
 command
 …
 fi162page
linux目录栈用于存放工作目录,程序员手动控制目录的切换,pushd和popd维护目录栈
 pushd 目录名
 popd计算字符串长度的两种方法:
 1.    echo ${#string}
 2.    expr length $string 变量默认情况下为字符型,若要进行算数运算,需用let命令或declare –I声明为整型
 let命令自动将变量变为整型,进行整型运算
 (( ))圆括号也可以实现类似c语言风格的整型运算
 自加、自减运算符是shell中未曾定义过,使用时需要c语言风格的双圆括号(())变量的两种间接引用:1. eval tempvar=\$$variable1
                     2. ${!variable1}         //不需要使用临时变量tempvar,更方便expr操作符中有元字符时,需用转移符屏蔽元字符的特殊含义,只使用其普通含义
 expr两端必须有空格,否则不执行数学运算shell编程主要利用管道进行linux命令之间的通信
 cat和more都是查看文件的意思,more是分页显示更方便
 使用管道时,awk命令格式: | awk [-F” “] ‘awk程序段’df –k 命令列出系统空间信息
 I/O重定向
 文件标志符:是数字0-9,指明了与进程相关的特定数据流的源
 标准输入、标准输出、标准错误输出的文件标志符分别为数字0、1、2
 当linux系统启动一个进程时,将自动为该进程打开三个文件:标准输入、标准输出、标准错误输出,该进程若要打开其他输入输出文件,从整数3开始标志 wc命令:统计指定文件(标准输入)中的字节数、行数、字符数、字数,并将统计结果显示输出
 -c  统计字节数
 -l  统计行数
 -m  统计字符数
 -w  统计字数
 wc –l newfile    //newfile为标准输入文件,因此输出行数、文件名
 wc –l <filename   //shell将<filename吞掉,filename输出到标准输入,所以直接从标准输入读取,只显示行数
 linux中只有一个函数fork函数可以创建子进程
 shell命令分为内建命令和外部命令,内建命令
 每个进程具有3种基本状态:就绪态、执行态、阻塞态linux为每个进程分配一个数字以标记该进程,称为进程号
 shell为每个进程创建一个数字以标记该进程,称为作业号
 进程号与作业号区别:linux是多用户系统,可能开启多个shell,作业号是在此shell下标
 记的,不用于其他shell,进程号是在整个系统下标记的。进程是针对整个linux而言
 作业是针对shell而言,作业有两种运行方式:前台运行和后台运行
 fg是将后台运行的作业放到前台,&是将作业在后台运行
 shell中“ ”表示回车   echo “”shell中只要是加减乘除运算都使用let命令
 函数体{  } 内行首要缩进4个字符
 空格和空行不占用内存,shell中可使用空格和空行使编程美观
 赋值符=左右两端不加空格,以避免不必要的错误空格和空行加的情况:
 空格:缩进空4个字符,运算符(除赋值符以外)前后空一个空格
 空行:函数始末、判断或循环的始末、函数调用始末及前后联系不紧密都要加空行判断与循环的6况:
 if/else:
 if [[ expression ]]
 then
 command
 …
 else
 command
 …
 fi###############################################
 if [[ expression ]]
 then
 command
 …
 elif [[ expression ]]
 then
 command
 …
 else
 command
 …
 fi###################################################
 while [[ expression ]]
 do
 command
 …
 done###################################################
 for (( int var ; condition ; change var ))
 do
 command
 …
 done#####################################################
for var in value
 do
 command
 …
 done########################################################
until [[ expression ]]
 do
 command
 …
 done linux中设备有两种类型:字符设备(无缓冲且只能顺序存取)和块设备(有缓冲且能顺序存取)
 每个设备都有主设备号和次设备号,主设备号相同的设备是同类设备,使用同一个驱动程序
 每个设备在/dev目录下都有一个对应的文件(节点),可以通过df命令查看已加载的设备驱动的主设备号shell调试方法:
 trap命令格式:  trap command sig1 sig2 …    //trap捕捉到信号sig后就会执行命令command
 shell伪信号及产生条件
    EXIT    从函数中退出,或整个脚本执行完毕时产生
    ERR     当一条命令返回非零状态码,即命令执行不成功时产生
    DEBUG  脚本中的每一条命令执行之前产生tee命令: command1 | tee .txt | command2 | tee .txt ……
     适用于多管道命令的调试,将每个命令的结果输出到.txt文件中查看调试钩子:if/then  DEBUG结构    定义DEBUG函数,调用其执行输入的参数
 DEBUG()
 {
 if [ “$DEBUG” = “true” ]
 then 
     echo $@             //$@和$*等价,都是指所有参数
 fi
 }