当前位置: 首页 > article >正文

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 个参数。

参数说明
$nn是数字,$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


http://www.kler.cn/news/294367.html

相关文章:

  • MapSet之二叉搜索树
  • 1-7 掩膜的运用 opencv树莓派4B 入门系列笔记
  • 力扣239题详解:滑动窗口最大值的多种解法与模拟面试问答
  • GNN会议期刊汇总(人工智能、机器学习、深度学习、数据挖掘)
  • kubernetes--配置与存储(ConfigMap、加密数据配置Secret、SubPath、热更新、Volumes、NFS挂载、PV与PVC)
  • C#基础(5)交错数组*
  • 【Rust光年纪】Rust 机器人学库全景:功能、安装与API概览
  • 多线程篇(阻塞队列- BlockingQueue)(持续更新迭代)
  • 不同vlan之间的通信方法
  • 微信小程序仿微信聊天界面
  • 【spring】does not have member field ‘com.sun.tools.javac.tree.JCTree qualid
  • 【网络安全】密码学概述
  • 『功能项目』更换URP场景【32】
  • 【BUUCTF】HardSQL
  • 交换两个变量数值的3种方法
  • 创建Hive表后,查看表结构发现中文注释乱码
  • 【C++模版初阶】——我与C++的不解之缘(七)
  • Maven使用指南的笔记
  • 笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历
  • uniapp使用uni-popup做底部弹出选项(vue3)
  • R语言中rds 文件是什么,都保存了什么数据,详解
  • 宠物浮毛对身体危害竟这么大?再不预防就来不及了
  • Selenium4.0详细介绍
  • 龙芯+FreeRTOS+LVGL实战笔记(新)——05部署主按钮
  • 从零开始,认识游戏设计师(4)体验源于设计师②
  • 数据结构----链表
  • C# 特性与属性的区别
  • iOS 中,用户点击一个按钮到响应的全部流程
  • 【网络安全】服务基础第二阶段——第二节:Linux系统管理基础----Linux统计,高阶命令
  • 利用Spring Boot打造图书个性化推荐平台