Linux Bash 常用基础语法
目录
Bash Script
简单记录shell脚本的一些基础语法,方便后续查阅
脚本的构成
jingx@jingx-VirtualBox:~/oscp$ cat ./hello-world.sh
#!/bin/bash
# Hello world Bash Script
echo "Hello Wolrd!"
- 文件常见以
.sh
后缀结尾,标明为shell脚本。实际后缀不影响文件类型识别及运行。 - 文件内容以
#!/bin/bash
样式开始,#!
称为Shebang,/bin/bash
为脚本解释器的绝对路径,bash为最常见的脚本解释器。 #
用于单行注释- 具体的运行语句
变量
# 赋值
jingx@jingx-VirtualBox:~/oscp$ varialble_name='Hello Wolrd!'
# 访问变量
jingx@jingx-VirtualBox:~/oscp$ echo $varialble_name
Hello Wolrd!
# 以命令/程序执行结果作为变量值:使用$(cmd)或`cmd`形式
jingx@jingx-VirtualBox:~/oscp$ echo $(whoami)
jingx
jingx@jingx-VirtualBox:~/oscp$ echo `whoami`
jingx
脚本参数
列举几个跟参数相关的变量:
变量名 | 描述 |
---|---|
$0 |
脚本名,作为第0号参数 |
$1~$9 |
传给脚本的前9个参数 |
$# |
传递给脚本的参数数量,包含$0 |
$@ |
所有传输给脚本的参数,作为一个参数组 |
$? |
上一个命令退出执行的状态 |
$$ |
当前脚本的PID |
$USER |
运行当前脚本的用户 |
$HOSTNAME |
当前机器的Hostname |
arg_test.sh
#!/bin/bash
echo "\$0 is $0"
echo "First param is $1"
echo "Second param is $2"
echo "There are $# params"
echo "Params: $@"
echo "Exit status of last run process:$?"
echo "PID: $$"
echo "User: $USER"
echo "Hostname: $HOSTNAME"
执行结果:
jingx@jingx-VirtualBox:~/oscp$ ./arg_test.sh 1 2 3
$0 is ./arg_test.sh
First param is 1
Second param is 2
There are 3 params
Params: 1 2 3
Exit status of last run process:0
PID: 109026
User: jingx
Hostname: jingx-VirtualBox
获取用户输入
读取用户输入使用read。read_test.sh
#!/bin/bash
echo "Test for read, write something:"
read tmp
echo "You write: $tmp"
执行结果
jingx@jingx-VirtualBox:~/oscp$ ./read_test.sh
Test for read, write something:
hello world
You write: hello world
可以使用read的参数辅助功能:
-p:指定提示字符
-s:隐藏输入内容(常见于密码输入场景)
read_test2.sh
#!/bin/bash
read -p 'Username: ' username
read -sp 'Password: ' password
echo
echo "your username: $username"
echo "your password: $password"
执行结果
jingx@jingx-VirtualBox:~/oscp$ ./read_test2.sh
Username: jingx
Password:
your username: jingx
your password: jingx_pwd
数组
# 定义
array_name=(value1 value2 ... valuen)
# 访问单个元素
${array_name[index]}
# 访问所有元素
${array_name[*]}
${array_name[@]}
运算符
算术运算符
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
PS:
- 条件表达式要放在方括号之间,并且要有空格,例如:
[$a==$b]
是错误的,必须写成[ $a == $b ]
- 乘号
(*)
前边必须加反斜杠(\)
才能实现乘法运算
关系运算符
算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
布尔运算符
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n "$a" ] 返回 true。 |
$ | 检测字符串是否为空,不为空返回 true。 | [ $a ] 返回 true。 |
文件测试运算符
操作符 | 说明 |
---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 |
-r file | 检测文件是否可读,如果是,则返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 |
-S file | 检测某文件是否是socket |
-L file | 检测文件是否存在并且是一个符号链接 |
流程控制
判断语句
if
if [<some test>]
then
command
fi
if else
if [<some test>]
then
command
else
command
fi
if else-if else
if [<some test>]
then
command
elif [<some test>]
then
command
else
command
fi
For循环
for var-name in <list>
do
command
done
while循环
while [ <some test> ]
do
command
done
条件选择语句 case ... esac
与其他语言中的 switch ... case 语句类似,是一种多分支选择结构。格式如下:
case value in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
- 每个 case 分支用右圆括号开始
- 用两个分号
;;
表示 break,即执行结束,跳出整个 case ... esac 语句 - esac(就是 case 反过来)作为结束标记
- 如果无一匹配模式,使用星号
*
捕获该值,再执行后面的命令。
函数
函数定义有两种方式
# 1
function function_name{
commands...
}
# 2
function_name() {
commands...
}
参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
函数返回值在调用该函数后通过 $? 来获得。
文件包含
和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
Shell 文件包含的语法格式如下:
# 1:点号(.)和文件名中间有一空格
. filename
# 2
source filename
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?