1 shell编程 对比 C编程
shell编程: (1.执行过程,2.开发效率,3.执行效率,4.移植性)
解释型语言
边翻译边执行 (ls cp(程序))
擅长文件处理,操作系统管理
开发效率高 cp 1 2
执行效率低
移植性好
.c
编译型语言
先编译再执行 //gcc 编译 (.c ---> 机器代码)
擅长数据计算和数据处理
开发效率低
执行效率高
移植性差
2.2 shell脚本编写
1.shell脚本编写流程:
1.vim XX.sh #!/bin/bash //编辑文件
2.编写脚本
3.chmod +x XX.sh //给执行权限
4. ./XX.sh //执行文件
注意:
# --- 第一行 不要写注释 这些
文件类型 所属用户权限 所属组 其他人
- rw- rw- r--
chmod +x 1.sh
chmod
//chmod - ls -l 权限位
chmod +x
chmod 0777 01.sh
r w x - r w x - r w x
1 1 1 1 1 1 1 1 1
----- ----- -----
7 7 7
r w x - r w x - r w x
0 0 1 1 1 1 1 1 1
----- ----- -----
1 7 7
2.shell变量
1.环境变量: env
PATH:保存当前工作的默认路径
PWD :当前所在的工作路径
HOME:当前登录用户的家目录
...
键(key)值(value)对
KEY=value
2.位置变量: ./3.sh /etc/passwd 123 内置变量
main(int argc,char* argv[]) // a.out 1 2
@argc --- 命令行参数的个数
@argv --- 命令行参数对应的数组的首地址
$0:脚本文件名
$1:传入脚本的第一个参数
$2:传入脚本的第二个参数
...
$9:
ls /etcpass
cp /etc/passwd 123 ;
$#:传入参数的个数
$?:上一句shell命令执行的结果
0 表示成功
$$:当前shell的PID --- $$ 21694 //进程的概念提示
进程 ---- 进行中程序(process id--进程的身份证号)
a=123
//[说明]:
表 1 位置参数变量
位置参数变量 作 用
$n n 为数字,$0 代表命令本身,$1〜$9 代表第 1〜9 个参数,10 以上的参数需要用大括号包含, 如${10}
$* 这个变量代表命令行中所有的参数,把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待
$# 这个变量代表命令行中所有参数的个数
3.自定义的变量:
注意:
(1).shell中数据是弱类型,默认识别为字符串类型
(2).不需要,先定义
(3).名字规则 ,遵循C的命名规则。 //(不要带空格)
不能带 $符号
[注]
给值的时候 等号两边不能有空格
var=123 (√)
var = 123 (x)
echo ~ printf
read --表示从哪个键盘获取输入
3.shell脚本输入输出
read name
echo '$name'
a+b;
4.shell中的引号
"":打印字符串,遇到$变量($name)则打印变量中的值(name变量的值)
'':打印字符串,遇到$变量依然打印 $变量 (原样输出)
` `:将中间的字符串按照命令打印 (命令置换)
read
read从标准输入读入一行, 并赋值给后面的变量,其语法为:
. read var
把读入的数据全部赋给var
. read var1 var2 var3
把读入行中的第一个单词(word)赋给var1,
第二个单词赋给var2,
……把其余所有的词赋给最后一个变量.
如果执行read语句时标准输入无数据,
则程序在此停留等侯,
直到数据的到来或被终止运行。
//字符串不能进行运算,需要专门命令 expr
运算:
expr
expr
算术运算命令expr主要用于进行简单的整数运算,
#注意:
(1).符号两边要有空格
(2).注意对应的运算符是否需要转义
包括:
加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作。
分支语句:
1.if语句
if (表达式)
{
语句1;
}
else
{
语句2;
}
if 条件
then
语句1
else
语句2
fi //fi
//多分支
if 条件表达式
then
语句
elif [条件表达式] #else if (表达式)
then
语句
elif [条件表达式]
then
语句
else
语句
fi
//条件的生成 --test的命令 //注意: test 执行结果为真 0
// 执行结果为假 1
man test
-a and &&
-o or ||
test -eq 相等
test 10 -eq $i [ $i -eq 10 ] if( a == 10)
-ne 不相等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
[ $i ge 0 -a $i lt 59 ]
//命令的写法
test 10 -eq $i
//中括号
[ $i -eq 10 ] //注意: 中括号里面,前后都要有空格。
//C风格
(( c语言风格的表达式 ))
test
-b 块设备文件 block test -b /dev/usb0 --- 硬盘 // ls -l /dev/sda
-c 字符设备文件 char --- 鼠标,键盘 // ls -l /dev/input/mice
-d 目录文件 directory
-f 普通文件 regular
-L 链接文件 link 类似 windows下的快捷方式 // ln -s 源文件 目标文件
-S 套接字文件 socket (本地socket/网络socket )
-p 管道文件 pipe (管道) //进程的通信 mkfifo pipe
练习 5:
从终端输入一个文件名,判断该文件的类型
1 #!/bin/bash
2
3 echo "Input a name"
4 read file
5
6 if test -L $file
7 then
8 echo "link"
9 elif test -c $file
10 then
11 echo "char"
12 elif test -d $file
13 then
14 echo "director"
15 elif test -b $file
16 then
17 echo "block"
18 elif test -f $file
19 then
20 echo "regular"
21 elif test -s $file
22 then
23 echo "socket"
24 elif test -p $file
25 then
26 echo "pipe"
27 else
28 echo "no exist"
29
30 fi
2.case
switch(n)
{
case 1:
...
break;
default:
...
break;
}
//shell
case $num in
9)语句
;; //C中的 --- break
8|6|5|4)语句
;; //C中的 break
7)语句
;;
*)语句 //default
;;
esac //esac --->case 反着写
练习:从终端接收一个成绩,并评级
1 #!/bin/bash
2
3 read n
4 ret=`expr $n / 10`
5
6 case $ret in
7 0|1|2|3|4|5)
8 echo "E"
9 ;;
10 6)
11 echo "D"
12 ;;
13 7)
14 echo "C"
15 ;;
16 8)
17 echo "B"
18 ;;
19 9|10)
20 echo "A"
21 ;;
22 *)
23 echo "false"
24 ;;
25 esac
26
for 循环:
for循环一般格式为:
//c
for (表达式1;表达式2;表达式3)
{
语句;
}
//shell
for var in item1 item2 ... itemN //for循环的条件
do //for循环的执行体
command1
command2
...
commandN
done
1 #!/bin/bash
2
3 for var in 1 2 3 4 5 6 7 8 9
4 do
5 echo "var = $var"
6 done
while 循环:
一般格式:
while condition
do
command
done
实例:100求和
1 #!/bin/bash
2
3 i=1
4
5 while test $i -le 100
6 do
7 echo "i = $i"
8 # ((i++))
9 i=`expr $i + 1`
10 done
until
语法格式:
until condition
do
command
done
condition 一般为条件表达式,
如果返回值为 false,
则继续执行循环体内的语句,否则跳出循环。
实例:100求和
1 #!/bin/bash
2
3 i=1
4 sum=0
5 until [ $i -gt 100 ]
6 do
7 echo "i = $i"
8 # ((++i))
9 # sum=`expr $sum + $i`
10 ((sum+=i))
11 i=`expr $i + 1`
12 done
13 echo "sum = $sum"