Shell脚本基本语法(Linux篇)

1.变量定义

变量命名规则:

  • 可以包含字母,数字,下划线,首字母不能用数字开头,中间不能又空格;

  • 为变量赋值等号之间不能为空格;

  • 变量命名不能使用标点符号,不能使用bash的关键字;

  • shell中默认的变量的类型都是字符,就算是数字字符也会被认为是字符串,如果需要进行字符相加,则必须指定变量为数值;

  • 如果定义的变量中没有空格,则定义变量时可以使用单引号或双引号,也可以使用,如:name=zs,如果变量中包含了空格,则必须使用单引号或双引号引起来,如:"Kent Beck"

  • 可以使用命令的结果作为变量的值,但必须使用 `` 或 () 符号,如: d=(ls /etc) 获取etc目录下的所用文件赋给d;

  • 环境变量一般用大写,编程习惯;

变量命令示例:

复制代码
# 以下时合法的变量名
ABC
ROOT__PATH
_var
var2
​
# 以下时非法的变量名
12abc
?abc

1.1.变量赋值

复制代码
# 显示负值
name="zs" #正确
name = "zs" #错误
# 变量的使用
echo $name
echo ${name} #也可以这样写,花括号是可选的
# 使用语句为变量赋值
for f in $(ls /etc) # 将/etc目录下的所有文件循环赋给f变量
for f in `ls /etc` # 这样写也可以
# 变量可以重新定义
name="ww"
echo $name
name="zl"
echo $name

双引号和单引号的区别?

复制代码
root@zking:~# var=1 2 3
2: command not found
root@zking:~# VAR="1 2 3"
root@zking:~# echo $VAR
1 2 3
root@zking:~# VAR='1 2 3'
root@zking:~# echo $VAR
1 2 3
root@zking:~# ^C
root@zking:~# 

在变量赋值时,如果值有空格,Shell 会把空格后面的字符串解释为命令。

看不出什么区别,再举个说明:

复制代码
root@zking:~# N=3
root@zking:~# VAR="1 2 $N"
root@zking:~# echo $VAR
1 2 3

单引号是告诉 Shell 忽略特殊字符,而双引号则解释特殊符号原有的意义,比如$、!。

1.2.只读变量

复制代码
# 定义只读变量,该变量不能修改
name="avdfd"
readonly name
# 运行时会提示该变量是只读变量

1.3.删除变量

复制代码
# 删除name变量
unset name
# set可以查看所有的变量,包括环境变量和用户自定义的变量
set

删除只读

1.4.变量引用

Shell 中所有变量引用使用$符,后跟变量名。

复制代码
root@zking:~# VAR=123
root@zking:~# echo $VAR
123
root@zking:~# VAR+=456
root@zking:~# echo $VAR
123456

还有时候变量名与其他字符串紧碍着,也会误认为是整个变量:

复制代码
root@zking:~# VAR=123
root@zking:~# echo $VAR
123
root@zking:~# echo $VAR456
​
root@zking:~# echo ${VAR}456
123456

将命令结果作为变量值:

复制代码
root@zking:~# VAR=`echo 123`
root@zking:~# echo $VAR
123
root@zking:~# VAR=$(echo 123)
root@zking:~# echo $VAR
123

2.变量类型

  • **自定义变量:**用户自己定义的变量,或者叫作本地变量;

  • **环境变量:**保存和系统操作环境相关的变量,可以添加环境变量;

  • **位置变量:**主要用于向脚本中传递参数或数据,变量名不能自定义,作用固定;

  • **预定义变量:**在Bash中已经定义好的变量,变量的作用也是预先定义好的;

2.1.自定义变量

用户自定义的变量也叫本地变量,只在定义它的当前shell中才也可以使用。

参考变量定义中的变量赋值即可。

2.2.环境变量

在命令行提示符直接执行 env、set 查看系统或环境变量。env显示用户环境变量,set显示Shell预先定义好的变量以及用户变量。可以通过 export 导出成用户变量。

可以理解为环境变量与本地变量的区别就是作用范围不同。

一些写 Shell 脚本时常用的系统变量:

变量 说明
$SHELL 默认 Shell
$HOME 当前用户家目录
$IFS 内部字段分隔符
$LANG 默认语言
$PATH 默认可执行程序路径
$PWD 当前目录
$UID 当前用户 ID
$USER 当前用户
$HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间
$RANDOM 随机生成一个 0 至 32767 的整数
$HOSTNAME 主机名

2.3.位置变量

位置变量指的是函数或脚本后跟的第 n 个参数。

参数 说明
$n n是数字,0表示命令的本身,1-9表示第1到第9个参数,10以上的参数需要用{}括起来,例如${10}
$* 表示命令行中的所有参数,$*把所有参数看成一个整体
$@ 表示命令行中的所用参数,与\*不同的是@把每个参数区分对待,可以将这个整体看作是一个数组,数组中的每个元素都是独立的
$# 代表命令行中所有参数的个数

示例一:

复制代码
root@zking:~# vim paramdemo.sh
​
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
​
# 赋权
root@zking:~# chmod 755 paramdemo.sh 
root@zking:~# ./paramdemo.sh 1 2 3 4
./paramdemo.sh
1
2
3

示例二:

复制代码
root@zking:~# vim paramdemo.sh
​
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
​
# 赋权
root@zking:~# chmod 755 paramdemo.sh 
root@zking:~# ./paramdemo.sh 1 2 3 4
./paramdemo.sh
1
2
3

2.4.预定义变量

参数 说明
$? 最后一次执行命令的返回状态,如值为0则说明成功,如值为非0,则说明命令执行不正确
$$ 当前进程的进程号
$! 后台运行的最后一个进程的进程号

示例一:

复制代码
root@zking:~# ls
a.txt  paramdemo02.sh  paramdemo.sh  snap  workspace
root@zking:~# echo $?
0
root@zking:~# ls /fafaf
ls: cannot access '/fafaf': No such file or directory
root@zking:~# 
root@zking:~# echo $?
2

3.键盘输入

read命令从标准输入读取,并把输入的内容复制给变量。

复制代码
命令:read [选项] [变量名]

参数说明:

选项 说明
-p 提示信息,等待输入时的提示
-t 秒数,用于指定等待的时间,单位时秒
-n 字符数,只要接收到指定的字符数就会执行
-s 隐藏输入的数据,用于机密信息的输入,比如密码

更多参数,请使用read -help查看。

示例一:

复制代码
root@zking:~# vim readdemo.sh
​
#!/bin/bash
read -t 60 -p "请输入账号: " userName
echo "输入的账号是: $userName"
read -s -t 60 -p "请输入密码:" password
echo -e "\n"
echo "输入的密码: $password"
read -n 1 -t 30 -p "请选择[y/n]" select
echo -e "\n"
echo "输入的选择是: $select"
​
root@zking:~# chmod 775 readdemo.sh 
root@zking:~# ./readdemo.sh 
请输入账号: admin
输入的账号是: admin
请输入密码:
​
"输入的密码: 1234"
请选择[y/n]y
​
输入的选择是: y
复制代码

4.数值运算

4.1.为什么数值需要特殊处理

shell中变量默认都是字符型的,不管是其字面值是不是数值,所以当两个变量相加时,默认是字符串拼接的操作,例如:

复制代码
root@zking:~# num1=1
root@zking:~# num2=2
root@zking:~# num3=$num1+$num2
root@zking:~# echo $num3
1+2

4.2.声明变量类型

复制代码
格式: declare [+/-][选项] 变量名

参数说明:

参数 说明
- 给变量设置类型属性
+ 取消变量的类型属性,注意与我们的日常习惯不同
-i 将变量指定为整型
-x 将变量声明为环境变量
-p 显示指定变量被设置的类型

示例一:

复制代码
root@zking:~# num1=1
root@zking:~# num2=2
root@zking:~# num3=$num1+$num2
root@zking:~# echo $num3
1+2
# 此处是数值相加,而不是字符串相加了
root@zking:~# declare -i num4=$num1+$num2
root@zking:~# echo $num4
3

4.3. expr或let数值运算工具

除了 Shell 本身的算数运算表达式,还有几个命令支持复杂的算数运算:

复制代码
root@zking:~# a=1
root@zking:~# b=2
root@zking:~# let c=$a+$b
root@zking:~# echo $c
3
​
# 注意空格问题
root@zking:~# c=$(expr $a+$b)
root@zking:~# echo $c
1+2
root@zking:~# c=$(expr $a + $b)
root@zking:~# echo $c
3

4.4.((表达式))或[表达式]

复制代码
root@zking:~# a=5
root@zking:~# b=6
root@zking:~# c=$((a+b))
root@zking:~# echo $c
11
root@zking:~# b=8
root@zking:~# a=9
root@zking:~# c=$[a+b]
root@zking:~# echo $c
17

5.运算符

优先级 运算符 说明
1 =, +=, -=, *=, /=, %=, &=, ^= 各种赋值
2 && 逻辑与
3 ^ 按位异或
4 & 按位与
5 ==, != 等于,不等于
6 >, <, <=, >= 大于,小于,大于等于,小于等于
7 >>, << 按位左移,按位右移
8 +, - 加,减
9 *, /, % 乘,除,取余
10 !, ~ 逻辑非,按位取反,或补码
11 -,+ 单目,正负运算符

优先级的数值越大,优先级越高,注意和其他语言的数值越低优先级越高不同。

复制代码
root@zking:~# num=$(((15+34)*5/2))
root@zking:~# echo $num
122
root@zking:~# b=$((19%2))
root@zking:~# echo $b
1
root@zking:~# c=$((1&&0))
root@zking:~# echo $c
0
相关推荐
phoenix09811 小时前
Linux入门DAY29
linux·运维
一休哥助手2 小时前
Naive RAG:简单而高效的检索增强生成架构解析与实践指南
运维·人工智能·架构
叔叔别拉了我害怕2 小时前
封装FTPSClient连接ftps服务器
服务器·git·github
入秋2 小时前
Linux服务器安装部署 Nginx、Redis、PostgreSQL、Docker
linux·前端
不甘懦弱2 小时前
阿里云搭建flask服务器
服务器·python·flask
Bi2 小时前
包含多个子项目集成一个项目部署Vercel方法
运维·前端
Mr. Cao code2 小时前
使用Tomcat Clustering和Redis Session Manager实现Session共享
java·linux·运维·redis·缓存·tomcat
zcz16071278212 小时前
Linux 网络命令大全
linux·运维·网络
the sun342 小时前
Reactor设计模式及其在epoll中的应用
linux·运维·服务器·c++
VVVVWeiYee2 小时前
BGP高级特性
运维·服务器·网络