前文初步介绍了shell脚本的基础知识,本章我们将通过引入一些新的知识和例题,学会完成一些简单的shell脚本编写。
在shell脚本中,变量是一个可用于存储或检索值的名称。变量可以是数字、字符串或其他类型的数据。在shell脚本中,变量通常以美元符号($)开头,后跟变量名称。
例 1:
- [root@server ~]# vim test2.sh
- #脚本抬头
- #!/bin/bash
- # 定义变量c
- c="hello world"
- # 定义路径
- bak_dir=/data/backup
- [root@server ~]# bash test2.sh
- hello world
例2:
在shell脚本中,let命令用于执行整数运算,并将结果赋值给变量。可以理解为是一种执行算术运算的快捷方式。
- [root@timeserver ~]# bash test3.sh
- x=123
- let "x=x+1" #let:使shell脚本识别变量,不使用let时x会被识别为字符串
- y=$x
- echo "$y"
- [root@timeserver ~]#
- 124 #不加let 输出为 x+1
- [root@server ~]# a= 3
- bash: 3: command not found...
- [root@server ~]# b =5
- bash: b: command not found...
- [root@server ~]# stu_name=zhang san
- bash: san: command not found...
- [root@server ~]# stu_name="zhang san"
- [root@server ~]# stu_name='zhang san'
查看变量:set
取消环境变量:unset
环境变量是操作系统中一个重要的概念,它用来存储一些在操作系统级别下用到的值,比如路径、用户名、密码等。在Linux系统中,环境变量存储在系统中的一个地方,每个终端都可以访问它们。
一些常用的环境变量包括:
方法 1:export 环境变量=值
方法 2 :变量名=值
export 变量名
方法 3:declare -x 变量名=值
显示当前用户的环境变量:env
概念:当一条命令或脚本执行时,后面可以跟多个参数,可以使用位置变量来表示该参数
- [root@timeserver ~]# vim test3.sh
- echo "第2个位置参数时:$2"
- echo "第1个位置参数时:$1"
- echo "第4个位置参数时:$4"
- echo "所有位置参数时:$*"
- echo "位置参数个数时:$#"
- echo "当前进程的PID值:$$
- [root@timeserver ~]# bash test3.sh 1 2 3 4 5
- 第2个位置参数时:2
- 第1个位置参数时:1
- 第4个位置参数时:4
- 所有位置参数时:1 2 3 4 5
- 位置参数个数时:5
- 当前进程的PID值:36113
常见的位置变量:
$*和$#区别
- [root@server ~]# set -- I am test command
- [root@server ~]# for i in "$@"; do echo $i; done
- I
- am5
- test
- command
- [root@server ~]# for i in "$*"; do echo $i; done
- I am test command
概述:
- -p “提示语句:” 屏幕打印出一行提示语句。
- -n数字:当输入的字符数目达到预定数目时,自动退出,并将输入的数据赋值给变量,如:-n1 , 只要接受到
- 一个字符就退出。只要按下一个字符进行回答,read命令立即接受输入并将其传给变量。无需按回车键
- -t 等待时间 :计时输入,使用read命令存在着潜在危险。脚本很可能会停下来一直等待用户的输入。如果
- 无论是否输入数据脚本都必须继续执行,那么可以使用-t选项指定一个计时器。-t选项指定read命令等
- 待输入的秒数。当计时满时,read命令返回一个非零退出状态
- -s :关闭回显,使read命令中输入的数据不显示在监视器上(实际上,数据是显示的,只是read命令将文本颜
- 色设置成与背景相同的颜色)常用格式:
- read 变量名
- read -p "提示信息:" 变量名
例1:
- [root@server ~]# read -p "Enter Numbers: " num
- Enter Numbers: 9527
- [root@server ~]# echo $num
- 9527
- [root@server ~]# read -t 3 n1 # 不要输入内容,等待3秒后自动结束输入
- [root@server ~]# read -s -p "Enter your password: " passw
- Enter your password: [root@server ~]# echo $passw
- 123456
- [root@server ~]# echo $REPLY
- [root@server ~]# read
- 100
- [root@server ~]# echo $REPLY # 当输入时没有指定变量接收,会默认存储到REPLY变量中
- 100
- # 一次性输入多个变量的值
- [root@server ~]# read t1 t2
- 12 35
- [root@server ~]# echo $t1 $t2
- 12 35
面试题总结四种复制方法:
- 1.直接赋值:name="li si"
- 2.read命令: read name
- 3.使用位置参数($1 $2 $3…) : name=$1
- 4.命令输入:name=$(whoami)
或者$()):在反引号或反撇号中的内容将被视为命令,该命令将被执行并返回其输出。该输出将被替换为反引号或反撇号中的内容。全局变量:
全局变量指的是在整个脚本中都可访问的变量。这些变量可以在脚本的任何位置进行声明和赋值,并且可以在整个脚本的任何地方使用。
- [root@server ~]# vim test5.sh
- #!/bin/bash
- func() # 定义函数 1
- {
- echo "$v1"
- v1=200
- } 2
- v1=100
- func #调用函数 3
- echo "$v1" 4
- [root@server ~]# bash test5.sh
- 100
- 200
- #程序执行顺序:1-2之间为函数,首先装入内存,不调用,首先执行v1=100 接着调用函数
- #当函数被调用后:首先执行echo "$v1" 输出V1 由于函数内部没有定义V1 则到函数外部
- #查找V1=100 输出100 接着执行V1=200,此时函数执行结束,接着执行echo "$v1" 输出200
局部变量:范围更小,仅限于某个程序段中,如:函数、shell等,通过local关键字定义
- # 上例修改
- [root@server ~]# vim test5.sh
- #!/bin/bash
- func() # 定义函数
- {
- local v3=200 # 使用local关键字声明为局部变量
- }
- func
- echo "$v3"
- [root@server ~]# bash test5.sh
-
- #没有内容

例 1:
- [root@server ~]# expr 1 + 1 # 注意+左右必须要有空格
- 2
- [root@server ~]# expr 1+1 # 否则原样显示
- 1+1
- [root@server ~]# a=1
- [root@server ~]# b=2
- [root@server ~]# expr $a + $b # 支持变量
- 3
- [root@server ~]# let num=1+2 # let+echo 等价于expr
- [root@server ~]# echo $num
- 3
- [root@server ~]# let num=1 + 2 # 注意let中运算符左右不能由空格
- -bash: let: +:语法错误: 需要操作数 (错误符号是 "+")
- [root@server ~]# echo $((1+2))
- 3
- [root@server ~]# echo $((5%3))
- 2
- [root@server ~]# echo $((3%5))
- 3
- [root@server ~]# echo $((1-5))
- -4
- [root@server ~]# echo $((2 * 5)) # 可以有空格
- 10
- [root@server ~]# echo $((5.2-5)) # 只支持整数运算
- -bash: 5.2-5:语法错误: 无效的算术运算符 (错误符号是 ".2-5")
- [root@server ~]# echo $[2+3] # [] 等价于 (())
- 5
- [root@server ~]# echo $[2.5+3] # # 只支持整数运算
- -bash: 2.5+3:语法错误: 无效的算术运算符 (错误符号是 ".5+3")
- [root@server ~]# bc
- bc 1.07.1
- Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006, 2008, 2012-2017 Free Software
- Foundation, Inc.
- This is free software with ABSOLUTELY NO WARRANTY.
- For details type `warranty'.
- 1.1+2
- 3.1
- 2.5-3.9
- -1.4
- 1.5>4
- 0
- 5>3
- 1
- quit # 退出交互模式
- # 不进入交互模式直接使用,bc需要放在最后
- [root@server ~]# echo "scale=3;11/3" | bc
- 3.66
例 2:
- # 返回变量长度
- [root@server ~]# str1="hello world"
- [root@server ~]# echo ${#str1}
- 11
- # 变量截取
- [root@server ~]# echo ${str1:0:3} # 从左边第1个字符开始截取3个
- hel
- [root@server ~]# echo ${str1::3} # 可以省略起始0
- hel
- [root@server ~]# echo ${str1:1} # 从下标1开始截取到尾部
- ello world
- [root@server ~]# echo ${str1:0-1:1} # 从右边第一个字符开始截取1个,左边第一个为0,右边第
- 一个为0-1
- d
- [root@server ~]# echo ${str1:0-5} # 从右边第5个开始截取到尾部
- world
- [root@server ~]# echo ${str1: -5} # 使用空格替代0,同上
- world
- [root@server ~]# echo ${str1:-5} # 没有空格表示提取整串
- hello world
-