一:Shell简介
Shell 是一种脚本语言
脚本语言的优点是使用灵活、部署容易、跨平台性好,非常适合Web开发以及小工具的制作。
Shell 除了能解释用户输入的命令,将它传递给内核,还可以:
- 调用其他程序,给其他程序传递数据或参数,并获取程序的处理结果;
- 在多个程序之间传递数据,把一个程序的输出作为另一个程序的输入;
- Shell 本身也可以被其他程序调用。
二:常见Shell
sh
sh 的全称是 Bourne shell,由 AT&T 公司的 Steve Bourne开发,为了纪念他,就用他的名字命名了。sh 是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。
csh
sh 之后另一个广为流传的 shell 是由柏克莱大学的 Bill Joy 设计的,这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。Bill Joy 是一个风云人物,他创立了 BSD 操作系统,开发了 vi 编辑器,还是 Sun 公司的创始人之一。
tcsh
tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。ash
一个简单的轻量级的 Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。bash
bash shell 是 Linux 的默认 shell,本教程也基于 bash 编写。bash 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。
四:Shell提示符
对于普通用户,Base shell 默认的提示符是美元符号$
;对于超级用户(root 用户),Bash Shell 默认的提示符是井号#
五:一个Shell脚本
1.echo ${#array_name[@]}
使脚本具有执行权限
2.sh ./test.sh
#执行脚本
3.read 变量名
用来接收我输入的变量
六:Shell变量
1.pyt = lkh
不包含空格
2.pyt = ‘lkh’
纯字符串,不包含解析内容
3.pyt = “lkh”
先解析在输出
4.pyt = $(vi pyt)
把命令变为变量进行赋值
5.readonly 变量名
设为只读变量,不能再次赋值
6.unset 变量
删除变量
七:Shell特殊变量
1.$0
当前脚本的文件名
2.$n
传递给脚本或函数的参数,n代表数字
3.$#
传递给脚本或函数的脚本个数
4.$*
传递给脚本或函数的所有参数
5.$@
传递给脚本或函数的所有参数
6.$?
上个命令的退出状态,或函数的返回值
7.$$
当前Shell的进程
八:Shell替换
1.echo -e
替换语句中的特殊字符(\\ , \a, \b, \f, \n, \r, \t, \v)
2.date = `date`
将命令结果保存在变量中
3.${var:-word}
变量var不存在则输出word
4.${var:=word}
变量var不存在则输出word,并赋值给var
5.${var:+word}
变量var被定义则输出word
6.${var:?word}
变量var不存在则将word送到标准错误输出,用来检验var是否可以被正常赋值
九:Shell运算符
val=`expr 2 + 2`
expr用来完成表达式的求值操作,引号为反引号
运算符:
1.%
取余
2.=
赋值
3.==(-eq)
判断两个数字相等
4.!=(-ne)
判断两个数字不相等
5.-gt
是否左边大于右边
6.-lt
是否右边大于左边
7.-ge
是否左边大于等于右边
-le
是否右边大于等于左边
8.!
非运算
9.-o
或运算
10.-a
与运算
11.=
判断两个字符串是否相等
12.!=
#判断两个字符串是否不相等
13.-z
判断字符串长度是否为0
14.-n
判断字符串长度是否不为0
15.str
判断字符串是否为空
16.-b file
判断文件是否为设备文件
17.-c file
判断文件是否为字符设备文件
18.-d file
判断文件是否为目录
19.-f file
判断文件是否为普通文件
19.-g file
判断文件是否设置了SGID位
20.-k file
判断文件是否设置了粘着位
21.-p file
判断文件是否具名管道
22.-u file
判断文件是否设置了SUID位
23.-r file
判断文件是否可读
24.-w file
判断文件是否可写
25.-x file
判断文件是否可执行
26.-s file
判断文件是否为空
27.-e file
判断文件是否存在
十:Shell字符串
拼接字符串
var =a
var2 =b
echo $var $var1
获取字符串长度
var = ‘’‘abcd’
echo ${#var}
提取字符串
var =‘’abcd‘
echo ${var:1:4}
查找字符串
var =‘’abcd‘
echo `expr index "$var" ab’
十一:Shell数组
定义数组
1.array_name = (value1 value2 value3)
2.array_name[0]=value1
array_name[1]=value2
array_name[2]=value3
读取数组
1.echo $array_name[0]
读取所有元素
2.echo $array_name[*]
读取数组的长度
3.echo ${#array_name[@]}
十二:Shell if else语句
if ... else ... fi
if [ a == b ]
then
echo pyt
else
echo lkh
fi
if ...elif ... fi
if [ a == b ]
then
echo pyt
elif [ a == c ]
then
echo lkh
fi
十三:Shell test命令用于检查条件成立
if test a == b
then
echo pyt
fi
十四:Shell case esac语句
echo 'Input a number between 1 to 4'
echo 'Your number is:\c'
read aNum
case $aNum in
1) echo 'You select 1'
;;
2) echo 'You select 2'
;;
3) echo 'You select 3'
;;
4) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
esac
十五:Shell for循环
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
十六:Shell While循环
COUNTER=0
while[ $COUNTER -lt 5 ]
do
COUNTER='expr $COUNTER+1'
echo $COUNTER
done
十七:Shell until循环
- COUNTER=0
- until[ ! $COUNTER -lt 5 ]
- do
- COUNTER='expr $COUNTER+1'
- echo $COUNTER
- done
十八:Shell函数
#!/bin/bash
# Define your function here
Hello () {
echo "Url is http://see.xidian.edu.cn/cpp/shell/"
}
# Invoke your function
Hello
十九:Shell函数参数
#!/bin/bash
funWithParam(){
echo "The value of the first parameter is $1 !"
echo "The value of the second parameter is $2 !"
echo "The value of the tenth parameter is $10 !"
echo "The value of the tenth parameter is ${10} !"
echo "The value of the eleventh parameter is ${11} !"
echo "The amount of the parameters is $# !" # 参数个数
echo "The string of the parameters is $* !" # 传递给函数的所有参数
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
二十:Shell文件包含
#!/bin/bash
. ./subscript.sh
echo $url
二十一:输入输出重定向
1.command > file
将输出重定向到 file。
2.command < file
将输入重定向到 file。
3.command >> file
将输出以追加的方式重定向到 file。
4.n > file
将文件描述符为 n 的文件重定向到 file。
5.n >> file
将文件描述符为 n 的文件以追加的方式重定向到 file。
6.n >& m
将输出文件 m 和 n 合并。
7.n <& m
将输入文件 m 和 n 合并。
8.<< tag
将开始标记 tag 和结束标记 tag 之间的内容作为输入。