SH脚本基本语法(1)

概述

Shell 脚本是一种用于自动化任务的文本文件,其中包含一系列在 Unix、Linux 或 macOS 系统的 Shell 环境下可执行的命令。

定义 :Shell 脚本本质上是一个纯文本文件,它将一系列的 Shell 命令按特定逻辑组织在一起,以实现特定的任务。这些命令可以是系统自带的命令(如lscdmkdir等),也可以是用户自定义的函数或其他可执行程序。用户可以通过执行这个脚本文件,一次性执行其中包含的所有命令,从而提高工作效率。

结构:

  • #!/bin/bash:指定解释器。

  • 变量赋值:VAR=value(等号两侧不能有空格)。

  • 条件判断:if [ condition ]; then ... fi

  • 循环:forwhile

一、脚本基础 

1. 脚本开头

每个 sh 脚本都应该以 #!/bin/sh 开头,这行代码被称为 Shebang,它告诉系统使用 sh 解释器来执行该脚本。

示例: 

#!/bin/sh
# 这是一个简单的 sh 脚本示例
echo "Hello, World!"

# 输出 Hello, World!

 2. 脚本执行权限

在执行 sh 脚本之前,需要为脚本文件添加执行权限。可以使用 chmod 命令来实现,例如:

示例: 

chmod +x test.sh

# 其中,test.sh 是你的脚本文件名。添加执行权限后,就可以通过以下方式执行脚本:
./test.sh

二、输出和输入

1. 输出

使用 echo 命令可以将文本输出到终端。例如:

示例: 

echo "This is a test message."
# 输出 This is a test message.

2. 输入

使用 read 命令可以从用户那里获取输入。例如:

示例: 

echo "Please enter your name: "
read name
# 输入 111

echo "Hello, $name!"
# 输出 Hello, 111!

三、shell变量

Shell 变量是在 Shell 环境中用于存储数据的标识符,它是 Shell 编程的基础组成部分,能帮助用户存储和操作各种数据,以实现不同的功能。

1. 自定义变量

1.1 定义与命名规则

  • 定义:自定义变量是用户在 Shell 脚本或交互式 Shell 会话中创建的变量,用于存储数据,方便后续使用和操作。
  • 命名规则
    • 变量名只能由字母(大小写均可)、数字和下划线组成,变量名不能以数字开头。
    • 赋值时等号两边不要有空格
    • 为了提高代码的可读性,建议使用有意义的变量名,例如用username存储用户名。

1.2 定界符 

三种定界符在变量赋值操作中的特点

  • 双引号 " ":双引号中的变量会被解析成其对应的值。
  • 单引号 ' ': 将其中的内容原样输出,不会对特殊字符进行解析。
  • 反撇号 ` `:将命令的执行输出作为变量值( $() 和` ` 功能一样,但更适合嵌套)

示例: 

# 定义变量
name=John
age=25


# 单引号
message='Hello, $name'
echo $message  
# 输出: Hello, $name

# 双引号
message="Hello, $name"
echo $message 
# 输出: Hello, John

# 反引号
current_dir=`pwd`
echo $current_dir
# 输出:当前路径
# 使用 $( )
files=$(ls)
echo $files
# 输出:当前目录内容

# 引用变量时,在变量名前加上$符号。也可以使用${变量名}的形式,在变量名后面紧接着其他字符时,这种形式更清晰。
echo $name  # 输出变量 name 的值
echo "My name is ${name} and I'm ${age} years old."
# 输出:My name is John and I'm 25 years old.

2. 环境变量

当前用户的环境变量:
  • USER 记录了用户名
  • HOME 记录了家目录
  • SHEL L记录了登录解释器
  • HOSTNAME 记录主机名
  • UID 是用户的id号
  • PWD 是当前位置
  • PS1 表示Shell环境的一级提示符,即命令行提示符 (\u 用户名、\h 主机名、\W 工作目录、\$ 权限标识)
  •  PS2 表示二级提示符,出现在强制换行场合
  • PATH 记录命令的路径
  • 可以把变量放入/etc/profile(环境变量配置文件),对所有用户有效;放入~/.bash_profile,仅对当前的用户有效(定义变量是临时的,放在上面文件里才是永久的)
  • 使用env可查看所有环境变量,使用set可查看所有变量

示例 1: 

# hjbl.sh
cat << EOF > hjbl.sh
#!/bin/bash

# 输出各个环境变量的值
echo "用户名: $USER"
echo "家目录: $HOME"
echo "登录解释器: $SHELL"
echo "主机名: $HOSTNAME"
echo "用户ID号: $UID"
echo "当前位置: $PWD"
echo "一级提示符: $PS1"
echo "二级提示符: $PS2"
echo "命令的路径: $PATH"
EOF

./hjbl.sh
# 输出
用户名: root
家目录: /root
登录解释器: /bin/bash
主机名: centos7-server
用户ID号: 0
当前位置: /root
一级提示符: [root@centos7-server ~]# 
二级提示符: > 
命令的路径: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 如果你希望某些环境变量对所有用户都有效,可以将变量的定义添加到 /etc/profile 文件中。

示例 2: 

vim /etc/profile
export MY_VAR="这是一个对所有用户有效的环境变量"
# 保存退出
source /etc/profile # 使配置生效

# 如果仅对当前用户生效
vim ~/.bash_profile # 在这个文件里设置环境变量

3. 预定义变量、位置变量

预定义变量

  • $$ 当前运行进程的PID(进程号)
  • $? 上一个程序的返回状态码 (返回值为0,上一个任务成功,不是0,失败)
  • $0 当前运行的脚本名
  • $# 位置变量的个数
  • $* 所有的位置变量
  • $! 后台(最后一个进程)的PID号

位置变量

  • $1 第一个参数
  • $2 第二个参数
  • $3 第三个参数
  • ${10} 第十个参数

示例: 

# 编写ydybl.sh
cat << EOF > ydybl.sh
#!/bin/bash

# 打印当前运行脚本的 PID
echo "当前运行进程的 PID: $$"

# 执行一个简单命令,并打印其返回状态码
ls /tmp
echo "上一个程序(ls /tmp)的返回状态码: $?"

# 打印当前运行的脚本名
echo "当前运行的脚本名: $0"

# 打印位置变量的个数
echo "位置变量的个数: $#"

# 打印所有的位置变量
echo "所有的位置变量(使用 \$*): $*"

# 启动一个后台进程(sleep 30 秒),并打印其 PID
sleep 30 &
echo "后台(最后一个进程)的 PID 号: $!"

# 打印第一个和第二个参数
echo "第一个参数: $1"
echo "第二个参数: $2"
EOF
# 运行ydybl.sh
./ydybl.sh 1 2

# 输出
当前运行进程的 PID: 12345
上一个程序(ls /tmp)的返回状态码: 0
当前运行的脚本名: ./ydybl.sh
位置变量的个数: 2
所有的位置变量(使用 $*): 1 2
后台(最后一个进程)的 PID 号: 12346
第一个参数: 1
第二个参数: 2

4. 数值运算

4.1 整数运算

echo $[ ] 或 echo $(( )) 
括号内引用变量可以省略$

示例: 

# 设置变量
x=5

# echo $[]
echo $[x+21]
# 输出 26

# echo $(())
echo $((x-1)),((x*3))
# 输出 4,15

4.2 小数运算

使用bc可以实现小数运算(大多数Linux操作系统自带bc计算器)

  • 支持高精度数值运算
  • 直接运行bc进入运算界面,quit退出
  • 设置 scale=n 可约束小数精度

示例: 

# 运行
bc

12.34*56.78
# 输出 700.66

scale=4
12.34*56.78
# 输出 700.6652
quit # 退出

4.3 自增、自减

%取余数

简写表达式 完整表达式
i++ i=i+1
i-- i=i-1
i+=2         i=i+2
i-=2 i=i-2
i*=2 i=i*2
i/=2 i=i/2
i%=2 i=i%2

示例:

i=2

let i++;echo $i
# 输出 3

let i-=2;echo $i
# 输出 0

你可能感兴趣的:(bash,运维,linux)