一、shell脚本基础
1.shell脚本的结构
(1)Shebang (解释器声明)
#!/bin/bash
#!/bin/bash
:表示使用 Bash Shell 来解释脚本
#!/bin/sh
:表示使用默认的 Shell (通常是 /bin/bash 或其他)
(2)命令
脚本里可以填写shell命令,会顺序执行。
(3)注释
shell脚本用#
注释
# 这是一个注释
echo "Hello, World!"
(4)变量
①普通变量的定义 (例如 路径变量)
PATH="/home/user"
②命令变量的定义 (要求返回命令的执行结果,如pwd)
current_dir=$(pwd)
③变量的引用
$变量名
"${变量名}"
Shell 脚本中可以使用$变量
来存储数据。变量赋值时等号两边不能有空格。
#!/bin/bash
var="Edward"
echo "hello, $var"
输出:
hello, Edward
④脚本参数与函数参数
1.脚本参数
全局的 $1、$2 就是命令行传参进来的
脚本参数:当你运行脚本时通过命令行传递给脚本的参数会赋给 $1、$2、$3 等。例如:
# 运行脚本时传递参数
./myscript.sh arg1 arg2
# 脚本内部可以使用 $1 和 $2 获取参数值
echo "First argument: $1" # 输出:First argument: arg1
2.函数参数
函数中的$1、$2就是传参给函数的
函数参数:如果在脚本内部定义了函数,并在调用函数时传递参数,函数内部的 $1 会引用传递给函数的第一个参数。例如:
function greet() {
echo "Hello, $1"
}
greet "Alice" # 调用函数时传递参数
# 脚本内部的 $1 将会是 "Alice"
3.举例对比
#!/bin/bash
# 脚本中的参数
echo "Script argument: $1" # 这是脚本参数
# 定义一个函数
greet() {
echo "Function argument: $1" # 这是函数参数
}
# 调用函数并传递参数
greet "Alice"
脚本调用:
$ ./myscript.sh Hello
输出结果:
Script argument: Hello
Function argument: Alice
Script argument: $1 是脚本启动时通过命令行传递给脚本的第一个参数,在这个例子中是 “Hello”。
Function argument: $1 是传递给函数 greet 的第一个参数,在这个例子中是 “Alice”。
4.总结
①脚本参数:$1 是脚本启动时通过命令行传递给脚本的参数。
②函数参数:$1 是函数调用时传递给函数的参数。
它们之间的区分通过 上下文 来确定:如果你在脚本外部运行脚本并传递参数,$1 就是脚本参数;如果你在脚本内部调用函数并传递参数,$1 就是函数参数。
5.位置参数 传递
#!/bin/bash
echo "第一个参数是 $1"
echo "第二个参数是 $2"
调用:
./test.sh 111 222
输出:
第一个参数是 111
第二个参数是 222
⑥特殊变量
Shell 提供了许多特殊变量,常用的包括:
$0
:脚本的名称。
$#
:传递给脚本的参数个数。
$@
:所有的参数,作为一个独立的字符串数组。
$?
:上一个命令的退出状态(返回值)。
$$
:当前脚本的进程 ID。
例如:
#!/bin/bash
echo "脚本的名称是 $0"
echo "第一个参数是 $1"
echo "第二个参数是 $2"
echo "传递的参数个数是 $#"
命令行输入:
sh test.sh 111 22
输出:
脚本的名称是 test.sh
第一个参数是 111
第二个参数是 222
传递的参数个数是 2
(5)函数
Shell 脚本可以定义函数,函数定义后可以在脚本的任何地方调用。
Bash特有语法:使用 function 关键字定义函数,但 function关键字
是可选的。
0.函数的定义
function 函数名() {
# 函数体
}
①简单函数
#!/bin/bash
function say_hello() {
echo "Hello, $1"
}
say_hello "Alice" # 调用函数并传递参数
②函数定义与调用
#!/bin/bash
function greet() {
echo "Hello, $1"
}
greet "Alice" # 调用函数
③函数的返回值
Shell 函数默认返回的是最后执行命令的退出状态。你也可以通过 return 语句显式返回值。
示例:
#!/bin/bash
function add() {
return $(($1 + $2))
}
add 5 7
echo "结果是 $?"
2.shell语法
(1)命令执行
Shell 脚本中的命令与在终端中直接输入命令一样。
#!/bin/bash
echo "Hello, world!"
(2)变量赋值和引用
Shell 变量没有类型,所有变量默认为字符串类型。变量赋值时,不能有空格。
var="This is a variable"
echo $var # 输出变量的值
(3)条件判断
使用 if、else 和 elif 来进行条件判断。
①简单条件判断
#!/bin/bash
if [ -f "/etc/passwd" ]; then
echo "文件存在"
else
echo "文件不存在"
fi
②复合条件判断
进一步学习复合条件判断,例如 -and、-or
#!/bin/bash
if [ -f "$1" ] && [ -r "$1" ]; then
echo "文件存在并且可读"
else
echo "文件不存在或不可读"
fi
(4)循环结构
Shell 脚本支持 for、while 和 until 循环:
(1)for循环:
#!/bin/bash
for i in {1..5}; do
echo "第 $i 次循环"
done
(2)while循环:
#!/bin/bash
count=1
while [ $count -le 5 ]; do
echo "第 $count 次循环"
((count++))
done
(5)case语句
case 是一种多分支选择结构,可以替代多个 if-else。
示例:
#!/bin/bash
echo "请输入一个数字:"
read num
case $num in
1) echo "你输入的是 1" ;;
2) echo "你输入的是 2" ;;
3) echo "你输入的是 3" ;;
*) echo "无效输入" ;;
esac
3.Shell 脚本的调试
(1)bash -x:以调试模式执行脚本,显示每一行执行的命令及其结果
使用 -x 启动调试模式,它会显示每个命令及其执行结果
bash -x script.sh
(2)set -e:让脚本在遇到任何错误时立即退出
set -e
:遇到错误,脚本退出,不执行完
set +e
:取消set -e,不过默认行为也是遇到错误不会退出
set -e
(3)set -u:让脚本在使用未定义的变量时立即退出
set -u
4.shell脚本的执行
(1)直接执行
在脚本所在目录直接运行命令,但shell文件需要有执行权限。
./script.sh
若报错bash: ./test.sh: Permission denied
,则加权限:
chmod +x test.sh
(2)使用 bash 解释器执行
bash script.sh
(3)使用 sh 解释器执行
sh script.sh
二、shell操作
1.shell的文件操作
(1)文件检查
Shell 提供了各种文件测试操作符,如:
-e
:检查文件是否存在。
-f
:检查是否是普通文件。
-d
:检查是否是目录。
-r
:检查是否可读。
-w
:检查是否可写。
#!/bin/bash
if [ -e "$1" ]; then
echo "文件存在"
else
echo "文件不存在"
fi
(2)重定向和管道
①输出重定向:将命令的输出重定向到文件
echo "Hello" > output.txt # 将输出写入文件
②输入重定向:将文件内容作为输入传递给命令
sort < input.txt # 将文件作为输入
③管道:将一个命令的输出作为另一个命令的输入
cat file.txt | grep "pattern"
(3)文件读写
①读取文件内容
while read line; do
echo $line
done < file.txt
②写入文件
echo "Hello" > file.txt # 覆盖写入
echo "World" >> file.txt # 追加写入
2.字符串操作
(1)字符串替换
替换字符串中的一部分:
var="hello world"
var=${var/hello/hi} # 将 "hello" 替换为 "hi"
echo $var # 输出 "hi world"
(2)提取子字符串
获取字符串的某一部分:
var="hello world"
echo ${var:0:5} # 输出 "hello"
(3)正则表达式:通过 [[ ]] 来使用更强大的模式匹配
var="hello world"
if [[ $var =~ "world" ]]; then
echo "匹配成功"
fi
三、实战
1.判断文件夹Package是否存在,不存在则创建
#!/bin/bash
if [ ! -d Package ];then
mkdir Package
else
echo dir exist
fi
2.为什么shell中的cd命令没有生效
用 ./
、sh
、bash
方式执行shell脚本时候,系统会默认启动一个子shell来执行脚本,对当前shell没有影响。所以cd命令是在子shell中执行的,本shell没有影响。
若希望本shell来执行脚本,则需要用:
source
或 .
,即
source cd.sh
或
. cd.sh