shell笔记

//名词解释  
bash(Bourne-Again Shell)是shell的一种,编写该外壳程序的人名叫Bourne shell,“bourne”与“born”的发音相近,意为shell的重生?bash是一个为GNU计划编写的Unix shell,是许多Linux发行版的默认Shell...

> `#!` 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序,shell扩展名为 sh(sh代表shell),扩展名并不影响脚本执行...

alias把一个常用的并且很长的指令别名一个简洁易记的指令,alias会看到目前系统预设的alias 

    $ alias
	alias ll='ls -l'
	alias ls='ls -F --color=auto --show-control-chars'
	alias node='winpty node.exe'

echo 向窗口输出文本  

    $ echo 'leyi'
    leyi


通配符 *匹配零个或多个字符,?匹配一个字符
输入输出从定向,用于将命令的结果输入到文件中而不是屏幕上


> 输出重定向 >  
> 追加重定向 >>


定义和使用变量,使用变量时变量名外面的花括号可选   

    $ echo ${leyi}
    qiezijiucai

只读变量 readonly将变量定义为只读变量,不可更改  
删除变量 unset可以删除变量,不能删除只读变量

    Administrator@SZ-20170103URLF MINGW64 ~
    $ leyi="zzn"
    
    Administrator@SZ-20170103URLF MINGW64 ~
    $ readonly leyi
    
    Administrator@SZ-20170103URLF MINGW64 ~
    $ leyi="qiezijiucai"
    bash: leyi: readonly variable

    $ unset leyi
    bash: unset: leyi: cannot unset: readonly variable

变量类型
> 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量   

> 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

> shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

字符串的单双引号 

> 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的  
> 单引号字串中不能出现单引号  
> 双引号里可以有变量  
> 双引号里可以出现转义字符  

    Administrator@SZ-20170103URLF MINGW64 ~
    $ echo o this is "$leyi"
    o this is zzn
    
    Administrator@SZ-20170103URLF MINGW64 ~
    $ echo o this is '$leyi'
    o this is $leyi


获取字符串长度 

    $ echo ${#str}
    7

提取子字符串 从字符串第0个字符开始截取2个字符  
${str:开始索引:长度}
    
    $ echo ${str:0:2}
    ab

expr index求索引 (expr 是一款表达式计算工具)   
>这里的索引不是从0开始,而是从1开始算起,返回0,表示查找失败 
>查找的是第一个符合条件的字符所在的位置

    $ echo `expr index "${str}" b`
    2

数组操作

> 用括号来表示数组,数组元素用"空格"符号分割开  (1 2 3 4 5)

    $ arr=(1 2 3 4 5 )  //定义数组
    
    Administrator@SZ-20170103URLF MINGW64 ~
    $ arr[5]=6   //定义数组方式2
    
    Administrator@SZ-20170103URLF MINGW64 ~
    $ echo ${arr[5]} //获取数组指定索引的值
    6
    
    Administrator@SZ-20170103URLF MINGW64 ~
    $ echo ${arr[@]} //读取数组
    1 2 3 4 5 6
    
    Administrator@SZ-20170103URLF MINGW64 ~
    $ echo ${#arr[@]} //获取数组长度
    6
    
    Administrator@SZ-20170103URLF MINGW64 ~
    $ echo ${#arr[*]} //获取数组长度方式2
    6
    
    Administrator@SZ-20170103URLF MINGW64 ~
    $ echo ${#arr[1]} //获取数组指定索引值的长度
    1

shell 注释 # 只有单行注释

字符串的截取 (注*的位置) 
>\# 号截取,删除左边字符,保留右边字符,从左边开始

    Administrator@SZ-20170103URLF MINGW64 ~
    $ url="http://www.cnblogs.com/leyi/"

    $ echo ${url#h}
    ttp://www.cnblogs.com/leyi/

    $ echo ${url#*www} //删除左边字符0到多个直到www(第一个www) 
    .cnblogs.com/leyi/ 

    $ echo ${url##*l} //删除左边字符0到多个直到l(最后一个l)
    eyi/
    
>%号截取,删除右边字符,保留左边字符,从右边开始 

    $ echo ${url%/*}  //删除一个/和右边的字符
    http://www.cnblogs.com/leyi

    $ echo ${url%%/*} //删除最后一个/和右边的字符
    http:

传递参数
  
    echo '1212'
    echo $0 //$0 为执行的文件名
    echo $1 //$1 为执行脚本的第一个参数
    echo $? //命令的退出状态。0表示没有错误

算数运算符  + - * / % = == != 

> 表达式和运算符之间要有空格 1 + 1而不是1+1  
> 完整的表达式要被 ` ` 包含  
> 乘号前边要加反斜杠 \  
> 条件表达式要放在方括号中  [ 1 -eq 1 ]
> if...then...fi 是条件语句  

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/新建文件夹
    $ value`expr 10 + 10`
    
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/新建文件夹
    $ echo $value
    20

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/新建文件夹
    $ echo `expr 10 \* 20`
    200


关系运算符 -eq -gt -lt -le -ge  

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/新建文件夹
    $ if [ 10 -lt 20 ]; then  echo 1; else  echo 2; fi
    1

布尔运算符  ! 非 -o 或 -a 并

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/新建文件夹
    $ if [ 1 -gt 2 -o 1 -eq 1 ]; then echo '1'; else echo '2'; fi
    1
    
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/新建文件夹
    $ if [ 1 -gt 2 -a 1 -eq 1 ]; then echo '1'; else echo '2'; fi
    2

逻辑运算符  || &&  两个方括号

    Administrator@SZ-20170103URLF MINGW64 ~
    $ if [[ $a -eq $b && $a -lt $b ]]; then echo '1'; else echo '2'; fi
    2

字符串运算符  = != -z -n string本身  
 
    $ a="hello"; b="halo"; if [ $a = $b ]; then echo 'true';else echo 'false'; fi
    false

    $ a="hello"; b="halo"; if [ $a != $b ]; then echo 'true';else echo 'false'; fi
    true

    //-z 字符串长度为0返回true
    $ if [ -z 'a' ]; then echo '字符串长度为0'; else echo '字符串长度不为0'; fi;
    字符串长度不为0

    /字符串长度不为0返回true
    $ if [ -n 'a' ]; then echo '字符串长度不为0'; else echo '字符串长度为0'; fi;
    字符串长度不为0
     
    //字符串长度不为空返回true
    $ if [ 'a' ]; then echo '字符串长度不为空'; else echo '字符串长度不为空'; fi;
    字符串长度不为空

文件测试运算符  

> -d 是否是目录   
> -f 是否是普通文件,非目录和设备文件,设备文件(鼠标,麦克风,显示器)  
> -r 是否可读  
> -w 是否可写  
> -x 是否可执行 
> -s 文件是否为空 
> -e 文件是否存在 

    $ if [ -d wc ]; then echo '1';else echo "2"; fi;
    1

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ if test -e haha.txt; then echo 1;else echo 2;fi;
    1


echo命令  跟php一样   

> 反斜杠是转义符  

    $ echo \"qwqw\"
    "qwqw"
    
printf 命令    %s %c %d %f 

    // %s 宽度为10个字符 %-10s 宽10个字符 -左对齐,没有-右对齐
    $ printf "%-10s %-10s %-10s" 第一列 第二列 第三列
    第一列  第二列  第三列

    // %.3f 保留三位小数  
    $ printf "%-10s %-10s %-10.3s\n" hello world 7.7777
    hello  world  7.7

test 命令  

> 数值测试  -eq -ne -gt -ge -lt -le 

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ a=1
    
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ b=2
    
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ if test $a -eq $b;then echo 1;else echo 2;fi;
    2

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ if test $[a] -eq $[b]; then echo 1; else echo 2;fi;
    2


>  [] 可以执行基本的算数运算
     
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ echo `expr $a + $b` 
    30

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ a=10;b=20;echo $[a+b]
    30

> 字符串测试 = != -z -n 

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ if test 'a' != 'b';then echo 1;else echo 2; fi;
    1

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ if test -z '';then echo 1;else echo 2; fi;
    1
    
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ if test -z 'a';then echo 1;else echo 2; fi;
    2



> 文件测试 -d -r -w -x -s -d -f 

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ if test -e haha.txt;then echo 1; else echo 2;fi;
    1

流程控制语句  

> if then else fi 如果else分支没有语句执行,就不写else 

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ if test -e haha1.txt;then echo 1; else {};fi;
    bash: {}: command not found

> if else elif else fi;


    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ if test 1 -eq 2;then echo 1; elif test 1 -eq 1;then echo 2; else echo 3;fi;
    2

>for 循环  for 变量 in 数组

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ for aa in $arr; do echo $aa;done;
    1
    2
    3
    4
    5

>while 语句  while do done  

    let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来

    //(()) 省去$符号的算术运算

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ while((num<=10)); do echo $num; let "num++"; done;
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

  
>case 语句 case in 匹配值1) xxx;; *) xxx;; esac;

    // 1) 匹配条件 ;; 两个分号结束 *)无一匹配走这里  
    // continue 仅跳出当前循环  break 跳出所有循环 
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ read num
    1111
    
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ echo $num
    1111

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ echo "请输入数字"; read num;
    请输入数字
    1
    $ case $num in 1) echo $num;; *) echo "halo";;
    > esac; # case 的反转 
    1


 函数  

    //定义函数 function fnname(){} 
    //或者 fnname(){}  
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ function fn1(){
    > echo 1111
    > }
    
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ fn1
    1111

    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ fn1(){
    > echo 11111
    > }
    
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ fn1
    11111

    //传递参数  
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ fn2(){
    > echo $# 
    > echo $1
    > echo $@
    > echo $$
    > }
    
    Administrator@SZ-20170103URLF MINGW64 ~/Desktop/sh
    $ fn2 a b c d
    4 //参数的个数
    a //第一个参数 
    a b c d //返回每个参数
    4112 //进程id
   

  

posted @ 2018-03-12 20:51  韭菜茄子  阅读(179)  评论(0编辑  收藏  举报