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

Reference

Shell教程 | 菜鸟教程

posted @   Jing-X  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示