shell脚本操作
Shell文件语言
终端打印输出用echo
指令
echo "hello world"
变量
1 . 变量名必须是字母
(a-z,A-Z
) + 下划线_
2 . 变量名中不能有标点符号
3 . 变量名中不能有空格
变量输出需要加$
符号,但是=
是不能加空格的
name="smile2017"
#错误的形式 加了空格
name = "smile2017"
只读变量
关键字 readonly
name="leon"
#只读name属性
readonly name
#会报错,不会打印
name="sisi"
echo $name
#打印
./hello.sh: line 19: name: readonly variable
删除变量
关键字 unset
name="Andy"
#打印name
echo $name
#删除name
unset name
echo $name
变量类型
类型一:本地变量,作用域整个bash进程可以使用,语法:name="leon"
类型二:局部变量,作用域是当前代码块,用关键字local
去修饰,语法:local name= "Andy"
类型三:环境变量,作用域当前shell进程以及子进程,语法:export name="Andy"
类型四:位置变量,${0},${1}等
来填入输入不同变量。语法:name=${0},age=${1},echo "姓名${nane},年龄${age}"
例如:
#!/bin/bash
name=${1}
age=${2}
sex=${3}
echo"姓名:${name},年龄:${age},性别:${sex}"
最后执行脚本 执行脚本时写入变量
./hello.sh Jeff 150 男
#文件名称为${0},所以第一个参数从${1}开始
特殊变量
类型
$(0)
->特殊变量->文件名称
$(?)
->表示返回上一个命令执行状态返回值->0
:表示执行成功,1
:程序执行结果,2
表示程序状态码返回(0-255)
$(#)
->参数个数
$(*)
->参数列表
$(@)
->参数列表
$($)
->参数当前shell的PID
$(!)
->执行上一个指令的PID
$(*)
和$(@)
的区别在于$(*)
会将所有的参数组合成字符串输出,而$(@)
会将参数一个一个输出。
字符串
字符串表示:
用单引号
或者双引号
表示
字符串的拼接:
\1. 直接用 ${name}${age}${sex}
\2. 在变量中用引号info="姓名:"${name}" 年龄:${age}"
获取字符串长度:
在变量名前面直接加上#
eg:name=andy echo=${#name}
字符串截取
例如:
name="leon is good boy"
#从下标为2的字符串开始开始截取3位
result=${name:2:3}
#从字符串第5位开始截取,到最后一位
#方式一:
length=${#name}-1
result1=${name:2:lenght}
#方式二:默认后面直接到最后一个
result2=${name:2}
字符串删除
${变量名#删除的字符串 正则表达式}
#匹配不到
name="i have a dream"
result=${name#dream}
echo ${result}
#默认从左到右匹配查询删除,不然就匹配不到
result1=${name#I}
echo ${result1}
#查找指定字符的第一个,并且删除前面所有的字符,并且包含自己
result2=${name#*D}
echo ${result2}
#指定删除范围
result3=${name#I*D}
echo ${result3}
#如果从右边开始检查就用##
reslut4=${name##*a}
echo ${reslut4}
#从字符串结尾开始匹配用%
result5=${name%m}
echo ${reslut5}
#查找指定字符的第一个,删除所有字符(包含自己)
result6=${name%h*}
echo ${result6}
#删除指定范围
result7=${name%a*m}
echo ${result7}
##方向从左往右
result8=${name%%a*m}
echo ${result8}
Shell语言的echo命令
我们都知道echo是打印输出的意思,那么echo可以怎么实现输入呢
- 显示普通的字符串,例如:
echo "iPhoneX 标配8888"
- 显示转义字符,例如:
echo "iPhone 顶配 10000"
- 显示变量,例如:
iphone="iphoneX" echo "${iphone} 9888"
- 显示换行,必须要用
-e
来开启转义功能,例如:echo -e "iphoneX \n hello 未来"
- 不换行,不换行用
\c
表示,例如:echo -e iPhoneX hello未来 \c echo"科技"
- 显示一个执行命令,例如要求输入当前时间,用
date
- 退出命令,
exit 状态(详见下方的状态表)
,如果一旦执行了exit之后,后面的语句就不会继续执行了。 - 重定向
关于状态码:
状态码 | 描述 |
---|---|
0 | 命令执行成功 |
1 | 一般性未知错误 |
2 | 不适合的shell命令 |
126 | 命令不可执行 |
127 | 没有找到命令 |
130 | 通过ctrl+c终止的命令 |
255 | 正常范围内推出的状态码 |
Shell语言的数组
语法
数组名=(值1 值2 值3...)
初始化
方式一:
name=("404" "andy" "hello" "world")
Shell
方式二:
name=()
name[1]="404"
name[2]="andy"
name[3]="hello"
name[4]="world"
Shell
读取数组
用@
或者*
来输出所有的数组元素,但是@
是将元素一个一个输出,*
是将数组内元素组合成一个字符串输出。这点需要注意。
echo ${name[*]}
echo ${name[@]}
数组长度
之前说了在输出前面加#
是输出字符串长度,这里同样适用于数组,在获取所有元素之后之后在数组前面加上#
,如果是*
的话,#
同样适用,可以很智能的识别空格来进行对元素长度的识别解析。
echo ${#name[@]}
echo ${#name[*]}
如果需要获取单个元素字符长度我们则可以用具体的下标
echo ${#name[3]}
Shell语言的传递参数
语法定义:(终端输入)
./文件名称.sh 参数一 参数二 参数三
获取参数:
之前字符串章节说过用${1},${2}...
表示,需要注意的是${0}
表示文件名称
echo ${1} ${2} ${3}
Shell
复制
特殊字符
获取脚本输入参数个数
echo ${#}
Shell
复制
获取参数列表
echo ${*}
Shell语言的基本运算符
基本运算符
基本运算符就是我们所称的+ - * / %
a=1234
b=3214
c=`expr $a + $b`
Shell
可以注意到,在shell语言中,单纯的元素相加不能直接用+,而是必须要用expr去计算两个变量的值。而且如果调用,后面的变量名称和+之间必须要加上空格来保证变量的独立性。否则则会当成字符串输出。
注意:当且仅当用乘法的时候必须加上一个转义字符\
,
a=1234
b=3214
c=`expr $a \* $b`
Shell
赋值运算符
=
这个符号就很简单了,就不在做阐述了
关系运算符
一张表格阐述
布尔运算符
一张表格阐述
逻辑运算符
一张表格阐述
字符串运算
一张表格阐述
文件测试运算符
一张表格阐述
循环控制语句
if-else
语法结构
if [条件]
then
代码
else if [条件]
then
代码
else
代码
fi
Shell
记住判断最后要以fi
结尾
例如我们来判定一个学生是不是男生:
sex="man"
if [ $sex = "man" ]
then
echo "男生"
else
echo "女生"
fi
for
语法结构
for 变量名 in item1 item2 item3 …
do
代码
done
比如我们要循环打印一个数组中的元素:
names=("张三" "李四" "王五")
for i in ${names[@]}
do
echo ${i}
done
while
语法结构
while(条件)
do
代码
done
Shell
假设我们要一直循环直到while条件不成立
a=1
while(($a<10))
do
echo ${a}
a=`expr $a + 1`
done
case
case
语法结构
case 值 in
模式1)
代码
;;
模式2)
代码
;;
模式3)
代码
;;
sac
判断number的值
number=1
case $number in
1) echo "等于1"
;;
2) echo "等于2"
;;
3) echo "等于3"
;;
esac