//名词解释
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
" 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