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_World
2.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 "赣州市";;
esac
5. 循环
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
done
5.2 while
例如:
#!/bin/bash
counter=$1
while [ $counter -lt 10 ];
do
echo the counter is $counter
counter=$(($counter+1))
done
5.3 until
例如:
#!/bin/bash
counter=$1
until [ $counter -lt 10 ];
do
echo the counter:$counter
let counter=counter-1
done