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