2023-09-07
技术
00
请注意,本文编写于 88 天前,最后修改于 88 天前,其中某些信息可能已经过时。

目录

格式
使用方式
bash或sh + 脚本名运行
给执行权限后直接运行
使用 source 或 . 运行
变量
自定义变量
环境变量
预定义变量
只读变量
赋值
直接赋值
键盘读取赋值
通过命令行参数赋值
利用命令的输出结果赋值
从文件中读取数据赋值
运算符
基本语法
使用expr计算
使用let计算
算数运算符
替删改
替换
删除
修改

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁……

格式

打开文本编辑器(如vi或vim ),创建一个后缀名为sh的文件;开头第一行提示Shell使用的解释器类型,如#!/bin/bash,为保证解析正确建议写上。

例如编写一个名为test.sh的脚本:

bash
#!/bin/bash echo "test" #echo命令用于输出(打印)信息

使用方式

bashsh + 脚本名运行

bash
[kaka@localhost ~]$ cat test.sh a='hello world' echo $a [kaka@localhost ~]$ bash test.sh hello world

给执行权限后直接运行

提示

直接运行前需要为脚本赋予执行权限(chmod +x <脚本的文件名>

bash
[kaka@localhost ~]$ cat test.sh a='hello world' echo $a [kaka@localhost ~]$ ./test.sh bash: ./test.sh: 权限不够 [kaka@localhost ~]$ chmod +x test.sh [kaka@localhost ~]$ ./test.sh hello world

使用 source. 运行

提示

使用source相当于在当前终端运行该脚本,可以看到被赋值的变量显示在当前终端上。

bash
[kaka@localhost ~]$ cat a.sh #!/bin/bash A=5 echo $A [kaka@localhost ~]$ bash a.sh 5 [kaka@localhost ~]$ echo $A [kaka@localhost ~]$ source a.sh 5 [kaka@localhost ~]$ echo $A 5

变量

自定义变量、环境变量、位置变量、预定义变量

变量名要求

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

如何使用

在变量名前加美元符号($)即可

为了帮助解释器识别到变量的边界,可以在变量名外加入花括号({}

自定义变量

相当于局部变量,仅在当前会话中生效

格式:<变量名>=<变量值>,注意等号两边不需要空格

如果变量值存在空格,需要用双引号("")或单引号('')框起来

使用unset <变量名>撤销该自定义变量

环境变量

相当于全局变量,在所有会话中生效

例如/etc/profile文件存储着当前系统的环境变量

预定义变量

也称为特殊变量;这其中一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

变量含义
$n位置变量
n为数字,$0代表该脚本名称
$1代表第1个参数(以此类推),但从第十个开始要用花括号({})包含
$#获取所有输入参数的个数
$*获取命令行的所有参数,并将其视为一个整体
$@获取命令行的所有参数,但将每个参数进行拆分
$?获取最后一次命令执行的状态,正确执行为0,其余输出则不正常

创建一个名为advance.sh的文件,并写入以下内容

shell
#!/bin/bash echo '==========$n==========' echo $0 echo $1 echo $2 echo '==========$#==========' echo $# echo '==========$*==========' for i in "$*"; do echo $i done echo '==========$@==========' for i in "$@"; do echo $i done echo '==========$?==========' echo $?

使用. advance.sh 1 2 3 4 5命令,结果如下

shell
==========$n========== ./advance.sh 1 2 ==========$#========== 5 ==========$*========== 1 2 3 4 5 ==========$@========== 1 2 3 4 5 ==========$?========== 0

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变、不能被撤销

赋值

提示

  • 显示变量的值使用双引号

  • 单引号中是没有变量

  • 反引号(``)等价于 $() ,反引号的Shell命令会被先执行

直接赋值

格式:<变量名>=<变量值>,注意等号两边不需要空格

shell
#!/bin/bash num=10086 #直接赋值 echo $num

键盘读取赋值

格式:read -p ["提示信息"] [变量名],可不带-p ["提示信息"]这个选项和参数

获取输入的单行数据,并赋值给变量名

shell
#!/bin/bash read INPUT #将键盘输入的单行数据赋值给INPUT变量名 echo $INPUT

通过命令行参数赋值

即通过位置变量进行调用

shell
#!/bin/bash echo $1 $2

利用命令的输出结果赋值

在赋值语句中使用反向单引号( ``)

shell
#!/bin/bash DATE=`date +%F` #将当前年月日期(结果)赋值到DATE变量上 echo $DATE

其中date +%F等价于$(date +%F)

从文件中读取数据赋值

这种方式适用于处理大批量的数据,直接把相应的数据写入文件中。这种方式通常是循环一行行读入数据,即每循环一次,就从文件中读入一行数据,知道文件的结尾。

shell
#!/bin/bash ls *.sh > execfile #列举后缀名为sh的文件重定向至execfile while read LINE #使用While循环读取每一行,并赋值到LINE这个变量中 do echo $LINE #输出每行内容 done < execfile

运算符

在bash中,变量的默认均为字符串类型,无法直接进行运算

基本语法

“$((运算式))”“$[运算式]”

bash
[kaka@localhost ~]$ a=10 [kaka@localhost ~]$ b=20 [kaka@localhost ~]$ sum=$(($a+$b)) #或 sum=$[$a+$b] [kaka@localhost ~]$ echo $sum 30

使用expr计算

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

bash
[kaka@localhost ~]$ a=10 [kaka@localhost ~]$ b=20 [kaka@localhost ~]$ expr $a + $b 30

使用let计算

bash
[kaka@localhost ~]$ a=10 [kaka@localhost ~]$ b=20 [kaka@localhost ~]$ let sum=a+b [kaka@localhost ~]$ echo $sum 30

算数运算符

运算符说明举例
+加法expr $a + $b
-减法expr $a - $b
*乘法expr $a \* $b
此处需要用\以防转译
/除法expr $b / $a
%取余expr $b % $a
=赋值a=$b
把变量 b 的值赋给 a
==相等
用于比较两个数字,相同则返回 true
[$a == $b]
!=不相等
用于比较两个数字,不相同则返回 true
[$a != $b]

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [$a == $b]

替删改

替换

语法含义
${变量名/旧字符串/新字符串}将第一个旧字符串替换成新字符串
${变量名//旧字符串/新字符串}将全部的旧字符串替换成新字符串

例如将www.abc.com中的第一个a替换成d

bash
var=www.abca.com echo ${var/a/d}

例如将114514中的1全部替换成9

bash
num=114514 echo ${num//1/9}

删除

语法含义
${变量名#关键字符}删除第一个关键字符前面的内容(从前往后匹配)
$[变量名##关键字符]删除最后一个关键字符前面的内容(从前往后匹配)
$[变量名%关键字符]删除第一个关键字符后面的内容(从后往前匹配)
$[变量名%%关键字符]删除最后一个关键字符后面的内容(从后往前匹配)

创建一个名为del.sh的文件,并写入以下内容

shell
file=/dir1/dir2/abc.file echo "输出名为file变量" echo ${file} echo '删除第一个 / 前面的内容(从前往后匹配)' echo ${file#*/} echo "删除最后一个 / 前面的内容(从前往后匹配)" echo ${file##*/} echo "删除第一个 / 后面的内容(从后往前匹配)" echo ${file%/*} echo "删除最后一个 / 后面的内容(从后往前匹配)" echo ${file%%/*}

执行结果

bash
输出名为file变量 /dir1/dir2/abc.file 删除第一个 / 前面的内容(从前往后匹配) dir1/dir2/abc.file 删除最后一个 / 前面的内容(从前往后匹配) abc.file 删除第一个 / 后面的内容(从后往前匹配) /dir1/dir2 删除最后一个 / 后面的内容(从后往前匹配)

修改

使用 ${变量名-新的变量名}进行替换

bash
[kaka@localhost ~]$ unset num [kaka@localhost ~]$ echo ${num-1919} 1919 [kaka@localhost ~]$ num=10010 [kaka@localhost ~]$ echo ${num-1919} 10010

本文作者:喵卡

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!