Shell脚本

先写到这里,之后从条件测试-文件测试开始写。开会去了

一、简单的Shell脚本示例:

bash 复制代码
#!/bin/bash

echo "这是第一节的演示文本!"
#echo "但是这一行不会被输出"

echo "这行文字要演示换行的效果\
这一行也是会输出的!"
                       

下面是运行结果:可以看出

①在 【#】后面的数据将全部被视为注解;

②如果一行的内容太多的话,可以在合适的地方加上 【\】+【Enter】就可以让内容换行了,但是输出还是在一行。

二、Shell脚本的执行

第一种方法:直接指令下达(要有脚本文件可执行权限)

1、绝对路径:从根目录开始的完整路径。

如果脚本在 `/home/username/scripts/myscript.sh`,则执行:

bash 复制代码
/home/username/scripts/myscript.sh

大致运行效果:

2、相对路径:当前工作目录的路径。

格式:./example.sh

就是简单示例里面的第三行命令

3、将脚本拷贝到PATH的指定目录内

①PATH:环境变量,包含了一系列用冒号分隔的目录路径。当在终端输入一个命令,而没有指定其路径时,Shell会按照PATH中列出的目录顺序。依次在这些目录中查找是否存在名为该命令的可执行文件。找到之后会执行。

我们可以查看自己的PATH。

bash 复制代码
#直接在终端中输入 echo $PATH

echo $PATH

输出可能类似:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

②如何操作?

a)选择一个目录:将脚本移动或复制到PATH中的任何一个目录。常见的选择是 /user/local/bin:通常用于用户自己安装的软件和脚本

b)拷贝脚本:将脚本复制到 /user/local/bin,可能需要 sudo 权限

bash 复制代码
sudo cp myfile.sh /user/local/bin/mycommand

c) 确保有执行程序

bash 复制代码
sudo chmod +x /usr/local/bin/mycommand

d)执行

bash 复制代码
mycommand

第二种方法(不要求脚本文件具有可执行权限)

使用bash程序执行。通过【bash xxx.sh】或 【sh xxx .sh】来执行。

第三种方法:(不需要脚本文件有可执行文件)

格式:source xxx.sh

三、Shell基础语法--变量

1、局部变量

------在脚本或 Shell 会话中定义的变量,其作用域仅限于定义它的那个 Shell 进程

  • 使用方法:直接赋值即可创建。

  • 变量的名称的取名规则跟c语言是一样的

  • 取变量的值方法: $变量名

  • 只读变量:是变量值不可变。在变量名前面加上 readonly

    • readonly myvar=0

数组变量:bash支持一维数组变量

  • 格式:names=(element1 element2...)
  • 数组下标:从数字0开始的整数
  • 数组元素:{name\[\*\]}表示所有的数组元素,{names[2]}表示下标为2的数组元素
  • 数组元素个数:运算符 ${#names[*]} 应用于数组变量,返回数组元素个数

示例代码:

bash 复制代码
#!/bin/bash

my_hello="Hello world"

echo $my_hello
~                    

执行结果:这里的my_hello变量就是局部变量

2、环境变量

  • 定义:一种特殊变量,可以被当前进程及其所有子进程看到。
  • 使用方法:通常作为局部变量定义,之后使用export命令导出。
bash 复制代码
#!/bin/bash
# 先定义为局部变量,然后导出为环境变量
my_app_path="/usr/local/myapp"
export my_app_path

# 更常见的写法是合并为一行
export DATABASE_URL="postgresql://user:pass@localhost/db"

# 现在,任何从此脚本启动的子进程都能看到 DATABASE_URL
python3 my_script.py # my_script.py 中可以读取到环境变量 DATABASE_URL

3、位置变量

  • 定义:用于接收传递给脚本或函数的参数
  • 用途:让脚本能够处理命令输入
  • 常见变量:
    • $0:脚本自身的名称
    • 1-9:第1个到第9个参数
    • $10及以上:需要用花括号括起来
    • $#: 传递给脚本的参数个数(使用函数的时候经常用到)
    • @ 或 *: 代表所有参数

示例代码:

bash 复制代码
#!/bin/bash

echo "脚本名称: $0"
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "参数总个数: $#"
echo "所有参数: $@"
~                   

在执行脚本的时候传入参数 "Alice" "Bob"

4、内建变量

  • 定义:由Shell自动设置和更新的只读变量,用于保存特定的状态信息。
  • 常见的内建变量:
    • :当前Shell进程的进程ID

    • $!:最后一个在后台运行的进程的PID
    • $-:当前Shell的选项标志
    • $#:参数个数

示例代码:

bash 复制代码
#!/bin/bash
# 检查上一条命令是否成功
ls /nonexistent_directory # 这个命令会失败
echo "ls 命令的退出状态是: $?" # 会输出一个非 0 的数字,如 2

mkdir /tmp/test_dir # 这个命令通常会成功
echo "mkdir 命令的退出状态是: $?" # 会输出 0

echo "当前脚本的进程ID是: $$"

运行结果:

四、条件测试

测试命令用于测试表达式的条件的真假。如果条件为真,测试结果为真,并返回一个为0的回传值;如果条件为假,则测试结果为假,并返回一个非0整数值。

测试命令有两种结构:

①test expression

②[ expression ]------注意两个括号前的空格不能少。

expression可以是数字、字符串、文本和文本属性的比较

bash 复制代码
# 使用 test 命令
test num1 -eq num2

# 使用方括号 [ ](更常见)
[ num1 -eq num2 ]

# 使用双括号 [[ ]](bash 扩展)
[[ num1 -eq num2 ]]

|---------------|----------------------------|
| 表达式 | 说明 |
| num1 -eq num2 | 如果 num1 等于 num2 ,测试结果为真 |
| num1 -gt num2 | 如果 num1 大于 num2 ,测试结果为真 |
| num1 -lt num2 | 如果 num1 小于 num2 ,测试结果为真 |
| num1 -ge num2 | 如果 num1 大于或等于 num2 ,测试结果为真 |
| num1 -le num2 | 如果 num1 小于或等于 num2 ,测试结果为真 |
| num1 -ne num2 | 如果 num1 不等于 num2 ,测试结果为真 |

示例代码:

bash 复制代码
#!/bin/bash

num1=10
num2=20

echo "数字1: $num1, 数字2: $num2"
echo ""

# -eq 等于
if [ $num1 -eq $num2 ]; then
    echo "$num1 等于 $num2"
else
    echo "$num1 不等于 $num2"
fi

# -ne 不等于
if [ $num1 -ne $num2 ]; then
    echo "$num1 不等于 $num2"
else
    echo "$num1 等于 $num2"
fi

# -lt 小于
if [ $num1 -lt $num2 ]; then
    echo "$num1 小于 $num2"
else
    echo "$num1 不小于 $num2"
fi

# -gt 大于
if [ $num1 -gt $num2 ]; then
    echo "$num1 大于 $num2"
else
    echo "$num1 不大于 $num2"
fi

# -le 小于等于
if [ $num1 -le $num2 ]; then
    echo "$num1 小于或等于 $num2"
else
    echo "$num1 大于 $num2"
fi

# -ge 大于等于
if [ $num1 -ge $num2 ]; then
    echo "$num1 大于或等于 $num2"
else
    echo "$num1 小于 $num2"
fi

结果显示:

注意:expr中的 【\*】是乘的意思。下面的几种写法都可以

相关推荐
满天点点星辰7 小时前
Linux命令大全-usermod命令
linux·运维
Lynnxiaowen7 小时前
今天继续学习nginx服务部署与配置
linux·运维·服务器·学习·nginx
程序员大辉7 小时前
请卸载xshell,一款国产的终端工具,界面漂亮,功能强大,支持win,mac,linux平台,安全免费
linux·运维·macos
NetX行者7 小时前
在windows 10系统上使用WSL安装Ubuntu系统并配置开发环境
linux·windows·python·ubuntu·wsl
深思慎考8 小时前
LinuxC++项目开发日志——基于正倒排索引的boost搜索引擎(3——通过cppjieba库建立索引模块)
linux·c++·搜索引擎
心随雨下8 小时前
Liunx系统下出现“Could not resolve host: mirrorlist.centos.org; 未知的错误”地解决方案
linux·python·centos
?LAST8 小时前
虚拟机Ubuntu挂载共享文件夹
linux·ubuntu
TonyEm8 小时前
linux ubuntu 20 命令行 安装Java25
linux·运维·ubuntu
努力学习的小廉8 小时前
深入了解linux网络—— 网络编程基础
linux·网络·php