文章目录

  • shell 分类
  • shell脚本执行方式
    • echo基本输出命令
    • 第一个脚本
  • Bash基本功能
    • 历史命令与补全
      • history 历史命令
      • 命令与文件补全
    • 别名和快捷键
      • 设置别名
      • 删除别名:
      • 快捷键
    • 输入输出重定向
      • 输出重定向
      • 输入重定向
    • 多命令顺序执行与管道符
      • dd 复制命令(可以复制分区或者硬盘内的所有内容到另外一个地方)
      • 管道符
    • 通配符和其他特殊符号
      • 通配符
      • 其他特殊符号
    • Bash变量
      • 用户定义变量(本地变量)
        • 定义变量
        • 变量叠加
        • 变量的调用
        • 查看变量(查看系统所有的变量)
        • 删除变量
      • 环境变量
        • 查询变量
      • 位置参数变量
      • 预定义变量
    • Bash的运算符
      • 数值运算与运算符
      • 变量测试与内容替换
    • 环境变量配置
      • source命令
      • 环境变量配置文件
        • 其他环境变量配置文件:
        • 登录信息配置文件

shell就是命令解释器,也是一种编程语言,它的作用是与内核沟通,建立应用与内核的交流桥梁,形象的成为内核的壳(shell)

shell 分类

  • Boirne shell

    • sh
    • ksh
    • Bash
    • psh
    • zsh
  • C shell
    • csh
    • tcsh

B shell 与 C shell语法完全不同,不兼容,Linux系统使用的标准shell是B shell家族中的Bash,它与sh(B sh)完全兼容。

查看Linux支持的shell:

[jiaojian@XYLJ stdio]$ vim /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/zsh
~

shell脚本执行方式

echo基本输出命令

echo [选项] [输出内容]

  • -e :支持反斜线控制的字符转换

[jiaojian@XYLJ stdio]$ echo 'ab\bc'
ab\bc
[jiaojian@XYLJ stdio]$ echo -e 'ab\bc'
ac
[jiaojian@XYLJ stdio]$ echo -e '\e[1;31m abcd \e[0m'abcd    <---红色输出

颜色输出是用特定格式‘\e[1;’表示开始用颜色,‘31m’表示色号,‘abcd’表示输出的内容,’\e[0m’表示结束颜色输出。

30m=黑色;31m=红色;32m=绿色;33m=黄色;34m=蓝色;35m=洋红;36m=青色;37m=白色;

echo命令就像是c语言里面的printf函数,是基本输出函数。

第一个脚本

首先,创建脚本文件时,后缀名最好取为‘.sh’,Linux是不区分后缀名的,但是后缀名可以为我们提供一些信息,vim里面打开.sh文件他会尝试将脚本程序加上颜色标识,这样便于人阅读纠错,Linux本身是对后缀不敏感的。

[root@XYLJ shell]# vim hello.sh#!/bin/Bash    <--这里不是注释,而是说明后面的语句是bash语句,后面的#才是注释
#The first program
# Author:jiaojain echo -e 'Mr.Shen Chao is the most honest man in LampBrother'

写脚本时,第一句话为:#!/bin/bash

在Linux里面,配置文件里#后面为注释,但是唯一这一句不是注释内容,为表明以下语句为Bash语句。

方法一:

赋予脚本执行权限,再用命令行直接运行。

执行步骤:

  • 先给脚本赋予执行权限。‘chmod 755 hello.sh’。Linux系统给新建文件都只有可读写权限,默认不会给与可执行权限,这也是Linux系统比较安全的原因之一,可执行权限只有人赋予权限后才可以执行。
  • 再执行脚本,用绝对路径或者用相对路径都可以。

在Linux系统中,万物都为文件,命令也是文件,在敲Linux命令时,比如ls命令,其实ls的意思为/bin/ls,他是ls命令文件的绝对路径,是执行这个文件来实现ls命令的,使用Linux系统命令行中开始第一个字段都是命令或者可执行文件的目录,其实都是可执行文件的绝对路径,只是命令是由环境变量简化不需要写出完整的路径。

方法二:

用bash命令调用脚本文件,这里就不需要脚本文件本身有可执行权限了

[root@XYLJ shell]# bash hello.sh
Mr.Shen Chao is the most honest man in LampBrother
[root@XYLJ shell]# cat -A hello.sh
#!/bin/bash$
#The first program$
# Author:jiaojain $
$
echo -e 'Mr.Shen Chao is the most honest man in LampBrother'$

cat指令是查看文件内容,-A选项是表示查看所有内容包含隐藏符号,可以看见,用cat -A打开脚本文件后,出现了‘’符号,这个符号在bash里面表示换行符号,在win端shell里面编写shell脚本文件时,换行符与bash里面不一样为′M’符号,这个符号在bash里面表示换行符号,在win端shell里面编写shell脚本文件时,换行符与bash里面不一样为'^M’符号,这个符号在bash里面表示换行符号,在win端shell里面编写shell脚本文件时,换行符与bash里面不一样为′M'所有在win上编的shell脚本是不可以直接拿到Linux里面执行的,会报错,所以需要转换一下格式,使用的命令为dos2unix命令,格式为‘dos2unix [参数,文件名]’。

Bash基本功能

历史命令与补全

history 历史命令

history [选项] [历史命令保存文件]

  • -c:清空历史命令
  • -w:强制把缓存中的历史命令写入历史命令保存文件,历史命令默认存放在各用户的家用户里面的.bash_history目录下,如~/.bash_history,不同用户的历史命令记录存放的位置不同。

一般都存放在默认位置比较好,还有清空历史命令这一个操作也不要随便使用,不太建议使用,除非极其特殊的情况。

历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改

[root@XYLJ shell]# vim /etc/profile# /etc/profile# System wide environment and startup programs, for login setup
# Functions and aliases go in /etc/bashrc# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.pathmunge () {case ":${PATH}:" in*:"$1":*);;*)if [ "$2" = "after" ] ; thenPATH=$PATH:$1elsePATH=$1:$PATHfiesac
}
...
HOSTNAME=`/usr/bin/hostname 2>/dev/null`
HISTSIZE=1000  <--表示历史命令储存的空间大小为1000条,这里可以改大些无所谓
...

可以修改文件内的HISTSIZE的值来更改历史命令储存的大小,默认设为1000条,我们可以改大些,10000条100000条都可以。

历史命令的调用:

  • 使用上下箭头调用以前的历史命令
  • 使用"!n",n表示历史命令的序号,再次执行序号为n的历史命令
  • 使用"!!"再次执行上一条命令
  • 使用“!字串”重复执行最后一条以该字串开头的命令
  772  wget http://www.tuxera.com/community/ntfs-3g-download/773  ll774  rm index.html.1 775  ll776  tar -zxvf index.html 777  ll778  rm index.html 779  ll780  fdisk -l781  cd /dev/782  ll783  shutdown -r now784  last785  df -h786  mount787  man fopen()788  man fopen789  man 3 fopen790  shutdown -h now791  cd /tmp/study/792  ll793  mkdir shell794  ll795  cd shell/796  ll797  vim hello.sh798  hell0.sh799  vim hello.sh800  ll801  vim hello.sh802  chmod 755 hello.sh 803  ./hello.sh 804  vim /bin/shells805  vim /etc/shells 806  ./hello.sh 807  vim /etc/shells 808  vim hello.sh809  ./hello.sh 810  bash hello.sh 811  yum -y install dos2unix812  cat -A hello.sh 813  vim /etc/profile814  history
[root@XYLJ shell]#
如果我想执行802号命令,我可以!802,或者!chm,他会匹配最后一条以chm开头的命令。

命令与文件补全

单击Tab键为补全,双击为列出补全可能的文件或命令名字

别名和快捷键

设置别名

alias 别名=‘原命令’

比如将vim命令改为vi1,就是定义一个别名,将vi1变为vim的别名。这样设置后,以后敲vi1就相当于输入vim

查询别名信息,直接用alias

[root@XYLJ shell]# alias
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
[root@XYLJ shell]# 

系统也默认了一些命令别名,比如以前经常用的ll命令其实是ls-l的别名,他们其实是同一个命令,只是名字 不一样效果一模一样。别名最大的好处是让系统按照你的习惯来进行命令输入操作。

别名的优先级比path环境变量定义的命令还要高,只比使用路径来执行命令文件本身低一级。

想要别名永久生效,那么就要修改对应的配置文件,该文件为/root/.bashrc。

[root@XYLJ shell]# vim /root/.bashrc
# .bashrc
# User specific aliases and functionsalias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'# Source global definitions
if [ -f /etc/bashrc ]; then. /etc/bashrc
fi

删除别名:

unalias 别名

快捷键

输入输出重定向

输出重定向

标标准输入输出

设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtiut 1 标准输出
显示器 /dev/sdterr 2 标准错误输出

输出重定向是将命令或者脚本的运行结果保存到特定文件里,而不是像以前一样打印出一串字符到屏幕,只是临时展现到屏幕上,结果无法永久保存下来,执行完后就会被清空。

输出重定向的前提是需要前一个命令有输出。

  • 标准输出重定向:

命令 > 文件

以覆盖的方式,把命令的正确输出输出到指定的文件或者设备当中。

命令 >> 文件

以追加的方式,把命令的正确输出输出到指定的文件或者设备当中。

  • 标准错误输出重定向:

错误命令 2> 文件

以覆盖的方式,把命令的错误输出输出到指定的文件或者设备当中。(2与>之间没有空格)

错误命令 2>> 文件

以追加的方式,把命令的错误输出输出到指定的文件或者设备当中。

  • 正确输出和错误输出同时保存

命令 > 文件 2>&1

命令 &> 文件

以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中。

命令 >> 文件 2>&1

命令 &>> 文件

以追加的方式,把正确输出和错误输出都保存到同一个文件当中。

命令 >> 文件1 2>> 文件2

把正确的输出追加到文件1中,把错误的输出追加到文件2中。

输入重定向

与输出重定向相反的就是输入重定向,他的作用是将文件的内容 当作命令的输入,而不伤键盘输入当做输入源了,用的比较少。比如用wc命令来用一下输入重定向。

wc 统计文件内行数,单词数,所占字节数。

  • -c :统计字节数
  • -w :统计单词数(以空格为标准)
  • -l :统计行数

单独敲wc没带选项为输出上面三个数据。行数,单词数,字节数。

输入重定向:

命令 < 文件

[root@XYLJ tmp]# wc < yum_save_tx.2021-11-18.20-49.pXdns8.yumtx 134  280 3945
[root@XYLJ tmp]# 

多命令顺序执行与管道符

多命令执行符 格式 作用
命令1 ; 命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1&&命令2 逻辑与,当命令1正确执行,则命令2才会执行,当命令1执行不正确,则命令2不会执行
|| 命令1 || 命令2 逻辑或,当命令1正确执行,则命令2不会执行;当命令1不正确执行,则命令2才会执行

dd 复制命令(可以复制分区或者硬盘内的所有内容到另外一个地方)

dd if=输入文件 of=输出文件 bs=字节数 c0unt=个数

  • if=输入文件 :指定源文件或者源设备
  • of=输出文件 :指定目标文件或者目标设备
  • bs=字节数 :指定一次输入/输出多少字节,即把这些字节看做一个数据块
  • count=个数 :指定输入/输出多少个数据块
[root@XYLJ ~]# date ; dd if=/root/武动乾坤.txt of=/tmp/study/xiaosuo.100m bs=1k count=100000 ; date
2021年 11月 26日 星期五 11:42:05 CST
记录了12276+1 的读入
记录了12276+1 的写出
12571502字节(13 MB)已复制,0.0471314 秒,267 MB/秒
2021年 11月 26日 星期五 11:42:05 CST
#这里用date来显示中间命令所用的时间,这里时间太短所以没有表现出来。

管道符

命令1 | 命令2

命令1的正确输出作为命令2的操作对象。

通配符和其他特殊符号

通配符

通配符 作用
匹配一个任意字符
* 匹配0个或者任意多个字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。例如:[abc]表示一定匹配一个字符,或者是a。或者是b,或者是c。
[-] 匹配中括号中任意一个字符,-代表一个范围。例如[a-z]代表匹配一个小写字母。
[^] 逻辑非,表示匹配不是中括号内的一个字符。例如[^0-9]代表匹配一个不是数字的字符。代表取反。

?以及[]都是表示匹配一个字符,必须是一个字符,不能是空字符,*可以匹配空字符。

用法:

比如要删除文件夹内的所有文件:rm -rf /tmp/study/*

rm -rf命令不要瞎用,一不小心会吧整个根目录删除掉。

比如我需要列出文件夹下以数字开头的,以.abc结尾的文件:ls -hl [0-9]*.abc

其他特殊符号

符号 作用
‘ ’ 单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义
“ ” 双引号。在双引号中特殊符号都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义。
`` 反引号。反引号括起来的内容是系统命令,在Bash中先执行它。和()作用一样,不过推荐使用()作用一样,不过推荐使用()作用一样,不过推荐使用(),因为反引号非常任意看错。
$() 和反引号作用一样,用来引用系统命令。
# 在shell脚本中,#开头的行表示注释。
$ 用于调用变量的值,如果要调用变量name的值时,需要用$name的方式得到变量的值。
\ 转义字符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出“$”符号,而不是当做是变量引用。

Bash变量

变量类型

  • 用户自定义变量(本地变量):变量名、变量的值、变量的内容都可以自由定义。
  • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。环境变量可以允许用户去添加环境变量,并且自己取名赋值,但是对于系统默认的环境变量来说,值可以改,但是名字不可以改,因为名字是系统定义好的。
  • 位置参数变量:这种变量主要是用来向脚本当中传递参数或者数据的,变量名不能自定义,变量作用是固定的,即只能更改它的值,并且它的作用都不能改,同时不可新建。
  • 预定义变量:是Bash中已经定义好了的变量,变量名不能自定义,变量作用也是固定的与位置变量一样,只能改值,其余都不可,位置参数变量是预定义变量的一种。

什么是变量?

变量是计算机内存的单元,其中存放的值可以改变。当shell脚本需要保存一些信息时,如一个文件名或者是一个数字,就把它存放在一个变量中,每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。

变量的命名规则:

  • 变量名字由字母、数字和下划线组成,但是不能由数字开头,否则会报错。
  • 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须修指定变量类型为数值型。
  • 变量用等号连接值,等号左右两侧不能有空格。
  • 变量的值如果有空格,需要使用单引号或者双引号包括
  • 在变量的值中,可以使用“\”转义字符。
  • 如果需要增加变量的值那么可以进行变量值的叠加。不过变量需要使用双引号包含“变量名”或者用变量名”或者用变量名”或者用{变量名}包含、
  • 如果把命令的结果作为变量值赋予变量,则需要使用反引号或者$()包含命令
  • 环境变量名建议大写,便于区分。
[root@XYLJ study]# jiaojian=123
[root@XYLJ study]# echo $jiaojian
123
[root@XYLJ study]# jiaojian="$jiaojian"456
[root@XYLJ study]# echo $jiaojian
123456
[root@XYLJ study]# 

用户定义变量(本地变量)

定义变量

变量名=变量值

如果变量值内有空格需要用双引号包含起来。

变量叠加

变量名=“$变量名”需加的变量值

需加的变量值前不能有空格。

变量的调用

echo $变量名

查看变量(查看系统所有的变量)

set

删除变量

unset 变量名

环境变量

环境变量包含系统环境变量和自定义环境变量(即后面自己定义的),环境变量是不可改变其名字的,可以改变 它的值。

用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和这个shell的所有子shell当中生效。如果把环境变量写入相应的配置文件那么下这个环境变量就会在所有的shell中生效。

声明变量:

export 变量名=变量值声明环境变量再初始化定义

export 变量名声明环境变量,可以将已经存在并且有值的本地变量改为环境变量

export的意思是将这个变量是,声明为环境变量,让当前shell的所有的子shell都可以使用。

使用pstree指令可以查看当前系统的进程树,其中就可以看见当前的shell是在哪一层shell里面。

[root@XYLJ ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]├─NetworkManager─┬─dhclient│                └─2*[{NetworkManager}].......├─run_erl───beam.smp─┬─erl_child_setup─┬─cpu_sup│                    │                 ├─inet_gethost───inet_gethost│                    │                 ├─memsup│                    │                 └─sh│                    └─51*[{beam.smp}]├─smartd├─sshd───sshd───sshd───bash───su───bash───bash───pstree├─systemd-journal├─systemd-logind├─systemd-udevd├─tracker-store───7*[{tracker-store}]├─tuned───4*[{tuned}]├─udisksd───4*[{udisksd}]├─upowerd───2*[{upowerd}]├─vmtoolsd───{vmtoolsd}├─vmtoolsd├─wpa_supplicant└─xdg-permission-───2*[{xdg-permission-}]
[root@XYLJ ~]# 

可以看见当前是├─sshd───sshd───sshd───bash───su───bash───bash───pstree,

sshd是当前是用远端ssh访问系统的,su为切换用户时shell改变,

查询变量

env

删除变量与本地变量一样。

比较重要的环境变量:

PATH

PS1(它是环境变量的子分支在env内看不见)

[root@XYLJ bin]# env
XDG_SESSION_ID=507
HOSTNAME=XYLJ
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
USER=root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/bin
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
HOME=/root
SHLVL=2
LOGNAME=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
LESSOPEN=||/usr/bin/lesspipe.sh %s
DISPLAY=localhost:10.0
XAUTHORITY=/root/.xauths9qLde
_=/bin/env
OLDPWD=/root
[root@XYLJ bin]#

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

PATH为以:分割的一个一个路径,为系统查找命令的路径

[root@XYLJ bin]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@XYLJ bin]# mkdir /root/sh
[root@XYLJ ~]# PATH="$PATH":/root/sh
[root@XYLJ ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/sh

Linux里面执行可执行程序或者文件都是以绝对路径或者相对路径来执行,命令也是一种可执行文件(二进制2文件),那么为什么在执行命令时没有输入绝对路径或者相对路径呢?那是因为系统将命令所在的路径都加到PATH里面,变成环境变量,在比如ls这个命令文件本身的路径为/bin/ls,在终端输入ls按下回车,系统首先会在当前目录下查找ls,如果有会执行若没有则会扫描PATH里面记录的路径下是否有ls,有执行,没有则报出没有找到命令的错误信息。还有Tab键的命令补全也是依赖于PATH中的路径。

PATH="$PATH":/root/sh将/root/sh文件路径加入PATH下,这样一来在任何目录下都可以直接执行sh下的可执行程序了,就像命令一样,但是这样用命令行添加的PATH只会暂时生效,需要永久生效需要更改配置文件。

[root@XYLJ ~]# echo $PS1
[\u@\h \W]\$
[root@XYLJ ~]# 

位置参数变量

[root@XYLJ sh]# cat canshu1.sh
#!/bin/bashecho $0
echo $1
ech0 $3
echo $2
echo $5
[root@XYLJ sh]# vim canshu1.sh
[root@XYLJ sh]# ./canshu1.sh
./canshu1.sh[root@XYLJ sh]# ./canshu1.sh 11 22 33 44 55
./canshu1.sh
11
33
22
55
[root@XYLJ sh]#

$n位置参数是接收命令的参数,与函数里面形式参数作用差不多,接收后可以在脚本内使用,$0表示的是命令本身,不算在参数里面,使用参数的个数是从$1开始的。位置参数的意思为用位置的方式把命令参数传给命令内部,但是这样有缺陷,只有写命令或者脚本的人才知道命令后面会跟几个参数,参数类型是怎样的,其他用户看不见。

预定义变量


命令后加&符号,意思为将该命令放到后台运行。

Bash的运算符

数值运算与运算符

首先需要再次声明一点,在Bash里面,对变量进行赋值,其默认的类型为字符串型,没有int型或者别的型,所以不能简单的用±*/这些运算符处理我们认为的数字,因为系统会将他们视为字符串,在字符串里没有运算概念,±*/符号对于系统来说跟123,SSD等一样都是字符串。

55
[root@XYLJ sh]# aa = 11
bash: aa: 未找到命令...
[root@XYLJ sh]# aa=11
[root@XYLJ sh]# bb =22
bash: bb: 未找到命令...
[root@XYLJ sh]# bb=22
[root@XYLJ sh]# cc=$aa + $bb
bash: +: 未找到命令...
[root@XYLJ sh]# cc="$aa + $bb"
[root@XYLJ sh]# dd=$aa+$bb
[root@XYLJ sh]# echo $cc
11 + 22
[root@XYLJ sh]# echo $dd
11+22
[root@XYLJ sh]# 

系统对变量的赋值符号为=,在赋值时不可有空格,在Linux系统中空格是命令参数分割的标志,所以注意使用,上面的例子中,运算符号在里面并没有起到运算的作用,而是被系统识别为一个普通的字符。

数值运算方法:

1.declare声明变量

[root@XYLJ sh]# declare -i cc=$aa+$bb
[root@XYLJ sh]# echo cc
cc
[root@XYLJ sh]# echo $cc
33
[root@XYLJ sh]# 

这里是先将字符类型11赋予aa,22赋予bb,再声明变量cc为int类型,再进行计算,Bash也支持运算符。

2.采用expr或者let数值运算工具

[root@XYLJ sh]# dd=$(expr $aa+$bb)
[root@XYLJ sh]# echo $dd
11+22
[root@XYLJ sh]# dd=$(expr $aa + $bb)
[root@XYLJ sh]# echo $dd
33
[root@XYLJ sh]# 

特别注意,在用expr运算命令时,运算符号两侧空格不可省略,不然还是为字符串类型简单相连。

3.“((运算式))”或者“((运算式))”或者“((运算式))”或者“[运算式]”

[root@XYLJ sh]# echo $(($aa+$bb))
33
[root@XYLJ sh]# echo $(($aa + $bb))
33
[root@XYLJ sh]# 

一般都是使用方法3进行数值运算,前面说到(),(),(),符号后面加一个括号()表示引用括号内系统命令,这里是两个括号表示双括号内为运算式,所以加不加空格都无所谓。

数值越大优先级越高,数值越小优先级越低,其中还是与普通的数学计算里的优先级规则差不多,小括号括起来会提高优先级。

变量测试与内容替换

这一块不需要深入了解,看懂就行,因为记住下面的表格太麻烦,不划算,不如直接用if语句来实现。

这个表格的意思是通过变量x来判断变量y是否有值或者为空,其实可以用if判断语句实现,只是这是bash自带的效率更快的判断方式。

环境变量配置

在设置环境变量时,前面使用的命令为export,但是这是临时生效,而且其作用域不大,是当前bash,需要其永久生效需要修改配置文件。

source命令

source 配置文件

或者==. 配置文件==
其中.加空格与source的效果一样。
这个命令是让修改后的配置文件立即生效,而不是需要重启系统才生效(这里不是说修改后没其作用,而是有些改变需要重新登录才有效,这个命令是让系统重新扫描一次配置文件,让配置文件永久生效)。

环境变量配置文件

环境变量配置文件简介:
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等等默认环境变量。注意环境变量一般都是大写,自己添加环境变量也要遵循这个习惯。

配置文件地址(系统默认的环境变量):

  • /etc/profile

  • /etc/profile.d/*.sh (有系统语言的定义)

  • ~/.bash_profile 这里~代表root的home目录,其他用户也一样这里就用~泛指用户家目录

  • ~/.bashrc(有别名的定义)

  • /etc/bashrc(主要有提示符的定义PS1)

其中也区分用户,/etc路径下为系统的环境变量目录,改变后是对系统所有人都生效,而~/或者用户home目录下的.bashrc和.bash_profile文件只是对单个用户有效。可以看看用户家目录下是否有这些配置文件。

[root@XYLJ jiaojian]# ls -alh /home/jiaojian
总用量 800K
drwx------. 23 jiaojian jiaojian 4.0K 11月 30 11:26 .
drwxr-xr-x.  5 root     root     4.0K 11月 16 17:16 ..
-rw-r--r--.  1 root     root      148 11月  4 14:43 002.tar.gz
-rw-r--r--.  1 root     root     655K 11月  5 16:30 20211105.test
-rw-------.  1 jiaojian jiaojian 1.6K 11月 26 20:09 .bash_history
-rw-r--r--.  1 jiaojian jiaojian   18 4月  11 2018 .bash_logout
-rw-r--r--.  1 jiaojian jiaojian  193 4月  11 2018 .bash_profile
-rw-r--r--.  1 jiaojian jiaojian  231 4月  11 2018 .bashrc
drwxrwxr-x. 21 jiaojian jiaojian 4.0K 10月 31 15:35 .cache
drwxrwxr-x. 17 jiaojian jiaojian 4.0K 10月 31 15:35 .config
drwx------.  3 jiaojian jiaojian 4.0K 10月 30 18:08 .dbus
-rw-------.  1 jiaojian jiaojian   16 10月 30 18:08 .esd_auth
-rw-r--r--.  1 jiaojian jiaojian   24 10月 30 18:53 .gitconfig
drwx------.  2 jiaojian jiaojian 4.0K 10月 31 15:16 .gnupg
-rw-------.  1 jiaojian jiaojian   34 11月 25 16:26 .history
-rw-------.  1 jiaojian jiaojian 1.3K 10月 31 15:58 .ICEauthority
drwxrwxr-x.  3 jiaojian jiaojian 4.0K 11月 23 20:49 linux_c
drwx------.  3 jiaojian jiaojian 4.0K 10月 30 18:08 .local
drwxr-xr-x.  5 jiaojian jiaojian 4.0K 10月 31 15:11 .mozilla
drwxr-xr-x. 12 jiaojian jiaojian 4.0K 10月 30 18:01 .oh-my-zsh
drwx------.  3 jiaojian jiaojian 4.0K 10月 31 15:35 .pki
drwx------.  3 jiaojian jiaojian 4.0K 10月 30 18:08 .redhat
drwx------.  2 jiaojian jiaojian 4.0K 10月 31 15:16 .ssh
drwxr-xr-x.  2 root     root     4.0K 11月  3 16:27 test
drwxr-xr-x.  2 jiaojian jiaojian 4.0K 11月  8 16:27 .tmp
-rw-------.  1 jiaojian jiaojian 3.7K 11月 25 16:25 .viminfo
-rw-rw-r--.  1 jiaojian jiaojian  368 10月 30 18:47 wget-log
-rw-------.  1 jiaojian jiaojian  100 11月 30 11:26 .Xauthority
-rw-r--r--.  1 jiaojian jiaojian 4.0K 10月 30 18:52 .zshrc
drwxr-xr-x.  2 jiaojian jiaojian 4.0K 10月 30 18:08 公共
drwxr-xr-x.  2 jiaojian jiaojian 4.0K 10月 30 18:08 模板
drwxr-xr-x.  2 jiaojian jiaojian 4.0K 10月 30 18:08 视频
drwxr-xr-x.  2 jiaojian jiaojian 4.0K 10月 30 18:08 图片
drwxr-xr-x.  2 jiaojian jiaojian 4.0K 10月 30 18:08 文档
drwxr-xr-x.  3 jiaojian jiaojian 4.0K 10月 31 15:13 下载
drwxr-xr-x.  2 jiaojian jiaojian 4.0K 10月 30 18:08 音乐
drwxr-xr-x.  2 jiaojian jiaojian 4.0K 10月 30 18:08 桌面
[root@XYLJ jiaojian]# 

系统启动时会自动读取环境变量配置文件,这一过程是在系统准备阶段完成的,也是在提示符出现前完成的(其实提示符的内容也是环境变量定义的)。

/etc/profile的作用:

  • USER变量
  • LOGNAME变量
  • MAIL变量
  • PATH变量
  • HOSTNAME变量
  • HISTSIZE变量
  • umask
  • 调用/etc/profile.d/*.sh文件,和~/.bash_profile文件

/etc/bashrc的作用:

  • 定义提示符内容即 PS1变量
  • umask
  • PATH变量
  • 调用/etc/profile.d/*.sh文件

配置文件的调用顺序是由区别的,当用户以用户名及密码登录时到/etc/bashrc那里后就直接进入系统了,但是如果用户是通过bash指令打开一个新的bash窗口,则/etc/bashrc会回去调用/etc/profile.d/*.sh文件,这里/etc/bashrc文件相当于起始配置文件/etc/profile的另外一个补充,补充通过bash打开窗口的情况,内容是起补充作用。

其他环境变量配置文件:

1.注销时生效的环境变量配置文件

  • ~/.bash_logout
    ~泛指用户家目录

2.历史命令配置文件

  • ~/.bash_history

cat ~/.bash_history与直接输入history指令查询历史指令的结果不相同,原因是~/.bash_history文件是在系统注销时将内存里的命令history记录到文件中,而history指令是将文件中记录的历史命令和内存中缓存的历史命令一起展现给用户。

登录信息配置文件
  • /etc/issue 是对于本机登录有效的登录信息提示
[root@XYLJ etc]# vim /etc/issue\S
Kernel \r on an \m

  • /etc/issue.net是远程登录终端欢迎信息配置文件,前面的转义字符到这里就无效了,需要配置ssh协议信息才生效,但是也无法识别前面的转义符。

  • 登录后欢迎信息:/etc/motd
    不管是本地登录还是远程登录都可以显示欢迎信息

Linux学习06---shell基础相关推荐

  1. linux学习之shell基础篇

    1.shell简介 shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层.当从shell或其他程序向Linux传递命令时,内核会做出相 ...

  2. Linux学习随笔(基础篇)-- 文件权限

    Linux学习随笔(基础篇)-- 文件权限 小土豆Linux学习随笔 -- 清听凌雪慕忆

  3. 在笔记本上搭建高性价比的 Linux 学习环境:基础篇

    本篇文章会尽可能详细的介绍如何在相对廉价的笔记本上搭建高性价比的 Linux 学习环境,让学习和工作都轻松和高效一些.尤其是针对国内网络环境下,如何快速的完成系统的安装和基础配置. 使用 Linux ...

  4. Linux 学习笔记 2022-11-12---------Linux基础

    目录 1. 用户类型 2. 终端 terminal 2.1 终端类型 2.2 查看当前的终端设备 3. 交互式接口 3.1 交互式接口类型 3.2 什么是shell 3.3 Shell 是如何连接用户 ...

  5. Linux学习:Shell编程总结

    在学习L为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是shell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集,而且是一门非常棒的编程语言.您可以通过使用 ...

  6. 总结:linux 学习之 shell 脚本编写

    一.Shell 脚本编写规范 1.一个规范的 Shell 脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在 Linux bash 的编程一般为:#!/bin/bash  或 #! ...

  7. Linux学习笔记-最基础的常用shell命令

    目录 Shell基本命令 1.history 2.!! 3.alias 4.unalias 5.ls 6.">"与"<",">> ...

  8. shell学习之shell基础知识了解

    一.了解bash shell /etc/bash是Linux系统预设的shell.bash是GNU计划中重要的工具软件之一,目前也是Linux distributions的标准 shell. Shel ...

  9. Linux学习之01_基础命令介绍

    初学Linux,还在摸索中,在这个过程中希望能记录下学习到的东西,参考的的书籍为<鸟哥的Linux私房菜> 在这里学到的主要命令有这几个: data cal bc man shutdown ...

  10. linux脚本是什么语言,Linux学习之Shell脚本语言的优势是什么?

    当我们学习Linux技术的时候,会涉及各种各样的知识和内容,比如说shell脚本语言,我想很多人都会疑惑shell脚本语言有什么优势?为何学习Linux的时候必须学习呢?我们来看看吧. 当命令和程序语 ...

最新文章

  1. 卡联科技与正元地理合作 打造智慧城市
  2. mac php7 mysql.so_mac下安装php7详解
  3. SpringBoot AutoConfiguration魔术如何工作?
  4. 使用 docker 搭建 nginx+php-fpm 环境 (两个独立镜像)
  5. react让我怀疑自己没有当程序员的天分怎么破?
  6. 2018年12月份GitHub上最热门的Java开源项目
  7. Ajax进入ERROR的部分条件总结
  8. linux如何装回工具包,如何找到linux工具软件对应的安装软件包----用which+dpkg 实现...
  9. 使用jQuery+huandlebars遍历中if判断
  10. 使用海康H5视频播放器开发包实现监控播放
  11. Opencv3 core模块解析之convertTo
  12. 前端 - token 是什么?为什么每次请求头(HEADS)里要携带它?
  13. 乔布斯的创新故事_创新工作的真实故事
  14. 许晓斌_Maven实战(八)——常用Maven插件介绍(下)
  15. 开发软件费用为什么这么贵?
  16. 10.6版本的CodeWarrior 的使用手册
  17. 简述python在量化金融中应用_Python金融量化
  18. 被Win10自带杀毒软件自动误删除的exe从这里找
  19. ipad无法更新最新版本ipadOS 16、不再连接到互联网解决方法
  20. contenteditable H5聊天室发送表情

热门文章

  1. PDF box 结合POI 将pdf转为PPT
  2. 2017年7月历史文章汇总
  3. 【Linux】页表的深入分析
  4. AutoSAR系列讲解(实践篇)9.4-通信相关机制(下)
  5. JavaScript进阶
  6. Java版本 图书管理系统
  7. Echarts修改图例legend文字颜色和字体大小
  8. BugkuCTF-web-秋名山车神 writeup
  9. 网易传媒计算机视觉算法实习生面试总结
  10. mysql-readme