Shell详解
shell脚本
变量
shell允许用户建立变量存储,但不支持数据类型(所有数据只认为是字符串)"="号左右不能有空格
变量尽量大写,便于区分
声明: KEY=value KEY2=`命令` // 动态转换 命令置换 KEY3=$KEY 输出: echo $KEY 删除变量赋值 unset unset KEY env 当前环境变量
位置变量
$0 // 与键入的命令行一样,包含脚本文件名 $1,$2...$9 // 分别包含第一个到第九个命令行参数 ${10} // 两位数以后需要用括号括起来 $# // 包含命令行参数的个数 #@ // 包含所有命令行参数:"$0,$1....$9" $? // 包含前一个命令的退出状态 $* // 包含所有命令行参数:"$0,$1....$9" $$ // 包含正在执行的进程id号
程序和语句
说明性语句(以#开始到结束,不被执行)
****特殊:第一行指定使用什么shell执行
#! /bin/sh
功能性语句(任意的shell命令,用户程序或其他的shell程序)
read从标准输入读入一行,并赋值给后面的变量
read var1 #把读入的数据全部赋给var
read var1 var2 var3 #把读入的第一个内容赋给var1,第二个赋值给var2,其余的都给var3
#如果执行read语句时标准输入无数据,则程序在此等候,直到数据的到来或被终止
expr算数运算命令,包括加(+)、减(-)、乘(\*)、除(/)、求模(%) 每一个运算符左右必须使用空格隔开
expr 12 + 1 \* 3
结构性语句(条件测试、多路分支语句、循环语句、循环控制语句)
条件测试
test语句可以测试三中对象:字符串、整数、文件属性 (0为真1位假)
例如: test `$answer` = yes # 变量answer的值是否为字符串yes test $num -eq 18 # 变量num的值是否为整数18 test -d tem # 测试tep是否为一个目录名
字符串:
=、!=、-z(判断长度是否为0)、-n(判断长度是否不为0)
整数:
-eq(相等)、-ne(不相等)、-gt(大于)、-ge(大于等于)、-lt(小于)、-lt(小于等于)
文件:
-d name(测试name是否为一个目录)、
-e name(测试文件是否存在)、
-f name(测试是否为普通文件)、
-L name(测试是否为符号链接)、
-r name(测试文件是否存在且为可读)、
-w name(测试文件是否存在且可写)、
-x name(测试文件是否存在且可执行)、
-s name(测试文件是否存在且长度不为0)、
f1 -nt f2(测试f1是否比f2跟新)、
f1 -ot f2(测试f1是否比f2更旧)
分支语句
条件语句
if [ 表达式 ] then 命令表 #如果表达式为真执行then后的命令表,命令表可以是一条,也可以是多条 fi
Demo: #!/bin/bash if [ $# -ne 1 ] then echo "$0 filename" fi
多条件语句
if [ 表达式 ] then 命令表 #如果为真返回 elif [表达式] then 命令表 #如果为真返回 .... else 命令表 #反之执行 fi
case分支
case 字符串变量 in 模式1) 命令表1 ;; #终止符 模式2|模式3) #条件或 命令表2 ;; ... 模式n) 命令表n ;; *) #default 命令表* esac
循环语句
for循环
变量依次取单词表中的各个单词,每取一次执行一次循环体中的命令,循环次数由单词表中的单词数确定,命令表中的命令可以是一条,也可以是以分号或者换行符分开的多条
for 变量名 in 单词表 do 命令表 done
Demo: for I in 1 3 5 7 9 # 配合seq使用:seq 起始数 步长 终点 #生成数列 步长可以省略 do echo "$I" done for循环2 for ((变量声明;执行条件;变量修改)) do 命令表 done Demo: for ((I=1;I<=10;I++)) do echo "$I" done Demo: for ((;;)) #无限循环 do echo "for" done
while循环
while循环测试命令或表达式的值,如果为真就执行循环体的内容直到为假退出;while语句的退出状态为命令表中被执行的额最后一条命令的退出状态
while 命令或表达式 do 命令表 done
循环控制语句
break、continue
函数
函数的调用格式
方式1 value_name=`function_name[args1 args2 ...]` #所有的标准输出都传递给主程序的变量 方式2 function_name[args1 args ...] echo $? #所有输出都被$?吸收
函数定义
function_name(){ 代码块 } demo function_name() { echo $1 return $1 #可以省略 } TXT=1 function_name $TXT echo $? #获取到return值