Linux的shell编程的学习

shell操作

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

2.变量(动态数据类型,没有数据类型的限制,并且必须初始化)
	定义和初始化
		格式
			变量名称=值
		例如:
			x=10 "abc edefg"
		注意:
			等号两边不能有空格
	使用:通过$区分变量还是一句话
		格式1:
			$变量
		格式2:
			${变量}
		注意:
			格式1,会把$后所有相连内容看做一个变量
			格式2,${}表示值引用{}之中的内容分,对相连的内容做了一个区分 

3.$0...$n:表示接收外部参数(执行脚本时,传递的参数)
	格式:
		$下标
	注意:
		$0永远表示脚本名称(所以脚本名称不算数,$0也不算第一个参数)	
		下标大于一位数只能使用${}获取参数,因为$下标只把第一位数据看做下标
		$*获取所有参数
		$#获取所有参数个数		

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

	拼接:连续获取变量
	注意:
		如果有多个引号,连续的形成一对
		引号中使用其他引号,其他引号做字符串使用
4.1清除不需要的变量:unset 变量名
如:unset b
SA="Hello Linux"
echo 'Oh$SA$SA';echo "Oh$SA$SA" 
b="djisahj"
unset b
echo $b

5.Shell变量及表达式 - 位置参数
# 一个关于命令位置参数的脚本文件  arg.sh
#!/bin/bash
echo “完整的命令行:$0$*echo “程序是:$0echo “所有的参数:$*echo “参数个数:$#echo “第1个参数: $16.Shell变量表达式
表达式的操作符主要包括:
字符操作符: =, !=, -n , -z
-n:比较字符串的长度是否大于0,如果大于0则为“是”。
-z:比较字符串的长度是否等于0,如果等于0则为“是”。
数字操作符:-eq, -ne, -ge, -gt, -le, -lt, ==, !=, >=, >, <=, <
逻辑操作符:!, -a, -o
文件操作符:-d, -f, -L,-r, -w, -x, -s, -e, -z,-c, -b,-o
(文件测试表达式通常是为了测试文件的文件操作逻辑,测试符号如下。
-d:对象存在且为目录,则返回值为“是”。
-f:对象存在且为文件,则返回值为“是”。
-L:对象存在且为符号连接,则返回值为“是”。
-r:对象存在且可读,则返回值为“是”。
-s:对象存在且长度非0,则返回值为“是”。
-w:对象存在且可写,则返回值为“是”。
-x:对象存在且可执行,则返回值为“是”。)
逻辑比较:  
test  -f /etc/passwd –a –s /etc/passwd;echo $?
test  -f /etc/passwd –a –d /etc/passwd;echo $?
test  -d /root  ; echo $?
test ! –z /etc/passwd;  echo $?

7.字符串
	获取长度
		格式:
			${#变量}
	截取:
		格式:
			${变量:开始位置:长度}
		注意:
			${str::5}:从0获取5个
			${str:0}:从0获取到末尾
	替换单个
		格式:
			${变量//新}
		注意:从左向右替换第一个
	替换所有
		格式:
			${变量///新}
	注意:替换不会再原字符上进行修改,想要修改原字符串只能从新赋值

	删除
		从头开始删除
			${变量#表达式}:匹配第一个删除
			${变量##表达式}:匹配最后一个删除
		从尾开始删除
			${变量%表达式}:匹配第一个删除
			${变量%%表达式}:匹配最后一个删除
		注意:从未开始删除,表达式还是从左向右去写
			删除不会再原字符上进行修改,想要修改原字符串只能字符串A="HELL:LINUX:WORLD"
#1. 获得字符串长度   
	LEN=${#A}
#2. 提取6-10字符       
	SUB1=${A:5:5}   
    结果 LINUX
#3. 从第6个字符开始提取   
	SUB2=${A:5}  
    结果 LINUX:WORLD
#4. 将符号:替换为符号/  
	REP=${A//:/\/}
    结果 HELL/LINUX/WORLD
#   将符号:替换为cc      
    REP=${A//:/cc}
从新赋值
		
			
8.运算符
	算术运算符
		bash不支持简单的数学运算,可以通过命令实现expr
		格式1:
			`expr 值 + 值`
			注意:符号两边需要加上空格
		格式2:
			$[值+值]

	比较运算符: > < >= <=....
		格式:
			$[值符号值](符号两边空格加不加无所谓)
		注意:比较的结果用1(true)和0(false)表示

	逻辑运算符: &/and |/or !/not
		例如:
			#判断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]

9.Shell支持的流程控制语句主要有:
分支语句:if elif else fi, caseesac
- 循环语句:for, while, until
- 函数定义:function funname()
分支语句if
if ((条件));then
	语句
fi
或者
if [ 条件 ];then
	语句
elif[ 条件 ];then
	语句
else
	语句
fi
#注意:[ 条件 ]中,条件前后必须留有一个空格
#           [];then连在一起写,必须加上分号;

分支语句case
echo  -n "Input A="
read A 
case  $A in
1)  echo "select 11";;
2)  echo "select 22";;
*)  echo "select else";;
esac
#---------
echo  -n "Input A="
read A 
case  $A in
"fuzhou city")  echo "select 11";;
"xiamen city")  echo "seelct 22";;
*) echo "select else";;
esac
#如果是字符串变量且含有空格,则必须在匹配位置加上引号,如"fuzhou city"


循环控制 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的元素
				下标使用*表示获取所有
		获取长度:
			格式:
				${#数组[*]}

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

打印三角形
	for i in {1..5}
	do
	        for j in `seq 1 ${i}`
	        do
	                echo -n "* "
	        done
	        echo ""
	done

11.函数
	格式:
	function 方法名(){
		方法体
		return 数字;
	}
	注意:function和return可加可不加
		$0...$n表示接收参数,$0永远是脚本名称(忽略)
		方法的调用直接使用方法名不加()
		return只能返回数字范围在0-255之间
		$?接收返回值只能接收一次

12.数组
定义:
A=(元素列表,空格隔开)
下标从0开始 如A=(a b c d)

数组长度
${#A[*]}

引用第i个元素
KaTeX parse error: Expected '}', got 'EOF' at end of input: {A[i]}

赋值
A[$i]=value

以字符串输出所有元素
echo ${A[*]}

循环输出所有元素
A=(a b c 123 ad 21)
Len=${#A[*]}
for((i=0;i<"$Len";i++))
do
	echo ${A[$i]}
done
或者
for value in ${A[*]}
do
	echo $value
done

13.序列函数seq
#生成从1到100的100个元素的数组:
seq 1 100
Len=${#A[*]}
for((i=0;i<"$Len";i++))
do
	echo ${A[$i]}
done


14.获取当前日期时间
	date +"%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(把错误信息当做正确信息去处理)

定时器:
	格式:
		*(分钟) *(小时) *(星期) *(几号) *(月份) commend

	通过crontab -e添加定时任务
	查看定时任务是否执行了,看日志tail -f /var/log/cron
	注意:
		定时器或脚本中涉及到路劲的全部给绝对路劲

	* * * * * 		每分钟
	*/1 * * * * 	每分钟
	0 */1 * * *		每小时
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值