shell编程,加上案例相信这更好懂

14 篇文章 0 订阅

shell简介

shell十一个命令行解释器,为用户提供了向linux内核发送请求以便运行程序的界面系统程序,用户可以用shell来启动、挂起、停止甚至编写程序。

外层应用程序
shell命令解释器
linux内核
硬件

shell脚本要求

格式要求

#!/bin/bash开头,指定shell解释器; 这里指定了bash

权限要求

执行shell脚本,一般给脚本添加执行权限,两种增加权限方式:

sudo chmod +x xxx.sh
sudo chmod 777 xxx.sh
执行方式

两种执行方式:

./xxx.sh
sh xxx.sh  # 没有执行权限也可执行
注释方法
# 单行注释

:<<!
多行注释
注释内容
!

shell变量

系统变量

系统预先定义的,可以直接使用,如:$HOME, $PWD, $SHELL, $USER
使用 set 命令可以查看当前shell中所有变量

自定义变量

通过 变量名=值 定义变量, 使用 unset 可以撤销变量; readonly 声明静态变量,该类型不可 unset。例子:

#!/bin/bash

readonly GREET="hello word"
NAME="Zachary"
echo $GREET
echo ${NAME}
unset NAME
echo $NAME
  • 变量名可由字母、数字、下划线组成,不能以数字开头
  • = 两侧不能有空格
  • 变量一般使用大写方式
  • 调用变量时,需要使用 $符号或者${}

可以将执行指令的结果赋值给变量,例子:

#!/bin/bash

RESULT1=`ls -l /home`
RESULT2=$(ls -l /home)
echo $RESULT1
echo $RESULT2
  • 两种方式,推荐使用第二种 RESULT=$(ls -l /home)

位置参数变量

我们可以获取命令行输入的参数,
Sn : n是数字,$0表示命令本身,从$1~$9, 表述命令行输入的第一到第九个参数,第十个及以上要使用{}, 如 ${10}
S* : 所有参数,但看作一个整体
S@ : 所有参数,但区分个体
S# : 所有参数个数

预定义变量

shell设计者已经定义好的,可以直接使用,
$$: 当前进程号(PID)
$!: 后台运行的最后一个进程号(PID)
$?: 最后一次执行命令的返回状态, 0 表示正确执行,否则错误执行

shell运算

操作:加、减、乘、除、模; 运算符号+-*/%
形式$((运算式))$[运算式]expr a - b, 例子:

#!/bin/bash

RESULT1=$(((1+2)*3))
RESULT2=$[(1+2)*3]
TEMP=`expr 1 + 2`
RESULT3=`expr $TEMP \* 3`
echo $RESULT1
echo $RESULT2
echo $RESULT3
  • expr 方式中运算符两侧要有空格,整个元算式需要反引号包裹
  • 推荐使用 $[运算式] 方式

读取控制台输入

基本语法:read 选项 参数
-p 指定读取时的提示符
-t 指定读取等待时间,时间内未输入则不再等待输入

#!/bin/bash

read -t 10 -p "请输入:" A
echo $A

shell 数组

一对括号表示是数组,数组元素用空格符号分割开。如:a=(1 2 3 4 5)

获取:用${#数组名[@或*]}可以得到数组长度; 用${数组名[下标]}可以得到指定下标的值,下标是从0开始; 用${数组名[@或*]} 可以得到整个数组内容

###### 获取 ######
echo ${#a[@]}
echo ${#a[*]}
echo ${a[2]}
echo ${a[@]}
echo ${a[*]}

赋值:直接通过 数组名[下标]=值就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素

###### 赋值 ######
a[1]=100

删除unset 数组[下标]可以清除相应的元素,不带下标,清除整个数据。

###### 删除 ######
unset a[1]
# unset 数组[下标] 不带下标,清除整个数据。
unset a

截取:截取数组 ${数组名[@或*]:起始位置:长度}返回字符串,中间用“空格”分开; 如果加上”()”,将得到切片数组。

###### 截取 ######
echo ${a[@]:0:3}
# 如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。
c=(${a[@]:1:4})

替换${数组名[@或*]/查找字符/替换字符}该操作不会改变原先数组内容。

###### 替换 ######
echo ${a[@]/3/100}
echo ${a[@]}
# 如果需要需求,重新赋值给变量a
a=(${a[@]/3/100})
echo ${a[@]}

条件判断

形式 [ condition ]

条件语句与[]之间要有空格,[]内是空返回false

常用判断条件

字符串类型
=等于
!=不等于
-z 字符串字符串的长度为零则为真
-n 字符串字符串的长度不为零则为真
整数类型
-lt小于
-le小于等于
-gt大于
-ge大于等于
-eq等于
-ne不等于
文件权限
-r有可读权限
-w有可写权限
-x有可执行权限
文件类型
-e是否文件存在
-f是否是普通文件
-d是否是目录

流程控制

if判断

if [ condition ];then
	content
fi
if [ condition ]
then
	content
	elif [ condition ]
	then
		content
else
	content
fi

推荐使用第二种

例子:

#!/bin/bash

# 提示用户输入年份后判断该年是否为闰年
# 能被4整除并且并不能被100整除的年份是闰年
# 能被400整除的年份也是闰年
read -p "请输入一个年份:" YEAR
 
if [ "$YEAR" = "" ];then
    echo "没有输入年份"
    exit
fi
#使用正则测试变量 year 中是否包含大小写字母
if [[ "$YEAR" =~ [a‐Z] ]];then
    echo "你输入的不是数字"
    exit
fi
# 判断是否为闰年
if [ $[YEAR % 4] -eq 0 ] && [ $[YEAR % 100] -ne 0 ];then
    echo "$YEAR年是闰年"  
elif [ $[YEAR % 400] -eq 0 ];then
    echo "$YEAR年是闰年"
else
    echo "$YEAR年不是闰年"
fi

case语句

case $variable_name in
"value")  # 传入值与value相等执行content的语句
	content
	;;
"value")
	content
	;;
esac

例子:

#!/bin/bash

# 判断用户输入的数据类型(字母、数字或其他) 
read -p "请输入一个字符:" KEY
case "$KEY" in
[a‐z]|[A‐Z])
        echo "字母" 
        ;;
[0‐9])
        echo "数字" 
        ;;
*)
        echo "空格、功能键或其他控制字符"
esac

for循环

for 变量 in value1 value2 value3 ...
do
	content
done
for ((初始值;循环控制条件;变量变化))
do
	content
done

例子:

#!/bin/bash

# 打印国际象棋棋盘
# 设置两个变量,i 和 j,一个代表行,一个代表列,国际象棋为 8*8 棋盘
# i=1 是代表准备打印第一行棋盘,第 1 行棋盘有灰色和蓝色间隔输出,总共为 8 列
# i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
# 棋盘的规律是 i+j 如果是偶数,就打印蓝色色块,如果是奇数就打印灰色色块
# 使用 echo ‐ne 打印色块,并且打印完成色块后不自动换行,在同一行继续输出其他色块
for i in {1..8}
do
  	for j in {1..8}
  	do
  		sum=$[i+j]
		if [  $[sum%2] -eq 0 ];then
 			echo -ne "\033[46m  \033[0m"
		else
			echo -ne "\033[47m  \033[0m"
		fi
  	done
  	echo
done
#!/bin/bash

# 对 100 以内的所有正整数相加求和(1+2+3+4...+100)
SUM=0
for i in `seq 100`
do
  	SUM=$[SUM+i]
done
echo "总和是:$SUM"

while循环

while [ condition]
do
	content
done

例子:

#!/bin/bash

# 读取用户输入的账户名称,将账户名写入到数组保存 
# 定义数组名称为 name,数组的下标为 i,小标从 0 开始,每输入一个账户名,下标加 1,继续存下一个账户
# 最后,输入 over,脚本输出总结性信息后脚本退出
i=0
while :
do
	read -p "请输入账户名,输入 over 结束:" KEY
	if [ $KEY == "over" ];then 
		break
  	else
		NAME[$i]=$KEY
		let i++
  	fi
done
echo "总账户名数量:${#NAME[*]}"
echo "${NAME[@]}"

函数

系统函数

basename

自定义函数

function func_name(){
	content
	return ...
}
func_name param1 param2 ...

function 关键字可以不写,但推荐写; 可以没有return

例子:

#!/bin/bash
 
# 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
# 猜小了或猜大了,直至用户猜对脚本结束。
# RANDOM 为系统自带的系统变量,值为 0‐32767的随机数
# 使用取余算法将随机数变为 1‐100 的随机数
function guess(){
        num=$[RANDOM%100+1]
        echo "$num"
         
        while  :
        do
                read -p "计算机生成了一个 1‐100 的随机数,你猜: " cai
            if [ $cai -eq $num ]
            then
                echo "恭喜,猜对了"
                exit
                elif [ $cai -gt $num ]
                then
                        echo "猜大了"
                else
                        echo "猜小了"
                fi
        done
}
guess

暂时这么多笔记

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值