shell执行脚本的方法及环境变量

news2024/11/17 15:26:30

执行脚本的方法
(1)bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行)
(2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)
(3)source ./filename.sh(使用当前进程执行,source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到当前的shell里面)
(4). filename.sh(和source一样,也是使用当前进程执行)

[root@qingyuxin SHELL]# vim test.sh 

#!/bin/bash
sleep 200    

分别用两类不同的方式启动脚本
在这里插入图片描述
另起一个终端查看启动后的进程信息
在这里插入图片描述

例如:

[root@localhost test]# vim test2.sh
#!/bin/bash
cd /tmp
pwd
[root@localhost test]# ls -l test2.sh
-rw-r--r--. 1 root root 24 Apr 30 20:09 test2.sh
(1)[root@localhost test]# bash test2.sh
/tmp
(2)[root@localhost test]# ./test2.sh
-bash: ./test2.sh: Permission denied
[root@localhost test]# chmod a+rx test2.sh
[root@localhost test]# ./test2.sh
/tmp
(3)[root@localhost test]# source test2.sh
/tmp
[root@localhost tmp]#
(4)[root@localhost test]# . test2.sh
/tmp
[root@localhost tmp]#

执行shell脚本时,如果使用1和2这种方式执行会在当前的进程下产生一个新的bash子进程,所以子进程
切换到了/tmp目录,当脚本结束,子进程也就结束了,所以当前进程的目录不会发生变化;3和4方式执
行时,不会产生新的进程,所以脚本执行结束后当前的目录会变成/tmp。

环境变量(全局变量)和普通变量(局部变量)
1、环境变量
环境变量也可称为全局变量,可以在创建它们的shell及其派生出来的任意子进程shell中使用(su -
切换用户会读取新的环境变量),环境变量又可分为自定义环境变量和bash内置的环境变量。
(1)自定义环境变量
一般是指用export内置命令导出的变量,用于定义shell的运行环境,保证shell命令的正确执行。环
境变量可以在命令行中设置和创建,但用户退出命令行时这些变量值就会丢失,即该环境变量只在当前
shell和子shell中有效。如果希望永久保存环境变量,可以在配置文件中设置。
①用户的环境变量配置(non-login shell)
/.bash_profile或/.bashrc
②全局环境变量的配置(login shell)
/etc/bashrc、/etc/profile文件或者/etc/profile.d目录中定义。
注意:按照系统规范,所有环境变量的名字均采用大写形式。在将环境变量应用于用户进程程序之前,都应该用
命令export导出。
有一些环境变量,比如HOME,PATH,SHELL,UID,USER等,在用户登录前就已经被/bin/login程序设置
好了,通常环境变量被定义并保存在用户家目录下的.bash_profile文件或全局的配置文件/etc/profile
中。
(2)bash内置的环境变量
shell内置的环境变量是所有的shell程序都可以使用的变量。shell程序在运行时,都会接收一组变量
来确定登录用户名、命令路径、终端类型、登录目录等,这组变量就是环境变量。环境变量会影响到所
有的脚本的执行结果
2、普通变量
普通变量也可称为局部变量,与全局变量相比,局部变量的使用范围较小,通常仅限于某个程序段访
问,例如函数内部。在Shell语言中,可以在函数内部通过local关键字定义局部变量,另外,函数的参数
也是局部变量。
用户登录时访问的环境变量过程图:
在这里插入图片描述

练习:

1、定义两个变量:num1=10和num2=2

num1=10
num2=2

使用(()): 计算num1 + num2的值并输出

echo "num1+num2=$((num1+num2))"

使用let: 计算num1 * num2的值输出

let num3=$num1*$num2
echo "num1*num2=$num3"

使用expr: 计算num1 对 num2执行或的位运算

echo "num1 | num2=` expr $num1 \| $num2`"

说明:与符号”|“前面的“\”代表转义字符。

使用$[]: 计算 num2的num1次方值

echo "num2**num1=$[num2**num1]"

declare: 计算 num1 除以 num2的值

declare -i num5=$num1/$num2
echo "num1/num2=$num5"

计算num2除num1的值(使用bc)

echo "num2/num1= $[$num2/$num1|bc]"

整体效果:
在这里插入图片描述
在这里插入图片描述
代码:
vim test1.sh

#!/bin/bash
#########################
#File name:test1.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2023-01-30 19:14:20
#Description:
#########################
num1=10
num2=2
echo "num1+num2=$((num1+num2))"

let num3=$num1*$num2
echo "num1*num2=$num3"

echo "num1 | num2=` expr $num1 \| $num2`"

echo "num2**num1=$[num2**num1]"

declare -i num5=$num1/$num2
echo "num1/num2=$num5"

echo "num2/num1= $[$num2/$num1|bc]"

2、 path=/data/data1/data2.txt
去获取它所在的目录

$ {parameter##word}: 从变量${parameter}开头开始删除最长匹配的word子串。

   echo ${path%/*}

去获取文件的名字

KaTeX parse error: Expected '}', got '#' at position 11: {parameter#̲#word} :从变量{parameter}开头开始删除最长匹配的word子串

  echo ${path##*/}

在这里插入图片描述

3、 设置一个只针对root的环境变量:ENV_ROOT=ROOT
设置一个针对所有用户的环境变量: ENV_ALL=ALL
在root用户下访问:ENV_ROOT和ENV_ALL
在普通用户下访问:ENV_ROOT和ENV_ALL

①用户的环境变量配置(non-login shell)
/.bash_profile或/.bashrc
在这里插入图片描述
在root用户下访问ENV_ROOT为空
在这里插入图片描述

原因: 当用户登录时会自动读取bash文件的所有环境变量,但是我们刚刚写入的环境变量是root用户登录后写入的,因此root用户还没有没有读取到ENV_ROOT
**解决办法:**以不产生子进程的方式执行刚刚写的bash脚本,让root用户读取脚本中的环境变量
在这里插入图片描述

②全局环境变量的配置(login shell)
/etc/bashrc、/etc/profile文件或者/etc/profile.d目录中定义。
在这里插入图片描述
在这里插入图片描述
切换到普通用户:
在这里插入图片描述
普通用户不能访问针对root的环境变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/186746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3 手撕日历控件

vue制作日历控件 效果如下&#xff1a; <template><div class"cal_con" style"margin-left:200px"><div class"cal_header"><!-- 顶部左侧 --><div class"cal_header_left"><div class"cal_he…

STL分析(十 hash、function type_traits、cout、move )

hash function 假定存在一个Customer类 class Customer{ public:string fname, lname;int no; };其哈希函数存在三种方式 //方式一&#xff1a;创建可调用类型 class CustomerHash { public:std::size_t operator()(const Customer& c) const{return ......} };unordere…

Android 签名基础知识

目录Android 为什么要签名keystore的生成&#xff1a;keystore信息的查看参数说明&#xff1a;Android 怎么签名使用 jarsigner 签名如何查找 jdk 位置签名时遇到的问题查看 apk 是否签名查看 Apk 的MD5值以及MD5不显示时的解决办法缺少 xx.RSA 文件的原因V1 vs V2Android 为什…

Coolify系列-解决局域网主机突然连不了虚拟机

开始之前&#xff0c;我们需要确保配置一切正常&#xff0c;原始配置参考下文 Coolify系列-手把手教学解决局域网局域网中的其他主机访问虚拟机以及docker服务 如果是之前已经配置好的&#xff0c;突然无法访问了&#xff0c;采取以下方式进行排查操作 在虚拟机执行 ifconf…

【GD32F427开发板试用】基于蓝牙的远程步进电机控制

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;寒冰1988 一、前言 接上篇文章【GD32F427开发板试用】基于蓝牙模块的远程点灯演示&#xff0c;本篇是第二篇&#xff0c;基于调通的蓝牙模块添…

Pytest-Allure测试报告

Allure 模块下载 pip install allure-pytest包下载 https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/此处我选择下载最新的&#xff0c;版本上可以选择不是最新的&#xff0c;2.9.0的。下载zip或者tgz后缀格式的都可以。 配置环境变量 找到解压…

RPA自动办公01——Uibot的安装和基础用法

本期开始RPA的学习流程。 RPA是机器人自动化流程的简写&#xff0c;目的在于减少重复性的劳动&#xff0c;而且上手很简单&#xff0c;无需编程就能用。 本系列使用Uibot 软件&#xff0c;其下载地址在&#xff1a;来也科技流程创造者&#xff08;UiBot Creator&#xff09; …

searchableSelect 插件使用

<script type"text/javascript" src"//searchableSelect.js"></script> <script>function getUserServer() {var _this 自定义封装接口请求、弹窗等方法;_this.getAjax("get","//xxxxx/server", {}, function(res)…

前端异常监控平台Sentry安装配置使用及问题

前言&#xff1a;Sentry是一款开源的异常监控平台,支持各种语言的SDK&#xff0c;通过对应SDK可以收集错误信息和性能数据&#xff0c;并可以再后台web页面中查看相关信息。官方地址&#xff1a;安装说明&#xff1a;https://develop.sentry.dev/self-hosted/后台使用说明&…

1.1计算机组成结构:CPU组成、冯·诺依曼结构与哈佛结构、嵌入式芯片术语

1.1计算机组成结构&#xff1a;CPU组成、冯诺依曼结构与哈佛结构、嵌入式芯片术语计算机组成结构CPU组成运算器控制器冯诺依曼结构与哈佛结构冯诺依曼结构哈佛结构嵌入式——芯片术语计算机组成结构 CPU组成 CPU分成两个部分&#xff0c;包括运算器和控制器。 CPU是计算机中核…

Linux之环境搭建

目录 一、VMware 二、centos7的安装 三、Mysql安装 四、 前端项目部署 1.确保前台项目能用 2.将前台项目打包npm run build 3.做ip/host主机映射 4.完成Nginx动静分离的default.conf的相关配置 5.将前端构件号的dist项目&#xff0c;上传到云服务器/usr/local/... …

[Swift]SDK开发

本文主要介绍使用swift语言制作framework Demo:https://github.com/Gamin-fzym/CMSDK 一、创建工程 1.创建目录 这里我创建了一个“CMSDK”目录 2.打开Xcode新建workspace放入CMSDK目录 这里命名为“CMSDK” 3.打开CMSDK.xcworkspace新建SDK工程放入CMSDK目录 这里还是命…

06 CSS-盒子模型【尚硅谷JavaWeb教程】

06 CSS-盒子模型【尚硅谷JavaWeb教程】 JAVAWEB的学习笔记 学习视频来自&#xff1a;https://www.bilibili.com/video/BV1AS4y177xJ/?vd_source75dce036dc8244310435eaf03de4e330 不同的浏览器导致前端展示页面不一样&#xff0c;盒子的大小的不同。&#xff08;所以前端要考虑…

奇迹mu开服教程

奇迹mu开服教程&#xff1a;开服服务端的架设及开服注意事项服务器推荐奇迹开服需要准备什么&#xff1f;开服大概成本分析奇迹MU商业服务端版本&#xff1a;1.02W、1.03H、1.03K、S6EP3、S7EP2、S9EP2&#xff1b;HE网站系统&#xff1a;绑定域名授权&#xff0c;功能可定制&a…

Jenkins部署项目一(物理机器部署SpringBoot项目)

一、Jenkins部署SpringBoot项目 设备&#xff1a;MacOS 准备工作 1.已安装java开发工具包JDK 2.已安装依赖管理工具Maven 3.已安装代码版本控制工具Git 4.已安装Jenkins learn-moon代码地址&#xff1a;https://github.com/BillDavidup/learn-moon SSH: gitgithub.com:Bil…

【学Vue就跟玩一样】如何使用集中式状态管理的Vuex以及如何模块化编码+命名空间

1.vuex是什么一个专门在Vue中实现集中式状态管理的一个Vue插件,可以对vue应用中多个组件的共享状态进行集中式的管理(读取/写入)&#xff0c;也是一种组件间通信的方式&#xff0c;并且适用于任意组件间通信2.什么时候使用Vuex1.多个组件依赖于同一状态2.来自不同组件的行为需要…

Goland入门指南(使用Goland创建并运行项目)

在文章《Goland下载和安装》详细介绍了 Goland 的安装和破解&#xff0c;本节我们来介绍一下怎么使用 Goland 来创建并运行一个项目。 创建项目 首先&#xff0c;在“文件”菜单中找到“New”&#xff0c;并在下一级菜单中选择“Project”来创建一个新项目。 为项目选择一个…

【vim】C语言代码提示

前言 常见的C语言提示插件是YouCompleteMe&#xff0c;这个插件安装比较麻烦&#xff0c;在这推荐一款coc.nvim这个插件&#xff0c;github仓库地址&#xff1a;https://github.com/neoclide/coc.nvim/ 下面是安装步骤。 一、安装 nodejs 1、终端命令安装 curl -sL instal…

SpringMVC DispatcherServlet源码(2) 扫描Controller创建HandlerMapping流程

Spring MVC向容器注册一个RequestMappingInfoHandlerMapping组件&#xff0c;他会扫描容器中的Controller组件&#xff0c;创建RequestMappingInfo并注册HandlerMethod映射关系。 本文将阅读Spring MVC源码分析上述流程。 RequestMappingHandlerMapping组件 Creates Request…

java ssm校园兼职发布与互动平台的设计与实现

该系统基于B/S即所谓浏览器/服务器模式&#xff0c;应用JSP技术&#xff0c;选择MySQL作为后台数据库。系统主要包括个人中心、用户管理、企业管理、企业信息管理、兼职信息管理、职位申请管理、职位类型管理、交流中心、留言反馈、系统管理等功能模块。 使用校园兼职发布与互动…