shell脚本中使用删除操作注意事项

 

错误例子:

FILE_HOME="/home/admin/output/logs"
cd $FILE_HOME
for DIR in `ls $FILE_HOME`   ##1
do
        cd "./$DIR/abc"  ##2
        find . -maxdepth 1 -mmin +3 | xargs rm -rf  ##3
        cd ../..   ##这里使用了相对路径  ##4
done
 这个例子不安全

##1这里判断有目录后,如果此时其中一个目录被另一个进程删除

##2这行执行失败

##3会把当前目录(/home/admin/output/logs)下的所有文件删除

##4 cd ../.. 会到/home/admin/下

下一个循环依照上面相同的逻辑##2这行执行失败,##3把/home/admin下所有文件删除

 

正确的写法

FILE_HOME="/home/admin/output/logs"
for DIR in `ls $FILE_HOME` 
do
	cd "$FILE_HOME/$DIR/abc" && (find . -maxdepth 1 -mmin +3 | xargs -t -n 1000 rm -rf)
done
 

 

1.使用绝对路径

2.使用&&,前一个cd命令执行失败,后一个rm命令不再执行,保证不会误删除

<think>我们在讨论Shell脚本中的export命令。根据引用,export用于设置环境变量,使其对当前Shell及其子进程可见。在脚本使用export,可以确保变量在脚本调用的子进程(如另一个脚本或命令)中可用。 步骤: 1. 定义变量:先给变量赋值。 2. 使用export:用export将变量导出为环境变量。 3. 在子进程中访问:在子Shell或子进程中,该环境变量可被使用。 注意点: - 如果不使用export,变量仅存在于当前Shell,子进程无法访问。 - export的效力仅限于当前登录会话(或当前Shell及其子进程),退出后失效。 示例脚本: ```bash #!/bin/bash # 定义变量 MY_VAR="Hello World" # 导出变量 export MY_VAR # 现在可以调用其他脚本或命令,它们将能访问MY_VAR echo "在父脚本中: $MY_VAR" # 调用子脚本 ./child_script.sh ``` 创建子脚本`child_script.sh`: ```bash #!/bin/bash echo "在子脚本中: $MY_VAR" ``` 运行父脚本,子脚本将输出`Hello World`。 另外,可以在同一行导出并赋值: ```bash export MY_VAR="Hello World" ``` 若要删除一个已导出的环境变量(使其不再被子进程继承),可以使用`export -n`: ```bash export -n MY_VAR ``` 注意:`export -n`只是取消导出,变量本身在当前Shell中仍然存在。若要完全删除变量,使用`unset`命令: ```bash unset MY_VAR ``` 引用说明: - 环境变量的设置对子进程可见[^1][^2][^3]。 - Shell脚本运行时创建子Shell,通过export传递变量值[^4]。 相关问题: 1. 如何让环境变量永久生效? 2. 除了export,还有哪些方法可以在Shell脚本之间传递数据? 3. 环境变量和普通变量在Shell脚本中的区别是什么?</think>### Shell脚本中正确使用`export`命令的方法 在Shell脚本中,`export`命令用于将变量设置为**环境变量**,使其对**当前Shell及其所有子进程**可见。这是实现脚本间数据传递和配置共享的关键机制。 #### 基本用法 1. **定义并导出变量**(常用方式): ```bash export MY_VAR="value" # 定义变量并立即导出 ``` 2. **先定义后导出**: ```bash MY_VAR="value" # 定义普通变量(仅当前Shell可见) export MY_VAR # 提升为环境变量(子进程可见) ``` #### 关键特性 1. **作用范围**: - 导出的变量对当前Shell启动的所有子进程(如其他脚本、命令)可见[^1][^4] - 变量修改后需重新导出才能更新子进程的值 ```bash # 父脚本 parent.sh export CONFIG_PATH="/etc/app.conf" ./child.sh # 子脚本可访问 CONFIG_PATH ``` 2. **临时性**: - 导出的变量仅在当前Shell会话有效,退出后失效[^3] - 永久生效需写入配置文件(如 `~/.bashrc`) 3. **查看环境变量**: ```bash export -p # 列出所有已导出的变量[^3] ``` #### 实际应用示例 **场景:跨脚本共享配置** ```bash # config.sh export DB_HOST="192.168.1.100" export DB_PORT=5432 # main.sh source config.sh # 加载配置 python run_app.py # Python脚本可通过 os.getenv("DB_HOST") 获取值 ``` #### 注意事项 1. **变量删除**: ```bash export -n MY_VAR # 取消导出(变量仍存在但不被子进程继承)[^3] unset MY_VAR # 彻底删除变量 ``` 2. **函数导出**: ```bash my_func() { echo "Hello"; } export -f my_func # 导出函数给子Shell使用[^3] ``` 3. **避免覆盖**: - 导出的变量可能覆盖子进程的同名变量 - 建议使用大写命名(如 `APP_CONFIG`)减少冲突 #### 与普通变量的区别 | 特性 | 普通变量 | export导出的变量 | |---------------|---------------|---------------------| | 作用范围 | 仅当前Shell | 当前Shell+所有子进程[^4] | | 子进程可见性 | ❌ 不可见 | ✅ 可见 | | 持久性 | 会话结束消失 | 会话结束消失 | > 当Shell脚本启动时,系统会创建子Shell执行脚本。未导出的变量如同私有财产,子进程无法继承;而导出的变量则成为共享遗产,子进程自动获得副本[^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值