Shell脚本回顾

shell脚本,接近内核的脚本语言
语言学习:语法-应用-框架-中间件

Shell

弱类型

shell脚本需要用#! /bin/bash开头,相当于声明一个shell脚本

#注释

为了操作内核

sh、csh两大主流

sh:bash sh

csh: csh tcsh

脚本执行

1.输入绝对路径或相对路径

必须为一个可执行文件

/shell/name
./name

2.bash 或 sh+脚本

sh hello.sh
当脚本没有x权限时,root和文件所有者通过该方式可以执行脚本

3.脚本路径前加 .source

source hello.sh
. hello.sh

区别

第一和第二会新开一个bash,不同的bash中的变量无法共享

source是在同一个shell里面执行

作用域不同

变量数据传递

export

export:将当前进程的变量传递给子进程去使用,

将来配置profile的时候,所有的变量前必须加export让子进程可见

export age=18
//使用此方式定义的变量在所有中都可以取到
echo $age

变量引用顺序:当前进程出发,当前进程没有该变量就到父进程查询

如果使用export变量修饰后,该变量对于子进程可见

语法

变量

定义

只能英文字母、数字、下划线,不能数字开头

不可使用关键字

变量类型

局部变量:在脚本或者命令中定义,仅在shell实例中有效,其他shell启动的程序不能访问局部变量

环境变量:所有程序都能访问的变量

shell变量

由shell程序设置的特殊变量,一部分是环境变量,一部分是局部变量。

#变量声明
name=1
#变量调用
echo $name
echo ${name}
#变量只读
url="www.baidu.com"
readonly url
#变量删除
unset name

字符串

单引号、双引号、无引号

单引号:原样输出,单引号不能出现单独的单引号但可以成对出现,作为字符串的拼接

#拼接
name=aaa
temp=''$name'bbb'
temp1='$namebbb'
echo $temp
#aaabbb
echo $temp1
#$namebbb

双引号:可以转义,可以有变量

#定义变量123,用不同的方式定义3查看输出结果
name1=zhangsan
name2=$name1
name3='$name2 shuchu'

echo $name3
#$name2 shuchu
name3="$name2 shuchu"
echo $name3
#zhangsan shuchu


${}用法

name=123
#输出长度 ${#}
echo ${#name}#输出 3

#字符串切片${name:start:length}
echo ${name:0:2}#输出12
#start和length可省略
#从start位切多长.

#字符串替换${str/a/b}将str中的a串替换为b串
#a可以使用正则串匹配
#开头一个正斜杠为只匹配遇到的第一个字符串
#两个正斜杠为匹配所有遇到的字符。
echo ${name/1/5}#第一个1替换为5
name=java hello java
echo ${name//java/shell}#将所有的java换成shell

#字符串截取,可以看做删除指定字符串
#有点笨,只能从头或者从尾,可以用通配符,[seq]字符序列
#例如[a-b]
${str#}#从头截取,最短匹配,双##最长匹配
${str%}#从尾部截取,最短匹配,双%%最长匹配
url=http://www.baidu.com/a
echo ${url#*//}#输出www.baidu.com/最短匹配

echo ${url##*/}#输出a,最长匹配

echo ${url%/a}#输出http://www.baidu.com

数组

bash支持一维数组,不支持多维数组,没有限定数组大小

#定义方法
name=("张三" "李四")
#读取,使用${name[下标]}
echo ${name[0]}
#获取所有元素,在下标处使用@或者*
echo ${name[@]}
echo ${name[*]}
#获取长度使用#,和普通变量一样
echo ${#name[@]}

运算符

普通的算术运算符都有

包括加减乘除取余赋值判等

乘法前必须加 / 转义

关系运算符

-eq#判断相等
-ne#判断不相等
-gt#相当于大于号
-lt#相当于小于号
-ge#大于等于
-le#小于等于

布尔运算符

!非运算

-o或

-a与运算

字符串运算符

&&逻辑and

||逻辑与

-z 长度是否为0

-n 是否不为0

$ 是否为空

使用方式

erp

a=1
b=2
echo `erp $a + $b`#输出3,中间要有括号

中括号

a=a
b=b
if [ $a = $b ]
then echo true
else echo false
fi

test

和中括号运算符比较相似

其中包含中括号运算中的字符串运算和关系运算

不同的是有文件测试

-e 文件名 	-存在则为真
#后续所有的命令都包含存在这个条件
-r 文件名 	且可读则为真
-w 文件名 	且可写则为真
-x 文件名 	且可执行则为真
-s 文件名 	且至少有一个字符则为真
-d 文件名 	且为目录则为真
-f 文件名 	且为普通文件则为真
-c 文件名 	且为字符型特殊文件则为真
-b 文件名 	且为块特殊文件则为真

echo

#普通显示
echo
#-e 激活转义字符
echo -e
#>重定向到某文件
echo "hello" > file
#'原样显示'

转义字符

\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;

流程控制

if

如果使用 ((…)) 作为判断语句,大于和小于可以直接使用 > 和 <。

if condition1
then command1
elif condition2
fi

case

case为多选择语句,可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令

case [value] in
model1)
	command1
	command2
	...
	;;#相当于
model2)
	command1
	command2
	...
	;;
esac

for

for var in 
do
done

输出数组所有元素

str=("1" "2")
for s in "${str[*]}";do
	echo $s;
done

while

用于不断执行一系列命令,也用于从输入文件中读取数据,命令通常为测试条件

while condition
do command
done

break

跳出整个循环

continue

跳出本次

函数(方法)

#定义
function name()
#或者
name()
#可以带return也可以不带return,不加的话将最后一条命令运行结果作为返回值,return后的值只能0-255

firstfun(){
	return $((1+2))
}
#调用时直接
firstfun
#获取返回值可以直接赋给一个变量或者通过$?来获得

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值