Linux shell脚本

本文详细介绍了Shell脚本的基本概念,包括脚本解释器、变量定义、执行权限、路径执行、参数传递、逻辑运算、条件语句、循环结构、函数定义及调试方法。通过实例展示了如何使用这些要素编写和调试Shell脚本。
摘要由CSDN通过智能技术生成

shell脚本本质上就是文件,文件里放的就是各种命令,而命令如何被解析就需要在脚本开头写一个脚本解释器。

在root主目录下创建shell目录,在shell目录下创建一个hello.sh文件,文件内容如下:
#! /bin/bash
输出hello world
echo "hello world!"
其中:
第一行:#!开头,指定脚本的运行环境
第二行:#开头,养成良好的注释习惯,一般说明脚本功能、作者、修改历史等等
echo,把其参数传递给标准输出。
执行脚本需要hello.sh文件有执行权限,设置hello.sh文件的执行权限
chmod x hello.sh
相对路径运行
./hello.sh
绝对路径运行
/root/shell/hello.sh
也可以通过sh命令执行:sh hello.sh
.sh结尾的文件是可执行文件

1. 变量的定义

#! /bin/bash
# 将一个变量赋给str
str="monday"
echo "today is: $str"
echo ${str}

例1:
lucky=good
echo "you are my ${lucky}friend"
you are my goodfriend
例2:
#!/bin/bash
str="money"
echo "今天一共消费的${str}是1元"
echo ${str}

其中:
(1) 变量名首字符必须为字母,名字只能用字母、数字、下划线、不要用bash关键字。非法的名字:8var、var-8
(2) 变量定义或赋值时,变量名与值之间用等号连接:变量名=值,等号两边不能有空格,值中有空格或特殊字符需要用双引号或单引号引起来。
(3) 使用 $变量名 或 ${变量名} 形式获取变量值,这两种方式没有什么区别,但推荐用${}方式

2. shell脚本调试

命令格式:sh -x shell脚本名称
功能: 将脚本的每个步骤都执行一遍并输出到屏幕,利于调试代码。
vim s1.sh
#! /bin/bash
# 将一个变量赋给str
str="monday"
echo "Today is: ${str}"
echo ${str}
~
"s1.sh" [新] 6L,87c 已写入
# 调试脚本:正常执行
sh -x s1.sh
+ str=monday
+ echo 'Today is:monday'
Today is:monday
+ echo monday
monday
# +表示执行的每一个步骤,即调试过程

3. 向脚本传递参数

1. 变量替换:
美元符号$,如果想输出$符号,则要用"\"进行转义
#!/bin/bash
str="100"
echo "人名币: ¥${str}"
echo "美元: \$ ${str}"

2. 位置变量
想要给脚本中传递参数,在脚本中接收参数可以使用$1....$n的方式
例:
#!/bin/bash
# $0:脚本的名称
echo \$0:$0
# $1:第1个入参
echo \$1:$1
# $4:第4个入参
echo \$4:$4
# $#:脚本入参个数
echo \$#:$#
# $*:所有参数组成一个字符串
echo \$*:$*
# $@:每个位置参数是一个字符串
echo \$@:$@
# $?:上个命令的返回值,0:执行成功;非0:执行失败
echo \$?:$?
# $$:当前进程id
echo \$$::$$
# 命令执行失败
cho "baga"
# 返回非0
echo \$?:$?

4. bush引号规则

(1) 单引号'':单引号里面所有字符都是普通字符
(2) 双引号"":双引号会保留变量特性,用值替换
(3) 倒引号``:位于Esc键下方,用倒引号括起一个命令时,这个命令将会被执行,执行后的结果作为这个表达式的值。

vim s4.sh
#! /bin/bash
name=haha
# 全是普通字符串
echo '$name'
# name可替换
echo "$name"
# 将date命令的结果输出
echo `date`

5. 数组的定义以及使用 

1. 常量列表的方式
# 括号内的元素用空格分隔
arr1=("a1" "b1" "c1")
2. declare命令定义数组
# 定义数据arr2,并初始化元素
declare -a arr2=("a2" "b2" "c2")
# 先定义,后给元素赋值
declare -a arr3
arr3[0]="a3"
arr3[1]="b3"
arr3[2]="c3"
获取数组长度
echo ${#arr1[*]}或者echo ${#arr1[@]}
获取数组元素
echo ${arr1[1]}
给数组中元素赋值
arr3[3]='f3'
echo ${srr3[3]}
删除数组中的元素
unset arr1[0]
echo ${arr1[0]}
删除变量
name="shangzs"
unset name
echo $name

6. 运算符

(1) 比较运算符

  • 数字比较
运算符说明示例
-eq等于[ 1 -eq 1 ] && echo 'ok'
-ne不等于[ 1 -ne 2 ] && echo 'ok'
-lt小于[ 1 -lt 2 ] && echo 'ok'
-gt大于[ 1 -gt 0 ] && echo 'ok'
-le小于等于[ 1 -le 1 ] && echo 'ok'
-ge大于等于[ 1 -ge 1 ] && echo 'ok'
注:[]内部写的时候要用空格隔开
[ 1 -eq 1 ] && echo "ok"
[ 1 -gt 5 ] && echo "ok"
[ 1 -ne 5 ] && echo "ok"
# 变量替换也可以
a=1
[ $a -lt 2 ] && echo 'ok'
  • 字符串比较
运算符说明示例
==比较两个字符串是否相等,相等返回true[ "aaa"="aaa" ] && echo 'ok'
!=比较两个字符串是否不相等,不相等返回true[ "aaa"!="bbb" ] && echo 'ok'
[ "aaa" == "aaa" ] && echo "ok"
[ "aaa" != "AAA" ] && echo "ok"
str=aaa
[ "${str}x" == "x" ] && echo "ok"

(2) 逻辑运算符

运算符说明示例
!非运算[ ! 2 -lt 1 ] && echo 'ok'
-o或运算 [ 1 -eq 1 -o 1 -eq 2 ] && echo 'ok'
-a与运算[ 1 -eq 1 -a 2 -eq 2 ] && echo 'ok'
&&短路与运算,在[]表达式内不能用,在[]表达式间可用[ 1 -eq 1 -a 2 -eq 2 ] && echo 'ok'
||短路或运算,在[]表达式内不能用,在[]表达式间可用[ 1 -ne 1 ] || echo 'ok'
[[ 1 -lt 2 && 5 -gt 3 ]] && echo "ok"
短路与和短路或在[]中判断的话,[]需要写两个

(3) 文件操作运算符

-b file : 检测文件是否是块设备文件,如果是,则返回true
-c file : 检测文件是否是字符设备文件,如果是,则返回true
-d file : 检测文件是否是目录,如果是,则返回true
-f file : 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回true
-r file : 检测文件是否可读,如果是,则返回true
-w file : 检测文件是否可写,如果是,则返回true
-x file : 检测文件是否可执行,如果是,则返回true
-s file : 检测文件是否为空(文件大小是否大于0),不为空则返回true
-e file : 检测文件(包括目录)是否存在,如果是,则返回true
例:
[ -f aaa ] && echo 'ok'
可以写绝对路径也可以写相对路径
[ -f /etc/sudoers ] && echo "ok"

[ -r demo ] && echo 'ok'
三组中只要有一个可读就返回ok

7. if分支语句

语法:
if 条件表达式1 ; then
    表达式1true时执行这里
elif 条件表达式2 ; then
    表达式2true时执行这里 
elif 条件表达式3 ; then
    表达式3true时执行这里 
else
    都不成立时,执行这里
fi

例:
#! /bin/bash
# 脚本表达式
# 定义一个变量叫str,通过脚本传参的方式$1,第一个参数会赋值给str变量
# 需要加空格,变量和等号之间
str=$1
if [ $str == "start" ];then
 echo "这是启动操作"
elif [ $str == "stop" ];then
 echo "这是停止操作"
else [ $str == "restart" ];then
 echo "这是重启操作"
else 
 echo "这是胡乱操作"
fi 
./s.sh stop
./s.sh restart

8. case模式匹配

语法:
case $var in
    模式1)
        代码块1
        ;;
    模式2)
        代码块2
        ;;
    模式3)
        代码块3
        ;;
    *)
        代码块4
        ;;
esac

示例:
#!/bin/bash
str=$1
case $str in
"start") echo "这是启动操作"
;;
"stop") echo "这是停止操作"
;;
"restart") echo "这是重启操作"
;;
*) echo "这是瞎操作"
;;
esac
./sa.sh stop
./sa.sh restart

9. for循环

(1) for循环变量in数据列表

语法:
for 循环变量 in 数据列表
do 
    循环体代码段
done
其中:这里的数据列表是一系列以空格分隔的值,shell每次从这个列表中取出一个值,然后运行do/done之间的命令。
示例:打印循环1到100
#!/bin/bash
for i in {1..100}
do
echo $i
done
chmod +x ab.sh
./ab.sh

示例:输出指定目录(脚本入参)下文档是文件类型的文档
#!/bin/bash
# 获取输入参数
base_path=$*
# 将目录下的列表用括号括起来变成数组
arr=(`ls $base_path`)
# 遍历数组的每个元素(文档)
for i in ${arr[*]}
do
判断是否是文件
if [ -f $i ];then
 echo "$i 是普通文件"
fi
done
调试的方式运行脚本

(2) for (( 控制变量的初始化; 循环的条件; 循环控制变量的更新))

(())可以实现计算
语法:
# 满足条件则循环否则退出
for (( 控制变量的初始化; 循环的条件; 循环控制变量的更新 ))
do 
    循环体代码段
done

示例1:计算从1加到10的结果;统计偶数的个数
#!/bin/bash
# 定义变量
sum=0
count=0
for((i=1;i<=10;i++))
do
    # 求和
    sum=$((sum+i))
    # 统计偶数的个数
    if [ $((i%2)) -eq 0 ];then
        ((count++))
    fi
done
echo sum:${sum},count:${count}
注:两个数值相加的三种方式(推荐使用第一种):
echo $((a+b))
echo $[a+$b]
echo `expr $a + $b`

示例2:打印99乘法表
vim 99.sh
#!/bin/bash
for i in {1..9};do
 for y in {1..9};do
    if [ $y -le $i ];then
     # -n不换行
     echo -n "$y*$i=$((y*i)) " 
    fi
 done
 echo ""
done
chmod +x 99.sh
./99.sh

10. 函数定义

(1) 定义没有返回值的函数

#!/bin/bash
fun(){
    echo "hello student!"
}
echo "-----函数开始执行-----"
fun
echo "-----函数执行完毕-----"
chmod +x demo.sh
./demo.sh
解释性脚本,从上到下依次解释执行,解释性脚本语言

(2) 定义带有返回值的函数

#!/bin/bash
num1=$1
num2=$2
funAndReturn(){
    return $(($num1+$num2))
}
funAndReturn
echo "两个数字之和为: $? !"
# $?是返回上一条执行结果
chmod +x fun.sh
./fun.sh 10 20

参看视频:

【【海牛大数据】Linux教程(装什么虚拟机啊太OUT,直接练起)】https://www.bilibili.com/video/BV1K8411J7qV?p=67&vd_source=24c4af34d5c7196f301016bf3b610c3f

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值