shell编程和c语言的比较
- shell编程:shell是一种解释型语言,擅长文件处理和操作系统管理,开发效率高但执行效率低,移植性好。
- c语言:编译型语言,先编译再执行,擅长数据计算和数据处理,但开发效率低,执行效率高移植性差。
shell脚本编程
shell命令解释器:Bash, Ksh, Csh, Ash
shell脚本的本质就是一系列shell命令的集合
1.shell脚本编写流程
- vim XX.sh #!/bin/bash
- 编写脚本
- chmod +x XX.sh(改变文件权限)
- ./XX.sh
2.shell变量
1.环境变量: env
- PATH:保存当前工作的默认路径
- PWD:当前所在的工作路径
- HOME:当前登录用户的家目录
#!/bin/bash
echo "hello world"
#include <stdio.h>
#include <stdlib.h>
//命令行参数
// ./a.out 112312 21231231
int main(int argc, char *argv[])
{
if(argc<3)
{
printf("error:./a.out num1 num2\n");
return 1;
}
printf("argc is %d\n",argc);
int i =0;
for(i = 0 ;i<argc;i++)
{
printf("%s\n",argv[i]);
}
int num = atoi(argv[1]) + atoi(argv[2]) ;
printf("num %d\n",num);
return 0;
}
2.位置变量:
- $0:脚本文件名
- $1:传入脚本的第一个参数
- $2:传入脚本的第二个参数
- ...
- $#:传入参数的个数
- $?:上一句shell命令执行的结果
- $$:当前shell的PID
3.shell脚本输入输出
- 输入:read a
- 输出:echo '$a'
4.打印
- " ":打印字符串,遇到$变量则打印变量中的值
- '':打印字符串,遇到$变量依然打印$变量
- ``:将中间的字符串按照命令打印
5.shell test命令
-eq | = | -ne | != |
-gt | > | -lt | < |
-ge | >= | -le | <= |
-f | 普通文件 | -d | 目录文件 |
-b | 块设备文件 | -c | 字符设备文件 |
-L | 链接文件 | -S | 套接字文件 |
-p | 管道文件 |
#!/bin/bash
a=20
b=30
if test $a -gt $b
then
echo "a > b"
elif [ $a -eq $b ]
then
echo "a == b"
else
echo "a < b"
fi
3.分支语句
1. if语句
#!/bin/bash
echo "输入文件名"
read filename
if [ -e $filename ]
then
cat $filename
else
touch $filename
echo "hello world" > $filename #输出重定向
fi
2. case语句
#!/bin/bash
echo "input num 1-10"
read a
case $a in
1)
echo "num is 1"
;;
3|4|5)
echo "num 3-5"
;;
*)
echo "other"
;;
esac
3. while语句
#!/bin/bash
i=0
while [ $i -lt 100 ]
do
echo "$i"
#i++;
i=`expr $i + 1`
done
4. for语句
例如:每隔五个输出从20至100的数
#!/bin/bash
for i in `seq 20 5 100`
do
echo "$i"
done
5. until语句
#!/bin/bash
i=0
until [ $i -eq 100 ]
do
echo "$i"
i=`expr $i + 1`
done
练习:从终端接收两个数,并打印出这两个数四则运算的结果
#!/bin/bash
read a
read b
c=`expr $a + $b`
echo "a+b $c"
c=`expr $a - $b`
echo "a-b $c"
c=`expr $a \* $b`
echo "a*b $c"
c=`expr $a / $b`
echo "a/b $c"
注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被两个反引号(` `)包含,注意这个字符不是常用的单引号,在 Esc 键下边。
- 乘号(*)前边必须加反斜杠(/)才能实现乘法运算(/*);