Shell笔记

这篇博客详细介绍了Shell脚本中的变量用法,包括变量的命名规则、使用规则和分类,如局部变量、环境变量和位置参数变量。讲解了如何设置、调用、赋值、叠加和删除变量,以及read命令的使用。此外,还讨论了算术运算、字符串操作、数组定义和读取,以及test命令和条件控制语句(如if和case)的应用。
摘要由CSDN通过智能技术生成

1、shell中的变量用法

1.1、变量的命名规则

- 命名只能使用英文字母,数字和下划线。首个字符不能以数字开头
- 字母习惯使用大写
- 中间不能有空格
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)

1.2、变量的使用规则

- 直接定义变量名称,没有类型需要强调(类似于数学中:x=1,y=2,z=x+y)
- 赋值时,"="前后不能有空格
- 命令的执行结果赋值给变量时,使用反单引号 如:TIME=`date`
- 调用变量时,必须使用$ 格式: $变量名 或 ${变量名}

1.3、变量分类

Shell中的变量可以分为三种变量:局部变量,环境变量,特殊变量。可以通过set命令查看系统中存在的所有变量

局部变量:也就是用户自定义的变量,在脚本中或命令中定义
环境变量:保存和系统操作环境相关的数据。$HOME、$PWD、$SHELL、$USER等等
特殊变量:
一种是位置参数变量:主要用来向脚本中传递参数或数据,变量名不能自定义,变量作用固
定。
一种是预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定
的。
1.3.1、局部变量的常用操作

用户自定义的变量由字母或下划线开头,由字母,数字或下划线序列组成,并且大小写字母意义不同,变量名长度没有限制。

注意点:用户自定义的变量,作用域为当前的shell环境。仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

例子:

eg: [root@master ~]# echo '#!/bin/bash' > test.sh
eg: [root@master ~]# A=22
eg: [root@master ~]# echo 'echo $A' >> test.sh
eg: [root@master ~]# echo $A 结果:22
eg: [root@master ~]# bash test.sh 结果:打印为空,因为bash会开启新的shell进
程
设置变量

习惯上用大写字母来命名变量。变量名以字母表示的字符开头,不能用数字。

变量调用

在使用变量时,要在变量名前加上前缀“$”

使用echo 命令查看变量值
echo $A
变量赋值
1、定义时赋值
	变量=值
	注:等号两侧不能有空格
	例:STR="hello world"
		A=9
2、将一个命令的执行结果赋给变量
	A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
	A=$(ls -la) 等价于反引号
	AA=$((4+5))
	BB=`expr 4 + 5 `
3、将一个变量赋给另一个变量
	A=$STR
变量叠加
eg: [root@master ~]# A=123
eg: [root@master ~]# C="$A"456
eg: [root@master ~]# D=${A}789
单引号和双引号的区别
现象:单引号里的内容会全部输出,而双引号里的内容会有变化
原因:单引号会将所有特殊字符脱意
eg:
[root@master ~]# NUM=10
[root@master ~]# SUM="$NUM hehe"
[root@master ~]# echo $SUM 输出10 hehe
[root@master ~]# SUM2='$NUM hehe'
[root@master ~]# echo $SUM2 输出$NUM hehe
列出所有的变量
[root@master ~]# set
删除变量
eg: [root@master ~]# unset A 撤销变量 A
eg: [root@master ~]# readonly B=2 声明静态的变量 B=2 ,不能 unset
eg: [root@master ~]# unset B
报错: -bash: unset: B: cannot unset: readonly variable
1.3.2、环境变量
用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和其所有子shell中生效。

如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。

作用域: 当前shell以及所有的子shell

声明变量: export 变量名=变量值

定义环境变量的常见配置文件如下:
/etc/profile 针对系统所有用户生效,此文件应用于所有用户每次登陆系统时的环境变量定义
$HOME/.bash_profile 针对特定用户生效,$HOME为用户的宿主目录,当用户登陆系统后,
首先继承/etc/profile文件中的定义,再应用$HOME/.bash_profile文件中的定义,后面的优先
级高于前面的
1.3.3、位置参数变量
$说明
$n | n为数字,$0代表命令本身,$1-$9代表第一到第9个参数, 十以上的参数需要用大括号包含,如${10}。

$* | 代表命令行中所有的参数,把所有的参数看成一个整体。以"$1 $2 … $n"的形式输出所有参数

$@ | 代表命令行中的所有参数,把每个参数区分对待。以"$1" "$2" … "$n" 的形式输出所有参数

$# | 参数的个数
$* 和 $@的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以"$1" "$2" …"$n" 的形式输出所有参数

当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数
1.3.4、预定义变量
$? 执行上一个命令的返回值 执行成功,返回0,执行失败,返回非0(具体数字由命令决定)

$$ 当前进程的进程号(PID),即当前脚本执行时生成的进程号

$! 后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程 &

1.4、read命令

read [选项] 值

read -p(提示语句) -n(字符个数) -t(等待时间,单位为秒) –s(隐藏输入)

[root@master ~]# read -t 30 -p "please input your name:" NAME

[root@master ~]# echo $NAME

[root@master ~]# read -s -p "please input your age :" AGE

[root@master ~]# echo $AGE 注意:如果隐藏输入,这里的结果是看不到的

[root@master ~]# read -n 1 -p "please input your sex [M/F]:" GENDER

[root@master ~]# echo $GENDER

**注:**1.在输入时,如果输错了要删除要执行control+delete
2.符号不要输入中文
3.NAME与"之间要有空格

1.5、运算

expr指令

作用:对整数型变量进行算术运算

(注意:运算符前后必须要有空格)

格式 :expr m + n 或$((m+n)) 注意expr与运算符和变量间要有空格
sum=$((m+n)) 中=与$之间没有空格

[root@master ~]# expr 3 + 5
[root@master ~]# expr 3 – 5
[root@master ~]# echo `expr 10 / 3`
10/3的结果为3,因为是取整
[root@master ~]# expr 3 \* 10
\ 是转义符

例子:

计算(2 +3 )×4 的值

1、分步计算
	[root@master ~]# S=`expr 2 + 3`
	[root@master ~]# expr $S \* 4
2、一步完成计算
	[root@master ~]# expr `expr 2 + 3` \* 4
	[root@master ~]# S=`expr \` expr 2 + 3 \` \* 4`
	[root@master ~]# echo $S
或
	[root@master ~]# echo $(((2 + 3) * 4))
( ) 与 ()与 (){}区别
$( )的用途和反引号``一样,用来表示优先执行的命令[root@master ~]# echo $(ls /root)

${ } 就是取变量了
[root@master ~]# echo ${PATH}

$((运算内容)) 适用于数值运算
[root@master ~]# echo $((3+1*4))

1.6、字符串

字符串的基本用法
- 字符串不能单独出现,必须要配合变量。
- 字符串可以使用单引号[' '],也可以使用双引号[""],也可以不用引号
- 单引号内的任何字符没有任何意义,都会原样输出
- 单引号内使用变量是无效的,单引号内不能出现单引号
- 双引号内可以使用变量
- 双引号内可以使用转义字符
- 在字符串拼接操作时,我们可以进行无缝拼接,或者是在双引号里使用变量
取字符串的长度
可以使用${#variable} 或者 expr length "${variable}"。因为expr是指令,所以别忘记使用反单引号``或者是$()

例子如下:
[root@master ~]# vim test.sh

#!/bin/bash
var='welcome to china'
length1=${#var}
length2=$(expr length "${var}") 注:$()写法
length3=`expr length "$var"` 注:反单引号写法

1.7、shell数组

Array的定义
定义格式: variable=(值1 值2 … 值n)
注意:元素之间除了使用空格作为分隔符,还可以使用换行符。

或者

name[0]=值1
name[1]=值2
…
name[n]=值n
读取Array操作
${variable[index]}: 读取index索引上的元素
${variable[*]}或者${variable[@]}:读取所有元素
${#variable[*]}或者${#variable[@]} : 读取数组的长度

案例:

[root@master ~]# vim test3.sh
#!/bin/bash
citys=(cc sh bj sd hlj)
hobby[0]=book
hobby[1]=film
hobby[2]=music
echo ${citys[0]} 注:输出cc
echo ${hobby[*]} 注:输出book film music
echo ${#hobby[@]} 注:输出3

[root@master ~]# bash test3.sh

1.8、test测试命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHhFG3x2-1631062907144)(Shell笔记.assets/1631030482125.png)]

注:

通常test命令不单独使用,而是与if语句连用,或者是放在循环结构中。
判断符号[] ,除了好用的test外,我们还可以使用中括号来进行检测条件是否成立

1.9、条件控制语句

1.9.1、if条件语句-单分支

if/else命令

单分支if条件语句

if [ 条件判断式 ]
then
	程序
f

或者

if [ 条件判断式 ] ; then
	程序
fi

例子:

#!/bin/bash
A=$1
if [ $A == "stop" ]
then
	systemctl stop firewalld
fi

**注意点:**单分支条件语句需要注意几个点

if语句使用fi结尾,和一般语言使用大括号结尾不同

[ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格

then后面跟符号条件之后执行的程序,可以放在[]之后,用";"分割,也可以换行写入,就不需要";"了。

if与中括号之间必须要有空格
1.9.2、if 条件语句-多分支
if [ 条件判断式1]
then
	当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
	当条件判断式2成立时,执行程序2
	...省略更多条件
else
	当所有条件都不成立时,最后执行此程序
fi

例子:

#!/bin/bash
read -p "please input your name:" NAME
echo $NAME
if [ “$NAME” == root ]
then
	echo "hello ${NAME}, welcome !"
elif [ $NAME == tom ]
then
	echo "hello ${NAME}, welcome !"
else
	echo "oh, get out here !"
fi
1.9.3、case

1、case命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。

2、匹配到后则执行跟在后面的命令直到遇到双分号为止(;😉

3、case命令以esac作为终止符

4、case行尾必须为单词 in 每个模式必须以右括号 ) 结束

5、匹配模式中可使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或

6、最后的"*)" 表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行"*)"后的命令序列

例子:

CMD=$1
case $CMD in
start)
	echo "starting"
	;;
stop)
	echo "stoping"
	;;
test)
	echo “I’m testing”
	;;
*)
	echo "Usage: {start|stop} "
	;;
esac

命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。

2、匹配到后则执行跟在后面的命令直到遇到双分号为止(;😉

3、case命令以esac作为终止符

4、case行尾必须为单词 in 每个模式必须以右括号 ) 结束

5、匹配模式中可使用方括号表示一个连续的范围,如[0-9];使用竖杠符号“|”表示或

6、最后的"*)" 表示默认模式,当使用前面的各种模式均无法匹配该变量时,将执行"*)"后的命令序列

例子:

CMD=$1
case $CMD in
start)
	echo "starting"
	;;
stop)
	echo "stoping"
	;;
test)
	echo “I’m testing”
	;;
*)
	echo "Usage: {start|stop} "
	;;
esac
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值