shell脚本
可以在shell界面执行的命令文剑(命令文件:含有各种命令的文本)
第一个shell脚本
新建一个shell文件夹(测试方便),在shell文件夹下,新建shell脚本文件shelltest.sh
mkdir shellcd shell/touch shelltest.sh
修改脚本文件的执行权限:
chmod u+x shelltest.sh
vi shelltest.sh
进入文件内容编辑界面,输入:
#!/bin/bashecho \'hello shell
#!
是一个约定的标记,让系统用bash解释器来执行这个脚本
./shelltest.sh
执行脚本,执行结果:
shell中的变量
定义变量: 变量名=值
name_123=\'你好,shell\'
注意点:
1、\”=\”左右不能有空格
2、变量名只能由英文字母、数字、下划线组成,且不能以数字开头
3、不能使用bash里的关键字
变量使用:使用时在变量前加美元符$
name_123=\'你好,shell\'echo $name_123
执行结果:
只读变量: 在变量前加
readonly
删除变量:
unset 变量名
变量类型:
系统变量
echo $PATH printf‘%s\\n%s\\n%s\\n’$PATH $PWD $USER $UID $HOME $HOSTNAME
set:
显示所有系统变量
自定义变量:
弱类型(通常为字符串、数值)
数组
([val1,...valn])
环境变量:跨SHELL访问
全局变量:当前SHELL访问,每个SHELL会话都是独立进程,有独立的PID,不同SHELL的会话之间不会互相交叉影响,函数中的变量默认也是全局变量
局部变量:当前函数中访问,函数中声明局部变量:
local A=5
shell 传递参数:
预定义变量:
$?
最后一次执行命令的返还状态。0表示正常,其他表示异常
$$
当前进程的进程编号PID
$!
后台运行的最后一个进程的PID
$0
命令本身
$n
int(n>0) 表示第几个参数
echo $0 #命令本身echo $1 #打印第一个参数echo $2 #打印第二个参数echo \'参数数量:\' $#
执行脚本:
$*
所有参数(整体)
$@
所有参数(个体)
$#
参数数量
shell字符串
单引号: 会按单引号中输出原本内容
双引号: 如果双引号中有命令,则会执行
字符串拼接:
str1=\"hello\"str2=\"shell\"str3=\"!\"echo $str1 $str2 $str3
执行结果:
获取字符串长度
str=\"hello shell !\"echo ${#str}
执行结果:
截取字符串
str=\"hello shell !\"echo ${str:2:8} #第2个字符开始截取8个字符
执行结果:
字符串查找
str=\"hello shell !\"echo `expr index \"$str\" s` #查找s在str中的位置
执行结果:
shell数组
在shell 中,用括号来表示数组,元素用空格隔开
array=(a b c d e)echo ${array[0]}echo ${array[@]}
在读取数组时,可以
echo ${array[下标]}
,也可以用
echo ${array[@]}
全读
输出结果:
获得数组长度:
array=(a b c d e)length1=${#array[@]}length2=${#array[*]}echo $length1 $length2
执行结果:
shell注释
单行注释:
#
多行注释:
:<<!......!
shell控制台输入
read -t SECONDS -p \"HINT\" VAR
-t 超时(秒)
-p 提示
VAR 控制台输入值赋值的变量
shell运算符
算术运算符:
+ - * / %
算数表达式:
$((EXP)) S=$((2+3))
$[EXP] S=$[2*3]
expr EXP
分布计算
注意:
\\*
表示乘法,其他相同,运算符前后必须加空格
S=`expr 2 \\* 3`
关系运算符和条件表达式:
condition # 前后加空格[ condition ] # -eq(等于) -en(不等于) -gt(大于) -lt(小于) -ge(等于等于) -le(小于等于)test condition # 同上[[ condition ]] # 同上
罗辑运算符
!
非
-o
或
-a
且
shell逻辑控制
分支结构
if[ condition ]then语句块fi
if[ condition1 ]then语句块elif[ condition2 ]then语句块else语句块fi
case $VAR inV1)语句块;;V2)语句块;;*)语句块;;esac
循环结构
for VAR in val1...valndo语句块done
for((初始化;条件;变化)) <=> (i=1;i<=100;i++)do语句块done
while[ condition ]do语句块done