1 标准输入、输出与标准错误输出
系统为这三个文件分配了文件标识符fd(file descripter),在Linux系统下,一切皆是文件,对文件的操作,一般要用到文件标识符。它们的文件标识符,分别为0,1,2,关系如下表:
| 文件描述符 | 名称 | 通用缩写 | 默认值 | 
| 0 | 标准输入 | stdin | 键盘 | 
| 1 | 标准输出 | stdout | 屏幕 | 
| 2 | 标准错误 | stderr | 屏幕 | 
1.1 输出重定向
| 语法 | 说明 | 
| > | 把标准输出重定向到一个新文件,”>” 会覆盖原有的内容。 | 
| >> | 把标准输出重定向到一个文件中,不覆盖原有的内容(追加)。 | 
| 2 > | 把标准错误重定向到一个文件中 | 
| 2 >> | 把标准错误重定向到一个文件中(追加) | 
| 2 > &1 | 把标准输出和错误重定向到一个文件(追加) | 
1.2 输入重定向
| 语法 | 说明 | 
| < | filename文件作为标准输入 | 
| << delimiter | 从标准输入中读入,知道遇到delimiter分界符 | 
1.3 绑定重定向
| 语法 | 说明 | 
| > &m | 把标准输出重定向到文件描述符m中 | 
| < &- | 关闭标准输入 | 
| > &- | 关闭标准输出 | 
2 变量
2.1 环境变量
通过使用printenv可以显示当前的环境变量
printenv
#显示所有环境变量2.2 本地变量
Shell不需要明确定义类型,事实上Shell变量的值都是字符串,比如我们定义var=45,其实var的值是字符串而非整数,shell变量不需要事先定义就可以使用,如果使用没有定义的变量,这字符串取值为空字符串。
变量名称=”变量Value”,“=”的两边不能有空格,否则shell解释成名称和命令参数。
获取变量使用 $变量名称
str="Hello_World"
echo $str
#输出结果:Hello_World2.2.1 文件名代换
可以使用*、?、[]对文件名代换
| 匹配符 | 说明 | 
| * | 匹配0个多个任意字符 | 
| ? | 匹配一个任意字符 | 
| [] | 匹配方括号中任意一个字符的一次出现 | 
2.2.2 命令代换
将命令替换为命令输出,所有的shell支持使用反引号的方式进行命令替换,命令替换可以嵌套,需要注意的是如果使用反引号的形式,在内部反引用前必须使用反斜杠转移
| 匹配符 | 说明 | 
| `` | 例如 echo ${pwd} | 
| $() | 例如 echo `pwd` | 
2.2.3 算术代换
| 匹配符 | 说明 | 
| $(()) | 例如 echo $((4 + 6)) | 
3 符号
3.1 转义字符
‘\’用作转义字符。
3.2 单引号
单引号内的所有字符都保持它本身字符的意思,而不会被bash进行解释。
3.3 双引号
除了$、``、/外,双引号内所有的字符保持字符本身的含义。
4 逻辑判断
4.1 if
在shell中用if,then,elif,else,fi这几条命令实现分支控制,这种流程控制语句本质上也是由若干个逻辑判断组成,需要注意的是。
- 
if/then结束都离不开fi 
- 
if和[]注意用空格隔开,]后面紧跟; 
- 
[]内的条件与都有一个空格隔开 
例如:
if [ -f $a ];then 
        echo "hello world!" 
fi这里面-f是运算符,相应的运算符还有
# 表达式运算符
!   # 表达式为假
-a  # 逻辑与 表达式1 –a 表达式2 两个表达式都为真则是真
-o  # 逻辑或 表达式1 –o 表达式2 两个表达式有一个为真则是真
# 字符串运算符
-n    # 字符串的长度为非零
-z    # 字符串的长度为零
=     # 字符串相等
!=    # 字符串不等
# 整数比较运算符
-eq   # int1 -eq int2 如果 int1 等于 int2,则为真
-ge   # int1 -ge int2 如果 int1 大于或等于 int2,则为真
-gt   # int1 -gt int2 如果 int1 大于 int2,则为真
-le   # int1 -le int2 如果 int1 小于或等于 int2,则为真
-lt   # int1 -lt int2 如果 int1 小于 int2,则为真
-ne   # int1 -ne int2 如果 int1 不等于 int2,则为真
# 文件运算符
-ef   # File1 –ef File2 两个文件具有同样的设备号和i结点号
-nt   # File1 –nt File2 文件1比文件2新
-ot   # File1 –ot File2 文件1比文件2旧
–b    # 文件存在并且是块设备文件
–c    # 文件存在并且是字符设备文件
–d    # 文件存在并且是目录
–e    # 文件存在
–f    # 文件存在并且是正规文件
–g    # 文件存在并且是设置了组ID
–G    # 文件存在并且属于有效组ID
–h    # 文件存在并且是一个符号链接(同-L)
–k    # 文件存在并且设置了sticky位
–b    # 文件存在并且是块设备文件
–L    # 文件存在并且是一个符号链接(同-h)
–o    # 文件存在并且属于有效用户ID
–p    # 文件存在并且是一个命名管道
–r    # 文件存在并且可读
–s    # 文件存在并且是一个套接字
–t    # FD 文件描述符是在一个终端打开的
–u    # 文件存在并且设置了它的set-user-id位
–w    # 文件存在并且可写
–x    # 文件存在并且可执行4.2 case
case结构用于多种情况的条件判断,类似于其它语言的switch/case,但从语法结构上有很大的不同,常用格式。
case 字符串 in
    模式)
        语句
        ;;
    模式2 | 模式3)
         语句
        ;;
    *)
     默认执行的 语句
         ;;
esac例如:
#!/bin/bash
read -p "请输入要查查询的区号:" num
case $num in
 
   *)echo -n "中国";;&
     03*)echo -n "河南省";;&
        ??71)echo "郑州市";;
        ??72)echo "安阳市";;
        ??73)echo "新乡市";;
        ??73)echo "许昌市";;
     07*)echo -n "江西省";;&
        ??91)echo "南昌市";;
        ??92)echo "九江市";;
        ??97)echo "赣州市";;
esac5. 循环
5.1 for
例如:
打印目录下所有的文件
#!/bin/bash
for i in $( ls ); do
    echo item: $i
done打印序列
#!/bin/bash
for n in $(seq 1 10);
do
   echo $n
done5.2 while
例如:
#!/bin/bash
counter=$1
while [ $counter -lt 10 ];
do
    echo the counter is $counter
    counter=$(($counter+1))
done5.3 until
例如:
#!/bin/bash
counter=$1
until [ $counter -lt 10 ];
do
   echo the counter:$counter
   let counter=counter-1
done 
			 
				