bash 是一个包含一系列命令的纯文本文件,通常以 .sh
结尾,执行前必须有可执行权限。
# 变量
跟编程很像,声明直接声明 A=SB
,调用的时候加一个 $
就行: echo '我是$A'
声明的变脸如果有空格,要用引号包起来
可以通过 $()
执行命令: user=$(whoami)
,这样运行 echo $user
会直接显示用户名
# 参数
在 Bash 编程中,你可以通过使用特定的变量来获取传递给脚本或函数的参数。这些特定的变量是:
- $0:表示脚本或函数的名称。
- $1, $2, $3, ...:表示传递给脚本或函数的位置参数,其中 $1 表示第一个参数,$2 表示第二个参数,以此类推。
- $@:表示传递给脚本或函数的所有位置参数的列表。
- $#:表示传递给脚本或函数的位置参数的个数。
以下是一个简单的例子,演示了如何在 Bash 脚本中获取和使用这些参数:
#!/bin/bash | |
echo "The name of the script is: $0" | |
echo "The first parameter is: $1" | |
echo "The second parameter is: $2" | |
echo "All parameters are: $@" | |
echo "The number of parameters is: $#" |
假设你将上述脚本保存为 script.sh
,然后在命令行中执行以下命令:
./script.sh hello world |
那么,脚本将会输出:
The name of the script is: ./script.sh
The first parameter is: hello
The second parameter is: world
All parameters are: hello world
The number of parameters is: 2
# 用户输入
可以通过 read 读取用户输入
read -p 'Username:' username | |
read -sp 'Pssword:' password | |
echo "Username:$username,Password:$password" |
-p
指定提示词, -s
采取静默模式,输入的时候不会进行任何显示。
# 判断
在 Bash 编程中,判断是非常重要的,可以帮助你根据条件执行不同的操作。在 Bash 中,主要用到以下几种判断结构:
- if 语句:用于在条件为真时执行特定的代码块。
- elif 语句:用于在前一个条件不满足时检查下一个条件。
- else 语句:用于在所有条件均不满足时执行特定的代码块。
- test 命令 或方括号
[ ]
:用于测试条件是否为真。 - 逻辑运算符:如
-eq
(等于),-ne
(不等于),-lt
(小于),-gt
(大于),-le
(小于等于),-ge
(大于等于),-z
(空字符串) 等。
以下是一个简单的例子,演示了如何在 Bash 脚本中使用 if-elif-else 结构进行条件判断:
#!/bin/bash | |
echo "Enter a number:" | |
read num | |
if [ $num -eq 0 ]; then | |
echo "The number is zero." | |
elif [ $num -gt 0 ]; then | |
echo "The number is positive." | |
else | |
echo "The number is negative." | |
fi |
在这个例子中,用户输入一个数字,然后脚本根据数字的正负情况输出不同的消息。
另外,你也可以使用逻辑运算符来结合多个条件进行判断。例如:
#!/bin/bash | |
echo "Enter your age:" | |
read age | |
if [ $age -ge 18 ] && [ $age -le 60 ]; then | |
echo "You are an adult." | |
elif [ $age -lt 18 ] || [ $age -gt 60 ]; then | |
echo "You are either a minor or a senior." | |
else | |
echo "Invalid age." | |
fi |
在这个例子中,根据用户输入的年龄判断其是成年人、未成年人还是老年人。
# 布尔逻辑运算符
and
、 or
、 &&
、 ||
这个没什么好讲的 ==、
# 循环
在 Bash 编程中,循环结构用于多次执行一段代码块,直到满足某个条件为止。Bash 支持以下几种循环结构:
- for 循环:用于遍历一个列表中的元素,执行相同的操作。
- while 循环:在条件为真时重复执行一段代码块。
- until 循环:在条件为假时重复执行一段代码块。
以下是这几种循环结构的简单示例:
1. for 循环:
#!/bin/bash | |
for i in {1..5}; do | |
echo "Count: $i" | |
done |
这个例子中的 for 循环将会打印出 1 到 5 的数字。
2. while 循环:
#!/bin/bash | |
count=1 | |
while [ $count -le 5 ]; do | |
echo "Count: $count" | |
((count++)) | |
done |
这个例子中的 while 循环将会打印出 1 到 5 的数字,与 for 循环相同。
3. until 循环:
#!/bin/bash | |
count=1 | |
until [ $count -gt 5 ]; do | |
echo "Count: $count" | |
((count++)) | |
done |
这个例子中的 until 循环也将会打印出 1 到 5 的数字,与 while 循环的例子相似。
在 Bash 编程中,双括号 (())
通常用于进行数学运算和比较操作。双括号内部可以包含变量、常量和数学运算符,可以执行诸如加法、减法、乘法、除法等数学运算,并且支持比较操作。
下面是一些使用双括号进行数学运算和比较的示例:
数学运算:
#!/bin/bash | |
a=5 | |
b=3 | |
((sum = a + b)) | |
echo "Sum: $sum" |
在这个例子中,双括号内的表达式 ((sum = a + b))
执行了 a + b
的数学运算,并将结果赋值给变量 sum
。
比较操作:
#!/bin/bash | |
a=5 | |
b=3 | |
if ((a > b)); then | |
echo "$a is greater than $b" | |
fi |
在这个例子中,双括号内的条件 (a > b)
执行了 a
是否大于 b
的比较操作。
双括号内部支持的数学运算和比较操作更加灵活和方便,相比单括号的方式更易读且更直观。
# 函数
在 Bash 脚本中,函数用于封装一段可重复使用的代码,使得代码更加模块化和易于维护。定义函数的语法如下:
function_name() { | |
# 函数内部的代码 | |
# 可以包含任意 Bash 语句和命令 | |
} |
以下是一个简单的函数示例:
#!/bin/bash | |
# 定义一个名为 greet 的函数 | |
greet() { | |
echo "Hello, welcome to the Bash world!" | |
} | |
# 调用 greet 函数 | |
greet |
在这个示例中,我们定义了一个名为 greet
的函数,函数内部的代码只是简单地打印一条问候语。然后我们调用了这个函数,程序会输出 "Hello, welcome to the Bash world!"。
函数也可以接收参数,用于传递数据给函数。下面是一个带参数的函数示例:
#!/bin/bash | |
# 定义一个名为 greet 的函数,接收一个参数 | |
greet() { | |
name=$1 | |
echo "Hello, $name! Welcome to the Bash world!" | |
} | |
# 调用 greet 函数并传入参数 | |
greet "John" |
在这个示例中,我们定义了一个带有参数的 greet
函数,它接收一个名为 name
的参数,然后在问候语中使用这个参数。当我们调用 greet
函数时,传入了 "John" 作为参数,程序会输出 "Hello, John! Welcome to the Bash world!"。
$?
是一个特殊的变量,代表上一个执行函数的返回状态,成功为 0,可以通过 return
指定。
# 作用域
local
,就是和编程一样的用法 ==、
# 实例
就是用之前讲到的流编辑器提取需要的睡觉,然后循环读取,进行下一步操作。