先写到这里,之后从条件测试-文件测试开始写。开会去了
一、简单的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中的 【\*】是乘的意思。下面的几种写法都可以
