可以在shell界面执行的命令文剑(命令文件:含有各种命令的文本)
新建一个shell文件夹(测试方便),在shell文件夹下,新建shell脚本文件shelltest.sh
mkdir shell
cd shell/
touch shelltest.sh
修改脚本文件的执行权限:chmod u+x shelltest.sh
vi shelltest.sh
进入文件内容编辑界面,输入:
#!/bin/bash
echo 'hello shell
#!
是一个约定的标记,让系统用bash解释器来执行这个脚本
./shelltest.sh
执行脚本,执行结果:
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
预定义变量:
$?
最后一次执行命令的返还状态。0表示正常,其他表示异常
$$
当前进程的进程编号PID
$!
后台运行的最后一个进程的PID
$0
命令本身
$n
int(n>0) 表示第几个参数
echo $0 #命令本身
echo $1 #打印第一个参数
echo $2 #打印第二个参数
echo '参数数量:' $#
执行脚本:
$*
所有参数(整体)
$@
所有参数(个体)
$#
参数数量
单引号: 会按单引号中输出原本内容
双引号: 如果双引号中有命令,则会执行
字符串拼接:
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 中,用括号来表示数组,元素用空格隔开
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
执行结果:
单行注释:#
多行注释::<
read -t SECONDS -p "HINT" VAR
-t 超时(秒)
-p 提示
VAR 控制台输入值赋值的变量
算术运算符:+ - * / %
算数表达式:
$((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
且
if[ condition ]
then
语句块
fi
if[ condition1 ]
then
语句块
elif[ condition2 ]
then
语句块
else
语句块
fi
case $VAR in
V1)
语句块
;;
V2)
语句块
;;
*)
语句块
;;
esac
for VAR in val1...valn
do
语句块
done
for((初始化;条件;变化)) <=> (i=1;i<=100;i++)
do
语句块
done
while[ condition ]
do
语句块
done