Linux之shell编程

Posted 安小猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之shell编程相关的知识,希望对你有一定的参考价值。

shell:操作linux的桥梁

创建: vim 文件名.sh
编写: 头部注释为#!/bin/sh或者#!/bin/bash(注释可写可不写,建议写上)
运行:
1.通过sh命令执行 例如:sh helloworld.sh
2.通过bash命令执行 例如:bash helloworld.sh
3.通过把文件修改为可执行的文件然后通过./文件命令.sh来执行 例如:./helloworld.sh(必须在当前目录下)

变量(动态数据类型,没有数据类型的限制,并且必须初始化)

定义和初始化

格式 变量名称=值
例如: x=10 “abc edefg”
注意: 等号两边不能有空格

使用:通过$区分变量

格式1: $变量
格式2: ${变量}

注意: 格式1,会把$后所有相连内容看做一个变量

格式2,${}表示值引用{}之中的内容分,对相连的内容做了一个区分

$0…$n:表示接收外部参数(执行脚本时,传递的参数)

格式: $下标
注意:
1.$0永远表示脚本名称(所以脚本名称不算数,$0也不算第一个参数)

2.下标大于一位数只能使用 获 取 参 数 , 因 为 {}获取参数,因为 ,下标只把第一位数据看做下标 $*获取所有参数 $#获取所有参数个数

引号:

单引号:按原字符串输出
双引号:可以引用变量,拥有特殊含义的内容

注意:
如果有多个引号,连续的形成一对
引号中使用其他引号,其他引号做字符串使用

字符串

获取长度
格式: ${#变量}

截取:
格式: ${变量:开始位置:长度}
注意:
${str::5}:从0获取5个
${str:0}:从0获取到末尾

替换单个
格式: ${变量/旧/新}
注意:从左向右替换第一个

替换所有
格式: ${变量//旧/新}
注意:替换不会在原字符上进行修改,想要修改原字符串只能重新赋值

删除
从头开始删除 :
${变量#表达式}:匹配第一个删除
${变量##表达式}:匹配最后一个删除
从尾开始删除:
${变量%表达式}:匹配第一个删除
${变量%%表达式}:匹配最后一个删除
注意:
1.从尾开始删除,表达式还是从左向右去写
2.删除不会在原字符上进行修改,想要修改原字符串只能重新赋值

运算符

算术运算符 bash不支持简单的数学运算,可以通过命令实现expr

格式1:
`expr 值 + 值`
注意:符号两边需要加上空格
格式2: $[值+值]

格式3:let 值+值
格式4:$((值+值))
格式5:`echo 值+值 | bc `

比较运算符: > < >= <=…
格式:
$值 符号 值
注意:比较的结果用1(true)和0(false)表示

逻辑运算符: &(与) |(或) !(非)
例如:
#判断2>1结果 echo $[2 > 1]
#反转2>1结果 echo $[!$[2>1]]
#反转后面的结果2>1 and 2>3 false0
echo $[!$[$[2>1]&$[2>3]]]
echo $[2>1 & 2<1]

if

格式1:
if 判断条件
then
判断为true执行的代码
fi

格式2:
if 判断条件
then

判断为true执行的代码
else
判断为false执行的代码
fi

格式3:
if 判断条件
then
判断为true执行的代码
elif 判断条件
then
判断为true执行的代码
。。。 else
判断为false执行的代码
fi
注意:else可加可不加

判断条件的写法

[]:[]两边加空格,符号两边加空格并且符号前加转义符 可以使用字母
[[]]:[[]]两边加空格,符号两边加空格 可以使用字母
():应用于命令替换和数组
(()):不需要加空格,但是不能使用字母 在使用变量时,不需要使用$
详解

for

java格式:
for ((初始化变量;判断条件;控制语句))
do
执行语句
done

python格式:
for 变量 in 结果集
do
执行语句
done

结果集:
{开始…结束}含头含尾,不能引用变量
`seq 开始 结束` 含头含尾

例如:获取1-100的奇数和偶数和

jsum=0
osum=0
	for i in {1..100}
	do
	        if ((${i}%2==0))
	        then
	                #osum+=${i} 结果做了拼接 不是算术运算
	                #osum=`expr ${i} + ${osum}`
	                #osum=$[${i}+${osum}]
	                let osum+=i

	        else
	                let jsum+=i
	        fi
	done
	echo 偶数和为:${osum}
	echo 奇数和为:${jsum}

注意: 使用let在计算时可以直接使用变量

数组:存储多个元素,数据类型可以不同,元素元素之间以空格切分

通过下标获取数据
格式:
${数组[$下标]}
注意:
直接引用数组变量,默认获取下标为0的元素
下标使用*表示获取所有

获取长度:
格式:
${#数组[*]}

read:键盘录入

格式:
read 变量1 变量2 …变量n
注意: 键盘录入时,允许给多个变量进行赋值,值和值之间以空格切分

打印三角形

for i in {1..5}
	do
	        for j in `seq 1 ${i}`
	        do
	                echo -n "* "
	        done
	        echo ""
	done

函数

格式:
function 方法名(){
方法体
return 数字;
}

注意:
1.function和return可加可不加
2. $0…$n表示接收参数,$0永远是脚本名称(忽略)
3.方法的调用直接使用方法名不加()
4. return只能返回数字范围在0-255之间
5. $?接收返回值只能接收一次

日期

获取当前日期时间 ate +"%Y-%m-%d %H:%M:%S"

格式化日期时间: date -d today +"%Y-%m-%d %H:%M:%S"

加减日期时间
date +%Y%m%d //显示前天年月日
date +%Y%m%d --date="+1 day" //显示前一天的日期
date +%Y%m%d --date="-1 day" //显示后一天的日期
date +%Y%m%d --date="-1 month" //显示上一月的日期
date +%Y%m%d --date="+1 month" //显示下一月的日期
date +%Y%m%d --date="-1 year" //显示前一年的日期
date +%Y%m%d --date="+1 year" //显示下一年的日期

重定向:执行命令的结果写写入到文件

标准输入文件(stdin):stdin的文件描述符为0,默认从stdin读取数据。
标准输出文件(stdout):stdout的文件描述符为1,默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,向stderr流中写入错误信息。

注意:想要把错误信息和正确信息写入文件需要后面追加2>&1(把错误信息当做正确信息去处理),>>默认是把正确信息写入文件

定时器:
格式:
打开: crontab -e
写入:*(分钟) *(小时) *(星期) *(几号) *(月份) 命令
查看:tail -f /var/log/cron

例:

* * * * * 每分钟
*/1 * * * * 每1分钟
0 */5 * * * 每5小时
注意:
定时器或脚本中涉及到路劲的全部给绝对路劲

以上是关于Linux之shell编程的主要内容,如果未能解决你的问题,请参考以下文章

Linux之Shell编程(13)--Shell文件包含

Linux之Shell编程(13)--Shell文件包含

linux——shell编程之函数和循环控制

Linux bash基础特性二

linux之shell编程基本语法

Linux之shell脚本编程