Shell脚本语言学习1

shell解析器:指定脚本使用的shell解释器
#!/bin/bash
执行脚本:bash ./hello.sh 或者 sh ./hello.sh 必须加./
给文件赋权:chown +x hello.sh 就可以./hello.sh
扩展方案:source hello.sh 也可以执行。 . hello.sh也可以


子bash和当前bash,可以使用type source.我们执行ps -f 可以查看当前bash环境,创建一个子bash,在当前子bash环境下,依然可以运行shell文件
变量:如果子shell中设置的当前变量,父shell是不可见的
变量:::::
全局变量:层层嵌套的子bash都是可以访问的
局部变量:只在当前bash可以访问的
env打印的都是全局变量
set是所有的


用户自定义变量:
变量名=变量值 #等号前后不能有空格,在声明的时候不用加 ,使用的时候需要。如果定义一个字符串,需要加上双引号或者单引号全局变量的定义:需要先生命一个局部变量,然后通过 e x p o r t 导出。子变量修改全局变量,只会在当前 b a s h 中生效,不会影响父 b a s h , 哪怕 e x p o r t ,依然不会改变父 b a s h 在 s h e l l 中,变量是没有类型的,或者我们理解为全部都是字符串类型如果变量的值需要做数值运算,可以使用 ,使用的时候需要。如果定义一个字符串,需要加上双引号或者单引号 全局变量的定义 :需要先生命一个局部变量,然后通过export导出。子变量修改全局变量,只会在当前bash中生效,不会影响父bash,哪怕export,依然不会改变父bash 在shell中,变量是没有类型的,或者我们理解为全部都是字符串类型 如果变量的值需要做数值运算,可以使用 ,使用的时候需要。如果定义一个字符串,需要加上双引号或者单引号全局变量的定义:需要先生命一个局部变量,然后通过export导出。子变量修改全局变量,只会在当前bash中生效,不会影响父bash,哪怕export,依然不会改变父bashshell中,变量是没有类型的,或者我们理解为全部都是字符串类型如果变量的值需要做数值运算,可以使用((1+1))或者$[1+1]


只读变量和撤销变量
只读变量: readonly 变量名=值
撤销变量: unset 变量名 变量是可以撤销的,但是只读变量不能撤销


$n 其代表接受参数,n是数字,代表在执行脚本时候传递的参数数量,例如$1- 9 代表第一个到第九个参数, 10 以上的数字,可以用大括号包裹,比如 9代表第一个到第九个参数,10以上的数字,可以用大括号包裹,比如 9代表第一个到第九个参数,10以上的数字,可以用大括号包裹,比如{10},比较
特殊的$0,代表当前脚本名称
$#获取输入参数的个数,一般用于循环中,判断参数的个数是否正确,加强脚本健壮性
∗ 和 *和 @非常相似,都代表命令行所有的参数,但是 ∗ 把参数看成一个整体,例如 123456. 而 *把参数看成一个整体,例如123 456.而 把参数看成一个整体,例如123456.@把每个参数区分对待,例如[123 456]注意:在没有循环遍历的时候两者效果一样
$?最后一次执行命令状态,如果结果是0,证明上面执行的命令都是正确的,如果结果不是0,则证明上面命令不正确


运算符:
expr 表达式 ,运算符两边要有空格
a1=$(expr 10 + 5)
a1=expr 10 + 5


条件判断:
等于不等于:
test 表达式
[ 表达式 ]
shell中0是true,和其他语言不同
两个值相比较:
-eq 等于 -ne 不等于 -lt 小于 -le 小于等于 -gt 大于 -ge 大于等于
文件权限判断
-r 读 -w 写 -x 执行
文件类型判断
-e 文件是否存在
-f 文件存在并且是一个文件类型
-d 文件存在并且是一个目录类型
多条件判断
&& 与的关系,两者都成立
|| 或的关系,两者有一个成立


流程控制
if判断:
if [ 条件判断 ];then
语句
fi
或者(第二种方式多)
if [ 条件判断 ]
then
语句
fi
// 多条件用-a连接&& ,-o代表||

	if [ ] 
	then
	语句
	else
	语句
	fi
	
	if []
	then
	elif []
	then
	else
	fi
	
case 基本语法
	case $变量名 in
	"值1")
	语句
	;;
	"值2")
	语句
	;;
	*)
	语句
	;;
	esac

循环流程
for
语法
for (( 初始值;循环控制条件;变量名称))
do
语句
done

	for 变量 in 值1 值2
	do
	done
	
	内部运算符
	{} 表示一个序列,例如从1到100:{1..100}
	
while
	while []
	do
	done
	
let语法后面可以跟正常语句

shell读取控制台输入
基本语法;
read 选项 参数
选项 : -p 读取的提示符 -t 读取时的等待时间
例如:read -t 10 -p “请输入。。。” name


系统函数
date
basename:获取文件名称,它会删除所有前缀包括最后一个/字符,然后将字符串显示出来
例如:basename /abc/hgj/e 输出 e ; basename /scripts/cmd_test.sh 输出cmd_test.sh ; basename /scripts/cmd_test.sh t.sh 输出cmd_tes
dirname :获取文件路径的绝对路径,从给定的包含绝对路径的文件名中去除文件名,然后返回剩余路径
例如: echo scripts path:$(cd $(dirname 0 ) ; p w d ) 自定义函数 f u n c t i o n 函数名 ( ) r e t u r n 返回值 必须在调用函数之前先声明函数函数返回值可以通过 0);pwd) 自定义函数 function 函数名() { return 返回值 } 必须在调用函数之前先声明函数 函数返回值可以通过 0);pwd)自定义函数function函数名()return返回值必须在调用函数之前先声明函数函数返回值可以通过?获取,但注意,$?的值范围是0~255


案列:(归档文件)
#!/bin/bash

# 首先判断输入参数的个数
if [ $# -ne 1 ]
then
        echo "参数个数错误"
        exit
fi
#从参数中获取目录名称 查看目录是否存在
if [ -d $1 ]
then
        echo
else
        echo "目录不存在"
        exit
fi
# 获取目录的绝对路径
DIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1);pwd)
#获取当前日期
DATE=$(date +%y%m%d)
#生成的归档文件名称
FILE=archive_${DIR_NAME}_$DATE.tar.gz
# 定义生成文件路径
DEST=/home/uap-home/archive/$FILE
# 归档开始
tar -czf $DEST $DIR_PATH/$DIR_NAME
#判断归档是否成功
if [ $? -eq 0 ]
then
        echo "成功"
else
        echo "归档出现问题"
fi
exit

定时规划
crontab -e
*/1 * * * * date >> /scripts/crontal_test.txt

给脚本添加定时器
0 2 * * * 脚本路径

正则表达式:
^匹配一行的开头 以甚麽开头 grep ^d
匹配这一行的结束以甚麽结束 g r e p d 匹配这一行的结束 以甚麽结束 grep d 匹配这一行的结束以甚麽结束grepd
. 匹配任意一个字符 grep r.t
* 不能单独使用,和上一个字符连用,表示0次或者多次 grep r.t
[]表示匹配某个范围的一个字符,[6,8] 匹配6或者8 [0-9],[A-Z,a-z],[0-9]

\表示转义,并不会单独使用 grep ‘$’ 必须单引号


cut工具:
cut [选项参数] filename 默认分隔符是制表符
-f 列号 提取第几列
-d 分隔符
-c 按字符进行切割,后加n表示取第几列 比如-c 1
cut -d " " -f 1 testCut.sh


awk:
文本分析工具:
awk [选项参数] ‘/pattern/action/pattern/action’ filename
pattern 表示awk在数据中查找的内容,匹配模式
action 在找到匹配内容时所执行的一系列命令
-F 指定输入文件分隔符
-v 赋值一个用户定义变量
cat /etc/passwd| awk -F “:” ‘/^root/{print $7}’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值