Linux Shell 脚本专题

news/发布时间2024/5/20 8:41:31

V1.0 2024年5月8日 发布于博客园

目录
  • 常用环境变量
    • 一、环境变量的概念
      • 1、环境变量的含义
      • 2、环境变量的分类
      • 3、Linux环境变量
    • 二、常用的环境变量
      • 1、查看环境变量
      • 2、常用的环境变量
    • 三、设置环境量
      • 1、系统环境变量
      • 2、用户环境变量
      • 3、环境变量脚本文件的执行顺序
    • 四、重要环境变量的详解
      • 1、PATH环境变量
      • 2、LANG环境变量
      • 3、LD_LIBRARY_PATH环境变量
      • 4、CLASSPATH
    • 五、环境变量的生效
    • 六、应用经验
  • 部分常用命令详解
    • 脚本基本知识
      • 脚本固定格式 :
        • 脚本注释
    • Shell 的变量功能
      • 变量的使用与设置
        • echo 变量的取用
        • 变量设定规则
      • 环境变量的功能
        • env 观察环境变量与常见环境变量说明
        • export 自定义变量转成环境变量
  • 参考文献

常用环境变量

一、环境变量的概念

1、环境变量的含义

程序(操作系统命令和应用程序)的执行都需要运行环境,这个环境是由多个环境变量组成的。

2、环境变量的分类

1)按生效的范围分类。

系统环境变量:公共的,对全部的用户都生效。

用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。

2)按生存周期分类。

永久环境变量:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。

临时环境变量:使用时在Shell中临时定义,退出Shell后失效。

3、Linux环境变量

Linux环境变量也称之为Shell环境量变量,以下划线和字母打头,由下划线、字母(区分大小写)和数字组成,习惯上使用大写字母,例如PATH、HOSTNAME、LANG等。

二、常用的环境变量

1、查看环境变量

1)env命令

在Shell下,用env命令查看当前用户全部的环境变量。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ env
SHELL=/bin/bash
COLORTERM=truecolor
TERM_PROGRAM_VERSION=1.89.0
LC_ADDRESS=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_MONETARY=zh_CN.UTF-8
PWD=/home/yuyi/MyDevelopmentFile
LOGNAME=yuyi
XDG_SESSION_TYPE=tty
MANPATH=/usr/share/man:
MOTD_SHOWN=pam
HOME=/home/yuyi
LC_PAPER=zh_CN.UTF-8
LANG=en_US.UTF-8

上图只截取了部分环境变量,并非全部。

用env命令的时候,满屏显示了很多环境变量,不方便查看,可以用grep筛选。

env|grep 环境变量名

例如查看环境变量名中包含PATH的环境变量。

env|grep PATH
yuyi@IoTDevelopment:~/MyDevelopmentFile$ env|grep PATH
MANPATH=/usr/share/man:
PATH=/DevelopmentTool/usr/local/arm/5.4.0/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

2)echo命令

echo $环境变量名
yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${LANG}
en_US.UTF-8
yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${PATH}
/DevelopmentTool/usr/local/arm/5.4.0/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

注意,符号$不能缺少,这是语法规定。

2、常用的环境变量

1)PATH

可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序,PATH变量的具体用法本文后面的章节中有详细的介绍。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${PATH}
/DevelopmentTool/usr/local/arm/5.4.0/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

2)LANG

Linux系统的语言、地区、字符集,LANG变量的具体用法本文后面的章节中有详细的介绍。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${LANG}
en_US.UTF-8

3)HOSTNAME

服务器的主机名。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${HOSTNAME}
IoTDevelopment

4)SHELL

用户当前使用的Shell解析器。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${SHELL}
/bin/bash

5)HISTSIZE

保存历史命令的数目。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${HISTSIZE}
1000

6)USER

当前登录用户的用户名。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${USER}
yuyi

7)HOME

当前登录用户的主目录。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${HOME}
/home/yuyi

8)PWD

当前工作目录。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ echo ${PWD}
/home/yuyi/MyDevelopmentFile
yuyi@IoTDevelopment:~/MyDevelopmentFile$ pwd
/home/yuyi/MyDevelopmentFile

9)LD_LIBRARY_PATH

C/C++语言动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要,具体用法本文后面的章节中有详细的介绍。

10)CLASSPATH

JAVA语言库文件搜索的目录,它也不是Linux缺省的环境变量,但对JAVA程序员来说非常重要,具体用法本文后面的章节中有详细的介绍。

三、设置环境量

变量名='值'
export 变量名

export 变量名='值'

如果环境变量的值没有空格等特殊符号,可以不用单引号包含。

示例:

export ORACLE_HOME=/oracle/home
export ORACLE_BASE=/oracle/base
export ORACLE_SID=snorcl11g
export NLS_LANG='Simplified Chinese_China.ZHS16GBK'export PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin:.export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib:.

采用export设置的环境变量,在退出Shell后就会失效,下次登录时需要重新设置。如果希望环境变量永久生效,需要在登录脚本文件中配置。

1、系统环境变量

系统环境变量对全部的用户生效,设置系统环境变量有三种方法。

1)在/etc/profile文件中设置。

用户登录时执行/etc/profile文件中设置系统的环境变量。但是,Linux不建议在/etc/profile文件中设置系统环境变量。

image

每个使用者登入取得bash 时一定会读取的配置文件! 所以如果你想要帮所有使用者设定整体环境,那就是改这里啰!

2)在/etc/profile.d目录中增加环境变量脚本文件,这是Linux推荐的方法。

/etc/profile在每次启动时会执行/etc/profile.d下全部的脚本文件。/etc/profile.d比/etc/profile好维护,不想要什么变量直接删除/etc/profile.d下对应的 shell 脚本即可。

/etc/profile.d目录下有很多脚本文件,例如:

root@IoTDevelopment:~# ls /etc/profile.d
01-locale-fix.sh  bash_completion.sh     debuginfod.csh  gnome-session_gnomerc.sh  vte-2.91.sh  xdg_dirs_desktop_session.sh
apps-bin-path.sh  cedilla-portuguese.sh  debuginfod.sh   im-config_wayland.sh      vte.csh

image

在以上示例中,/etc/profile.d目录中的oracle.sh是Oracle数据库的环境变量配置文件,内容如下:

image

其实这是个目录内的众多文件!只要在/etc/profile.d/ 这个目录内且扩展名为.sh ,另外,使用者能够具有r 的权限, 那么该文件就会被/etc/profile 呼叫进来。在CentOS 7.x 中,这个目录底下的文件规范了bash 操作接口的颜色、语系、ll 与ls 指令的命令别名、vi 的命令别名、which的命令别名等等。如果你需要帮所有使用者设定一些共享的命令别名时, 可以在这个目录底下自行建立扩展名为.sh 的文件,并将所需要的数据写入即可喔!

3)在/etc/bashrc文件中设置环境变量

该文件配置的环境变量将会影响全部用户使用的bash shell。但是,Linux也不建议在/etc/bashrc文件中设置系统环境变量。

2、用户环境变量

用户环境变量只对当前用户生效,设置用户环境变量也有多种方法。

在用户的主目录,有几个特别的文件,用ls是看不见的,用 ls .bash_* 可以看见。

yuyi@IoTDevelopment:~/MyDevelopmentFile$ ls ~/.bash*
/home/yuyi/.bash_history  /home/yuyi/.bash_logout  /home/yuyi/.bashrc

1).bash_profile(推荐首选)

当用户登录时执行,每个用户都可以使用该文件来配置专属于自己的环境变量。

2).bashrc

当用户登录时以及每次打开新的Shell时该文件都将被读取,不推荐在里面配置用户专用的环境变量,因为每开一个Shell,该文件都会被读取一次,效率肯定受影响。

3).bash_logout

当每次退出系统(退出bash shell)时执行该文件。

4).bash_history

保存了当前用户使用过的历史命令。

cat ~/.bash_history

3、环境变量脚本文件的执行顺序

环境变量脚本文件的执行顺序如下:

/etc/profile->/etc/profile.d->/etc/bashrc->用户的.bash_profile->用户的.bashrc

同名的环境变量,如果在多个脚本中有配置,以最后执行的脚本中的配置为准(例如,上代码段中所有的脚本都有某环境变量,则以用户的.bashrc为准)。

还有一个问题需要注意,在/etc/profile中执行了/etc/profile.d的脚本,代码如下:

for i in /etc/profile.d/*.sh ; doif [ -r "$i" ]; thenif [ "${-#*i}" != "$-" ]; then. "$i"else. "$i" >/dev/nullfifi
done

所以,/etc/profile.d和/etc/profile的执行顺序还要看代码怎么写 。

msedge_1F7rz3aJYn

若在该代码段前,则被该代码段覆盖,若在该代码段后,则覆盖该代码段的行为。

四、重要环境变量的详解

1、PATH环境变量

可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。

1)PATH环境变量存放的是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录。

. 也是一个命令,是用于表示当前目录,故而./a.out 可以被执行

export PATH=目录1:目录2:目录3:......目录n:.

2)PATH缺省包含了Linux系统命令所在的目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。

示例:

image

3)在用户的.bash_profile文件中,会对PATH进行扩充,如下:

export PATH=$PATH:$HOME/bin
# 这里的$PATH表示之前已经存在的,故而表示在之前的PATH后继续添加用户家目录下的bin。但单次有效。

4)如果PATH变量中没有包含圆点.,执行当前目录下的程序需要加./或使用绝对路径。

示例:

image

2、LANG环境变量

LANG环境变量存放的是Linux系统的语言、地区、字符集,它不需要系统管理员手工设置,/etc/profile会调用/etc/profile.d/lang.sh脚本完成对PATH的设置。

CentOS6.x 字符集配置文件在/etc/syscconfig/i18n文件中。

CentOS7.x 字符集配置文件在/etc/locale.conf文件中,内容如下:

image

3、LD_LIBRARY_PATH环境变量

C/C++语言动态链接库文件搜索的目录,它不是Linux缺省的环境变量,但对C/C++程序员来说非常重要。

LD_LIBRARY_PATH环境变量存放的也是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录,与PATH的格式相同。

export LD_LIBRARY_PATH=目录1:目录2:目录3:......目录n:.

4、CLASSPATH

JAVA语言库文件搜索的目录,它也不是Linux缺省的环境变量,但对JAVA程序员来说非常重要。

CLASSPATH环境变量存放的也是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录,与PATH的格式相同。

五、环境变量的生效

1)在Shell下,用export设置的环境变量对当前Shell立即生效,Shell退出后失效。

2)在脚本文件中设置的环境变量不会立即生效,退出Shell后重新登录时才生效,或者用source命令让它立即生效,例如:

source /etc/profile

六、应用经验

虽然设置环境变量的方法有多种,但是建议系统环境变量建议在/etc/profile.d目录中配置,用户环境变量在用户的.bash_profile中配置,不建议在其它脚本文件中配置环境变,会增加运维的麻烦,容易出错。

部分常用命令详解

脚本基本知识

脚本固定格式 :

xxx.sh 创建好一个空白的脚本文件后,需要在脚本文件的第一行使用#!来指定shell解释器. 缺省默认使用bash解释器

#!/bin/bash

脚本注释

#这是注释

Shell 的变量功能

变量的使用与设置

echo 变量的取用

echo ${PATH} # 或 echo $PATH

变量设定规则

myname=VBird # 将myname这个变量名称设定是VBird ,
echo ${myname} # 打印变量内容
  1. 变量默认字符类型, 默认内容是空
  2. 等号两边不能直接接空格符
  3. 开头字符不能是数字
  4. 变量内容有空格必须用 " "或' '
    1. 双引号内的特殊字符如 $ 等,可以保有原本的特性 var="lang is $LANG"echo $var可得lang is zh_TW.UTF-8
    2. 单引号内的特殊字符则仅为一般字符 (纯文本)
  5. 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容 PATH="$PATH":/home/binPATH=${PATH}:/home/bin, 将/home/bin累加, 目录之间用冒号:分隔
  6. 通常大写字符为系统默认变量,自行设定变量可以使用小写字符
  7. 若该变量需要在其他子程序执行,则需要以 export 来使变量变成环境变量:export PATH

环境变量的功能

env 观察环境变量与常见环境变量说明

env 是environment (环境) 的简写.

env #列出目前的 shell 环境下的所有环境变量与其内容

export 自定义变量转成环境变量

export 变量名称

当你登入 Linux 并取得一个bash 之后,你的bash 就是一个独立的程序,这个程序的识别使用的是一个称为程序标识符,被称为PID 的就是。接下来你在这个 bash 底下所下达的任何指令都是由这个bash 所衍生出来的,那些被下达的指令就被称为子程序了。分享自己的变量设定给后来呼叫的文件或其他程序。

/etc/environment 用于定义全系统范围内必须的环境变量。
/etc/profile 通常用于执行更复杂的初始化命令和环境设置,并且是特定于 shell 登录会话的。
修改 /etc/environment 后通常需要重新登录或重启系统,而 /etc/profile 对于新的登录会话立即生效。
/etc/profile 可以用于执行配置环境变量之外的其他任何启动命令或脚本

参考文献

  • CentOS7设置环境变量_centos7 配置环境变量-CSDN博客
  • 鸟哥的Linux私房菜 基础学习篇 第四版 (豆瓣) (douban.com) 第10章
  • Linux命令行与shell脚本编程大全(第4版) (豆瓣) (douban.com) 第五章、第六章
  • /etc/environment,/etc/profile区别_etc envirnoment-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

注册表延长Windows更新时间

打开注册表【Win】+【R】打开运行窗口输入regedit在输入框中输入计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings后回车在右侧空白处选择新建->DWORD(32位)值(D)命名为FlightSettingsMaxPauseDays,选中10进制数据数值为暂停更新的天数。 确定后关…

El-Upload组件上传图片并添加水印

背景 有的时候我们需要在上传图片中添加一些水印标识,然后上传至服务器 效果图代码 <template><div class="app"><!-- 需求:1. 点击直接预览图片,而不需要使用dialog2. 上传图片添加水印后才预览图片思路:上传图片文件添加水印。使用watermark…

Windows平台git clone文件路径太长报错

解决文件路径太长导致的报错问题问题描述 在Windows下拉取一些比较大的开源项目经常会提示文件路径太长(filename too long),然后死活都不成功 解决办法 1.配置git git config --system core.longpaths true2.修改文件C:\Program Files\Git\etc\gitconfig(需要以管理员身份…

docker搭建redis集群(三主三从)及重启redis集群 redis扩容新增集群

docker搭建redis集群(三主三从)及重启redis集群 一、docker搭建redis集群1、下载redis镜像文件从远程仓库先拉取一下redis的镜像文件,如果已经提前安装过镜像的,可以跳过此步骤: docker pull redis:6.0.82、查看本地拉取到镜像文件docker images 看到图上标识,就说明当前…

ISCC线上赛2023

ISCC线上赛2023 web web1双重base解码得到flag web3 F12控制台查看可找到loveStory.php Enc.php download.php,loveStory.php为反序列源码 boy::__destruct() -->girl()::__call()-->helper()::__isset()-->boy()::__toString()-->helper()::__get()-->love_st…

tomcat的cookie报错

1.File–>project structure -> Modules(+)–>java—>选择servlet-api.jar 需要添加servlet.api.jar包依赖