Shell学习总结

本文详细介绍了Shell脚本的基本语法,包括注释、变量、数组的使用,以及算术和逻辑运算。同时,讲解了条件判断、流程控制(如if、for、while循环)和函数的定义与调用。此外,还涵盖了脚本参数处理和一些实用操作,如文件引入和调试方法。文章通过实例展示了如何在Shell脚本中实现字符串和数组的操作,以及awk命令的简单应用,是Shell初学者的宝贵参考资料。
摘要由CSDN通过智能技术生成

基本语法

注释
  • 单行注释 #
  • 多行注释 :<< flag … flag
    :<<指定开头,并指定一个标识符flag作为开始和结束的标志
变量

变量分为环境变量和shell脚本中定义的变量(局部)

  1. 变量的创建
#=号两边不能有空格
name="test" 
#local修饰的变量在函数体外无法访问
local n1="test" 
#使用变量,推荐使用第二种
echo $name
echo ${name}
#删除变量
unset name
  1. 变量类型-字符串
#字符串
name='test'
name="my name is test"
#字符串拼接
name="this is""my name"
#使用#在${}中获取字符串长度
echo ${#name}
#截取子字符串1-4位
echo ${name:1:4}
  1. 变量类型-数组
#只支持一维数组
#定义数组,小括号边界,使用空格分离
arr=(my name is test)
#单独定义数组元素
arr1[0]='w';arr1[3]='s'
#获取所有数组元素
echo ${arr[@]}
#获取数组元素个数
${#arr[@]} 
${#arr[*]}
运算和条件判断
# +、-、*、\,乘号前必须加'\'进行转义可以进程乘法运算
#加法运算
val=`expr 2+2`
val=$[ 2+2 ](空格不是必须的,不同于条件判断)
val=$((2+2))

#关系运算(只支持数字不支持字符串)
#是否相等
[ 2 -eq 2 ]
#是否不相等
[ 2 -ne 2 ]
#大于gt、小于lt、大于等于ge、小于等于le 

#字符串运算符
#相等或不相等
[ 'abc' = 'abc ]
[ 'abc' != 'abc' ]
#检测字符串长度是否为0
[ -z 'abc' ] #为0返回true
[ -n 'abc' ] #不为0返回true
#检测字符串是否为空
[ $'abc' ] #为空返回true

#逻辑运算
#1.非运算符! 或运算符-o  与运算符-a
[ 10 -lt 20 -o 11 -lt 100]
#2.逻辑与&& 逻辑或||
[[ 10 -lt 100 && 11 -lt 200 ]]

#文件运算符
[ -b $filename ] #检测文件是否是块设备文件
#-c -d -f -g -k -p -u -r -w -x -s -e

算数运算格式(空格不是必须):
$[ expr ]
$((expr))
逻辑判断格式:
[ expr ] 中括号两边和符号两边都必须添加空格;
[[ expr ]] 中括号两边和符号两边都必须添加空格(字符串验证时用);
(( expr))中括号两边和符号两边都必须添加空格(数字验证时用);
[[ ]]和(( ))分别是针对字符串表达式和数学表达时使用[ ]的加强版;

注意:使用[[ … ]]条件判断结构,而不是[ … ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ];
(( ))不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了一些常用的符号;

流程控制和函数
#条件判断
if condition
then 
	command1
elif condition2
then 
	command2
else
	command3
fi

#for循环
for var in item1 item2 ... itemn
do
	command
done

#while循环
while condition
do
	command
done

#until循环(执行一系列命令直到条件为true时停止)
until condition
do
	command
done

#case分支语句
case val in
	mod1)
	command
	;;
	mod2)
	command
	;;
esac

#跳出循环break、continue

#函数定义 []中表示可选
[ function ] fun_name()
{
	#action
	[return int(0-255)]
}
#调用函数,函数中依然使用$n来取参数
fun_name 1 2 3
echo $?  #判断函数是否执行成功,$?可以获取return的返回值

#获取函数中所有的echo和printf组合
bin=`fun_name`
echo ${bin}
脚本参数
符号含义
$0固定表示执行文件名
$n表示传递进来的第n个参数
$#表示参数的个数
$*单字符串显示脚本传递的所有参数
$@与$*相同,但在使用时加引号,每个引号中返回每个参数
$$脚本运行当前的进程号
$?显示最后命令的退出状态,0表示没有错误,return的返回值也可以由它获取
$!后台运行最后一个进程的ID

$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数);

注意:脚本的函数使用参数也参考上述规则。

其他操作
#读取外部输入,执行到该步时,脚本会停止执行等待外部输入
read arg(脚本读取外部输入并赋值到变量arg中)

#文件引入,引入文件后可以使用其变量、函数等,两种方法
. file_path/file_name
source file_path/file_name

#使用\来长句换行
/mysql/bin/mysql \
-h host -p 000 \
-u xxx

#printf函数格式输出%s%d%c%f,-表示左对齐,10表示宽度,0.2表示小数保留位
print "-10s %-8s %-4.2f\n" 郭靖 男 66.123

#退出脚本
exit num
调试

(1)检查sh脚本是否有语法错误 -n
   bash -n script_name.sh
(2)执行并调试脚本 -x
   bash -x script_name.sh

awk

awk ‘条件类型1{} 条件类型2{}…’ filename

案例分析:
root pts/1 192.168.1.100 Tue Feb 10 11:21 still logged in
root pts/1 192.168.1.100 Tue Feb 10 00:46 - 02:28 (01:41)
root pts/1 192.168.1.100 Mon Feb 9 11:41 - 18:30 (06:48)
dmtsai pts/1 192.168.1.100 Mon Feb 9 11:41 - 11:41 (00:00)
root tty1 Fri Sep 5 14:09 - 14:10 (00:01)

last -n 5 | awk ‘{print $1 “\t” $3}’
root 192.168.1.100
root 192.168.1.100
root 192.168.1.100
dmtsai 192.168.1.100
root Fri

awk的使用流程:
读入一行数据,并将第一行填入$1 $2 $3…等数据中 --$0表示整行数据
内建变量:
NF每一行的栏的总数
NR目前的行数
FS目前的分隔符

列出第三栏小于10的数据,并且以冒号为分隔符
awk ‘{FS=":"} $3<10 {print $1 “\t” $3}’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值