Shell脚本

一、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命令没有生效

./shbash 方式执行shell脚本时候,系统会默认启动一个子shell来执行脚本,对当前shell没有影响。所以cd命令是在子shell中执行的,本shell没有影响。

若希望本shell来执行脚本,则需要用:
source.,即

source cd.sh
或
. cd.sh
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员爱德华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值