linux中bash
Shell 是 Linux 的核心部分,它允许你使用各种诸如 cd、ls、cat 等的命令与 Linux 内核进行交互。Bash脚本和Shell脚本实际上是指同一种类型的脚本,只不过Bash是其中最常用的一种Shell。除了Bash之外,常见的Shell解释器还有C Shell (csh)、Korn Shell (ksh)、Z Shell (zsh)等。
Bash是一种Unix shell,Bash是Bourne Again SHell的缩写。用于与操作系统进行交互,执行命令和脚本,以及管理文件和目录。用于自动化任务、批处理操作、系统管理、软件开发等各种用途。
命名:后缀名为.sh代表是一个shell脚本文件
#!/bin/bash
这一行被称为shebang 行,在某些文献中,它被称为hashbang 行,这是因为它以两个字符hash ‘#’ 和bang ‘!’ 开头。
#!/bin/sh (必须放在文件的第一行)
符号#!用来告诉系统它后面的参数是用来执行该文件的程序
注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。
启动脚本
一种是将文件名作为shell命令的参数。
调用格式为: bash 脚本名称.sh
特点: 文件无需可执行权限
当要被执行的脚本文件没有可执行权限时,只能使用这种调用方式。
当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。
第二种办法: ./+文件名执行
注意:需要注意文件以及用户是否拥有可执行权限。
当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。和第一种办法等效。
延伸:
source
使用source script.sh方式,在当前上下文中执行脚本,不会生成新的进程,执行完毕,回到当前shell。source方式也叫点命令,. script.sh与source script.sh等效。注意在点命令中,.与script.sh之间有一个空格。
exec
使用exec command方式,会用command进程替换当前shell进程,并且保持PID不变。执行完毕,直接退出,不回到之前的shell环境。
变量
在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:变量名=值
取出变量值可以加一个美元符号($)在变量前面
定义变量有以下几点需要注意
(1)变量名可以包含_、数字、大小写字母,但不能以数字开头
(2)“=”两边不要有空格
(3)“值”如果含有空格,要使用单引号''或双引号""引起来
(4)定义变量时,变量名前是不需要加$的,引用变量时需要在变量名前加$
通过read命令来获取变量
read ‐p "提示信息" 变量
当遇到read命令时,系统会等待用户输入,用户所输入的值会赋值给read后面的变量。
[root@redhat8 yy]# read -p "请输入你的名字:" aa
请输入你的名字:jin
[root@redhat8 yy]# echo $aa
jin
[root@redhat8 yy]#
环境变量
在定义环境变量时,前面加上export 即可。
常用的环境变量
PATH
PATH环境变量定义了系统在哪些目录中查找可执行文件
HOSTNAME
服务器的主机名。
SHELL
用户当前使用的Shell解析器。
HISTSIZE
保存历史命令的数目。
USER
当前登录用户的用户名。
HOME
当前登录用户的主目录。
PWD
当前工作目录。
LD_LIBRARY_PATH
C/c++动态链接库文件搜索的目录
CLASSPATH
JAVA语言库文件搜索的目录
向 Bash 脚本传递参数
在运行 Bash 脚本时以以下方式传递参数.
./my_script.sh arg1 arg2
参数详解
$0 对应的是当前 Shell 脚本程序的名称
$# 对应的是总共有几个参数(参数个数)
$* 对应的是所有位置的参数值
$? 对应的是显示上一次命令的执行返回值
$N对应的是第 N 个位置的参数值
通配符
通配符一般用在shell语言中,通配符中常见的元字符如下:
(1)[]:匹配一个字符,匹配的是出现在中括号中的字符
(2)[abc]:匹配一个字符,且只能是a或b或c
(3)[a-z]:“-”有特殊意义,表示“到”的意思,这里表示a~z,即匹配任一字母
(4)[0-9]:表示匹配任一数字
如果想去除含有特殊意义的字符,前面加“\”表示转义,即去除此字符的特殊意义
(5)[a\-z]:这里的“-”就没有“到”的意思了,匹配的是“a”或“-”或“z”这三个中的一个
如果想表示“除了”的意思,则在第一个中括号后面加“!”或“^”
(6)[!a-z]、[^a-z]:表示除字母外的其他字符
(7)?:表示一个任意字符,这里强调是一个,不是0个也不是多个,但不能匹配表示隐藏文件的点
(8)*:表示任意多个任意字符,可以是0个,也可以是1个或多个,但不能匹配表示隐藏文件的点
基础字符串操作
获取字符串长度
${#string}
var="hello world"
echo ${var}
echo ${#var}
连接两个字符串
str3=$str1$str2
常用命令语法及功能
cat file.txt: 输出文件内容到标准输出设备(屏幕)上
find: 搜索文件比如:根据文件名搜索find . -name filename -print
流程控制
“if” 表达式 如果条件为真则执行then后面的部分
if ....; then
....
elif ....; then
....
else
....
Fi
条件测试语句
Shell 脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。
条件测试语法的执行格式:
[ condition ]
注意:条件表达式两边均应有一个空格。
文件测试语句
文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符。
运算符 | 作用 |
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
逻辑测试语句
逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果.
逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令.
逻辑“或”的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令。
运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。
整数值比较语句
整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然地使用日常生活中的等号、大于号、小于号等来判断。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。
运算符 | 作用 | |
-eq equal | 是否等于 | |
-ne not equal | 是否不等于 | |
-gt greater than | 是否大于 | |
-lt lower than | 是否小于 | |
-le lower equal | 是否等于或小于 | |
-ge greater than | 是否大于或等于 |
字符串比较语句
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值)。
运算符 | 作用 |
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
流程控制语句
if 语句分为单分支结构、双分支结构、多分支结构。
单分支结构
单分支结构由 if、then、fi 关键词组成,而且只在条件成立后才执行预设的命令。
if condition
then ...
Fi
双分支结构
if 条件语句的双分支结构由 if、then、else、fi 关键词组成,它进行一次条件匹配判断, 如果与条件匹配,则去执行相应的预设命令;反之则去执行不匹配时的预设命令
如:
if condition
then ...
else ...
Fi
多分支结构
if 条件语句的多分支结构由if、then、else、elif、fi 关键词组成,它进行多次条件匹配判断,这多次判断中的任何一项在匹配成功后都会执行相应的预设命令。
if condition1
then ...
elif condition2
then ...
else ...
Fi
for 条件循环语句
for x in xx
do...
done
while 条件循环语句
while condition
do ...
done
将 shell 脚本添加到 PATH
前面使用 ./test.sh 来运行脚本;如果省略前导 ./; ./ 代表当前目录
Bash 认为你正在尝试运行名为 scripts.sh 的命令。当你在终端上运行任何命令时,shell 就在存储在 PATH 变量中的一组目录中查找该命令.
所以需要export PATH=$PATH:/包含test.sh的目录
使用函数
function_name() {
commands
}
使用带参数的函数的 Bash 脚本样例
#!/bin/bash
sum() {
sum=$(($1+$2))
echo "The sum of $1 and $2 is: $sum"
}
echo "Let's use the sum function"
sum 1 5