Linux-Shell脚本基础用法

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.删除变量

删除v1变量

unset v1

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 主机名

export 是一个Shell内置命令,用于将变量设置为环境变量,使其在当前Shell及其子Shell中都能被访问。环境变量通常用于配置Shell环境、系统行为、应用程序参数等。

基本语法:

export VARIABLE_NAME=value

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 paramdemo02.sh

#!/bin/bash

echo "参数个数:$#"

echo "所有的参数(作为一个整体):$*"

echo "所有的参数(区分对待每个参数):$@"

root@zking:~#

root@zking:~# chmod 775 paramdemo02.sh

root@zking:~# ./paramdemo02.sh 1 2 3 4 7

参数个数:5

所有的参数(作为一个整体):1 2 3 4 7

所有的参数(区分对待每个参数):1 2 3 4 7

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

空格总结

  1. 定义变量时,=号两边不可以留空格

  2. 使用反引号的时候,运算符两边必须留空格;使用$()的时候,运算符两边不可以留空格

  3. if条件测试语句的时候,[ ]两边要留空格,比较符两边也要留空格

  4. 命令和其之后的参数或对象之间一定要有空格

  5. $后不能有空格

相关推荐
zly35006 分钟前
Linux(centos)安全狗
linux·运维·服务器
星辰云-25 分钟前
Nginx笔记
运维·笔记·nginx
失因1 小时前
Linux 权限管理与 ACL 访问控制
linux·运维·服务器·数据库·centos
悟能不能悟1 小时前
TransportClient详细说一说
运维·jenkins
玖剹2 小时前
Linux文件操作:从C接口到系统调用
linux·服务器·c语言·c++·笔记·ubuntu
Vdeilae2 小时前
IIS 让asp.net core 项目一直运行
java·服务器·asp.net
Lovyk2 小时前
Linux 系统启动原理
linux·服务器·windows
Jewel Q3 小时前
TCP为什么采用三次握手而不是二次握手
服务器·网络·tcp/ip
Sadsvit3 小时前
Linux 服务器性能监控、分析与优化全指南
java·linux·服务器