C语言属于编译性、强类型语言,
而shell是解释性语言,即不需要编译直接能运行。也是弱类型语言
命令,shell,shell脚本的区别
1.命令:用户根据需求给内核的指令。
2.shell:指令解释器,依附于终端的一个进程,将指令解释给内核的交互进程。
3.shell脚本:多个指令的集合。
创建一个shell脚本
1.创建一个.sh文件。
2.开头:第一行#!+参数。(参数是用来告诉系统用哪个程序来执行文件)
3.运行时没有执行权限,需要给这个.sh文件添加可执行权限权限。
4.运行这个.sh文件。
注意:第一行必须时#! + 参数。注释行前加#表示注释
shell变量
shell 允许用户建立 变量存储数据,但它不支持数据类型。
变量类型
1.用户自定义变量。
- 注意:
1.任何赋值给变量的值都被shell解析成字符串。
2.shell中字符串单引号和双引号都行。
3.echo命令自带换行,要想不换行使用echo -n
4.=两边不能有空格
2.位置参数即命令行参数。
- 位置参数是由系统提供的参数。用$N(N表示一个数字)
3、变量
3.预定义变量。
- $#:包含命令行参数的个数。(不包含.sh)
- $@:包含所有命令行参数。
- $?:包含前一个命令的退出状态。正常退出为0,否则为非零值。(在shell中0为真,反之为假)
- $$:包含正在执行进程的ID号。
- $*:包含所有命令行参数。
4.环境变量。
- env:查看所有环境变量。
命名规范
1.由字母数字下划线组成,开头不能是数字。
2.不能使用标点符号。
3.尽量见名知意。变量一般用大写字母表示
shell程序和语句
说明性语句
1.#表示注释。
功能性语句
1.输出语句:echo
2.输入语句:read
或者
该方法的双引号两边必须有空格
3.算术运算:expr (只能进行简单整数的运算)
运算符两边必须有空格隔开
写乘法时注意用 \*转义,避免让计算机误解成通配符
4.test命令
-
可以测试 字符串 、整数、文件属性。(主要是用来测试文件属性的)
-
字符串测试:
- s1 = s2 :测试两字符串的内容是否完全一样。
- s1 != s2 :测试两字符串是否有差异。
- -z s1 : 测试s1字符串的长度是否为0
- -n s1 : 测试s1字符串的长度是否不为0
$?表示上一条语句的退出状态,注意shell中0为真
也可以用 [ ] 代替test,注意 [ ] 符号两边都需要空格隔开
-
测试整数:
- a -eq b :测试a与b是否相等;
- a -ne b :测试a与b是否不相等;
- a -gt b : 测试a是否大于b;
- a -ge b: 测试a是否大于等于b;
- a -lt b : 测试a是否小于b;
- a -le b : 测试a是否小于等于b;
-
文件属性:
- -d name :测试name是否为一个目录。
- -f name :测试name是否为普通文件。
- -L name :测试name是否为链接文件。
- -r name : 测试name是否为存在且可读。
- -w name :测试name是否为存在且可写。
- -s name :测试name是否存在且长度不为0;
- -x name :测试name是否存在且可执行。
- f1 -nt f2 :测试文件f1是否比f2文件更新。
- f1 -ot f2 :测试文件f1是否比f2文件更旧。
5.结构性语句
- 条件测试语句:
if [ 表达式1 ]
then 语句1
elif [ 表达式2 ]
then 语句2
else
then 语句n
fi
- case语句
case 字符串变量 in #(case语句只能检测字符串变量)
模式1)
命令1
;; #(类似与C语言中的break,但是这里的不能省略)
模式2)
命令2
;;
模式3)
命令3
;; #(最后一个case的;;可以省略)
esac
- 循环语句(break和continue作用同C语言一样)(增强:break 2结束两层 break 3结束3层以此类推 continue 同理)
for 变量名 in 列表
do
命令表
done
#列表可以枚举也可以写范围
#范围(注意 {} 里面不能有变量)
for i in {1..10} #这里必须是两个 "." 表示 1-10
do
echo $i
done
#有步长
for i in {1..10..2} #步长为2
do
echo $i #打印 1 3 5 7 9
done
#枚举
for i in 1 2 3 4 5 a b c
do
echo $i #打印1 2 3 4 5 a b c
done
while 命令或表达式
do
命令表
done
shell函数
1.函数可用return语句将函数执行结果返回给调用者。
#方式一
function_name()
{
命令表
}
#方式二(常用)
function function_name()
{
命令表
}
#调用函数
#方式1(一般常用)
function_name [参数1 参数2 ···]
echo $? #通过$?取上一句的结果
#方式2
value=`function_name [参数1 参数2 ···]` #将函数的返回值赋值给value
#反引号中的内容当作命令处理
shell之间的调用
在shell中直接执行其他shell脚本即可。