1. Shell变量的定义及其使用
1. shell变量
shell有两种变量:环境变量和临时变量。环境变量是永久性变量,不会随shell脚本的执行结束而消失。临时变量是在shell程序内部定义的,其使用范围仅限于定义它的程序,出了本程序就不能再用它:而且当程序执行完毕,它就不存在了。
在shell脚本中临时变量又分为两类:用户定义的变量和位置参数。
(1)用户定义的变量
用户定义的变量是最普通的shell变量,变量名是以字母或下划线开头的字母、数字和下划线序列,并且大小写字母的意义不同。变量名的长度不受限制。定义变量并赋值的一般形式是:
变量名=字符串
例如:
myfile=/usr/meng/ff/ml.c
其中myfile是变量名,=是赋值号,字符串/usr/meng/ff/ml.c是赋予myfile 的值。注意,在赋值语句中,赋值号的两边没有空格,否则在执行时会引起错误。
变量的值可以改变,只需要利用赋值语句重新给它赋值即可。例如:
myfile=/home/shenwq/ex1
此时变量myfile的值就是/home/shenwq/ex1。
在程序中使用变量的值时,要在变量名前加上一个符号“$"。这个符号告诉shell读取该变量的值。
1)定义并显示变量的值。输入以下命令行,观察执行结果(下面示例中行首的“$”表示系统的提示符)。
$ dir=/home/shenwq/file1
$ echo $dir # (显示变量dir的值)
$ echo dir #(dir只是作为普通字符串,因为它前面,没有“$"符号)
$ today=Sunday
$ echo $today $Today
$ str="Happy New year!" #(双引号中包括!号,执行失败,可能是由于 H - histexpand 模式打开了,可先执行命令:set +H;或,改为单引号)
$ echo "Wish You $str"
2) read 命令。在前面例子中已使用过echo命令,它将其后的参数在标准输出(即屏幕) 上输出,各参数间以空格隔开,以换行符终止。
作为交互式输入手段,可以利用read命令由标准输入(即键盘)上读取数据,然后赋给指定的变量。其一般格式是: read变量1[变量2…]
输入以下命令行,观察执行结果:
$ read name
shenwq
$ echo “my name is $name.”
$ read a b c
gpnu edu cn
$ echo "Host: www.$a.$b.$c"
利用read命令可以交互式地为变量赋值。输入数据时,数据间以空格或制表符作为分隔符。
【注意】
a.若变量个数少于数据个数,则从左至右依次给变量赋值,最后一个变量取得所有余下的数据的值。
b.若变量个数多于数据个数,则从左至右依次给变量赋值,后面的变量没有输入数据与之对应时,其值为空串。
(2)位置参数
执行shell脚本时可以使用位置参数。由参数在命令行上的位置确定的参数称为位置参数。
在shell中总共有10个位置参数,其对应名称依次是$0,$1, .... $9。其中$0始终表示命令名或shell脚本名,对于一个命令行,必然有命令名,也必定有$0;其他位置参数依据实际需要可有可无。例如:
cp ml.c m2.c m3.c /home/shenwq
把文件ml.c, m2.c和m3.c拷贝到目录/home/shenwq中,这里位置参数$0、$1、$2、 $3 和$4分 别对应于cp、ml.c、m2.c、m3.c 和/home/shenwq.
[例]位置参数的使用。
在计算机上建立以下3个文件:
文件ml.c:
main()
{
printf ("Begin\n"); #(其功能是显示字符串"Begin")
}
文件m2.c:
include<stdio.h>
main()
{
printf("Ok!\n"); #(显示字符串"Ok")
printf ("End\n"); #(显示字符串"End")
}
文件ex3:
#!/bin/bash
#ex3: shell script to combine files and count lines
cat $1 $2 $3 $4 $5 $6 $7 $8 $9|wc -l
#end
执行以下脚本,观察并分析输出结果:
$ ex3 m1.c m2.c
如图所示,结果输出为10,表示ml.c和m2.c的内容总共为10行。
注:执行ex3前请修改其执行权限:chmod a+x ex3; 如果报找不到ex3,请修改PATH的值,将/home/xxx这个目录添加到PATH,添加方法如下:
- 临时添加(关闭当前shell命令窗口后失效),在命令行执行命令:export PATH=/home/xxx:$PATH
- 用root用户修改/etc/profile文件,在最后一行加入“export PATH=/home/xxx:$PATH”,此处“/home/xxx”为ex3这个脚本文件所在的目录,请根据实际情况修改如下图
修改完成后保存,并执行以下命令(source /etc/profile)使修改立即生效。生效后,当shell执行脚本时,会到PATH中指定的所有路径下查找所指定的命令脚本,若找到则执行脚本;找不到则报错。详细请见下面“(4)环境变量”
(3)预先定义的特殊变量
在shell中,预先定义了几个有特殊含义的shell变量,它们的值只能由shell根据实际情况进行赋值,而不能通过用户重新设置。下面给出几个常用的特殊变量的表示形式及意义。
1) $# 记录传递给shell的参数个数,但不包含shell过程名本身。
[例]改写ex3,使之成为如下形式(ex6);
#!/bin/bash
#ex6: shell script to combine files and count lines
cat $1 $2 $3 $4 $5 $6 $7 $8 $9|wc -l
echo "The number of arguments is $#"
#end
将ex6改为具有执行权限,然后输入以下命令行, 观察并分析输出结果:
$ ex6 ml.c m2.c #(命令行有两个参数)
第二个输出 The number of arguments is 2 表示传递给脚本的参数数量是 2。
2) $? 最后一条命令执行后的退出状态(也称作“返回值")。它是一个十进制数,多数命令执行成功之后,返回值为0; 如果执行失败,则返回非0值。
请输入以下命令,观察并分析输出结果:
$ pwd
$ echo $?
$ cd liu0000
$ echo $?
3) S* 表示在命令中实际给出的所有位置参数的字符串,它并不仅限于9个位置参数。[例]改写ex3,使之成为如下形式(ex7);
#!/bin/bash
#ex7: shell script to combine files and count lines
cat $1 $2 $3 $4 $5 $6 $7 $8 $9|wc -l
echo $*
#end
将ex7改为具有执行权限,然后输入以下命令行,观察并分析输出结果:
$ ex7 m1.c m2.c
如图所示,输出10,以及位置参数ml.c与m2.c。
(4)环境变量
环境变量是shell本身定义的变量,这组变量由shell本身维护和使用,它们往往与用户运行的环境有关,如用户主目录、终端类型、命令检索路径等。这些变量中,有一些由shell进行设置,而另一些不必由shell进行设置。所有的环境变量都可由用户自己进行重新赋值。
下面是几个常用环境变量的名字和意义。
- HOME表示用户注册目录名。当用户注册成功时,HOME就成为用户的当前目录。若HOME 的值是/home/shenwq,则cat $HOME/f1将把文件/home/shenwq/f1的内容显示出来。
如图所示将文件file1显示出来。
2) PATH指定shell在查找命令时所需要的检索路径,PATH 是由冒号隔开的有序目录路径名,由shell初始化为:
PATH=:/bin:/usr/bin
其中,等号(=)与第一个冒号之间不含任何路径名(即为空),则表示当前目录。其实,在路径名中任何空位都表示当前目录。若为了在最后才检索当前目录,则对PATH赋值为:
PATH=/bin:/usr/bin:
用户可以在自己的主目录下建立命令目录,并在检索顺序上先于其他3个目录,则赋值方式为:
PATH=$HOME/bin::/bin:/usr/bin
PATH变量通常在用户的.profile文件中设置(在/etc/目录下)。
PS1是指定主提示符的变量。如果该shell是交互式的,则在它等待输入时就用PS1的值作提示。普通用户下PS1的默认值是“$",注意其中包含两个字符个美元符和一个空格。在超级用户下,系统默认PS1的值是“#”。
3) LOGNAME表示用户注册名。
例如:
A. env命令显示当前运行环境的各个环境变量。
$ env
将在屏幕上看到一系列变量及其值。试分析上面所讲变量的值。
XDG_VTNR=1: 表示当前的虚拟终端编号是1。
SSH_AGENT_PID=2115: 表示SSH代理的进程ID是2115,这通常用于管理SSH密钥。
XDG_SESSION_ID=4: 表示当前会话的ID是4。
HosTNAME=localhost.localdomain: 表示当前的主机名是localhost,这是一个通用的名称,通常用于本地机器。
IMSETTINGS_INTEGRATE_DESKTOP=yes: 表示输入法设置集成了桌面环境
VTE_VERSION=5204: 表示使用的虚拟终端仿真器的版本号是5204。
TERM=xterm-256color: 表示终端类型是xterm,支持256色显示。
SHELL=/bin/bash: 表示当前用户使用的shell是bash。
XDG_MENU_PREFIX=gnome-: 表示Gnome桌面环境的菜单前缀。
HISTSIZE=1000: 表示命令历史记录的大小是1000条。
GNOME_TERMINAL_SCREEN=...: 表示Gnome终端的屏幕对象路径。
IMSETTINGS_MODULE=none: 表示没有使用任何输入法设置模块。
USER=lfeifei: 表示当前登录的用户名是lfeifei。
LS_COLORS=...: 这是用于定义ls命令显示文件和目录颜色的环境变量。它包含了一系列的颜色代码,用于不同的文件类型和权限。
SSH_AUTH_SOCK=/run/user/1000/keyring/ssh: 这是SSH认证套接字的路径,用于SSH连接过程中的认证信息交换。
USERNAME=lfeifei: 再次确认当前用户的登录名是lfeifei。
SESSION_MANAGER=local/unix:@/tmp/.ICE-unix/1983, unix/unix:/tmp/.ICE-unix/1983: 描述了当前会话管理器的信息,包括使用的通信协议和套接字路径。
GNOME_SHELL_SESSION_MODE=classic: 表明用户使用的是GNOME桌面环境的classic模式。
PATH=/home/lfeifei/bin:/bin:/usr/bin: 定义了用户可执行文件的搜索路径,首先是用户的个人bin目录,然后是系统的bin和usr/bin目录。
MAIL=/var/spool/mail/lfeifei: 指定了用户邮件存放的路径。
DESKTOP_SESSION=gnome-classic: 再次表明用户使用的是GNOME桌面环境的classic模式。
QT_IM_MODULE=ibus: 设置了Qt应用程序使用的输入法模块是IBus。
XDG_SESSION_TYPE=X11: 表明会话类型是基于X11的图形会话。
PWD=/home/lfeifei: 显示当前工作目录是用户的主目录。
XMODIFIERS=@im=ibus: 与QT_IM_MODULE类似,这是用于X应用程序的输入法设置。
LANG=zh_CN.UTF-8: 设置了默认的语言环境为中文。
GDM_LANG=zh_CN.UTF-8: GDM(GNOME Display Manager)使用的语言环境。
PS1=\u@\h: \w$: 定义了命令行提示符的格式,包括用户名、主机名和当前工作目录。
GDMSESSION=gnome-classic: 与DESKTOP_SESSION和GNOME_SHELL_SESSION_MODE一致,表明使用的是GNOME classic桌面。
HISTCONTROL=ignoredups: 控制命令历史的行为,这里设置为忽略重复的命令。
XDG_SEAT=seat0: 表示使用的是seat0,这通常与图形会话相关。
HOME=/home/lfeifei: 用户的主目录路径。
SHLVL=2: 表示当前shell是第二层,即用户至少启动了一个子shell。
GNOME_DESKTOP_SESSION_ID=this-is-deprecated: 这个变量已被弃用,不应在新应用中使用。
XDG_SESSION_DESKTOP=gnome-classic: 与前面的变量一致,表明使用的是GNOME classic桌面。
LOGNAME=lfeifei: 显示当前登录的用户名。
XDG_DATA_DIRS=...: 定义了程序可以查找数据文件的目录路径。
DBUS_SESSION_BUS_ADDRESS=unix: abstract=...: 描述了D-Bus会话总线的消息总线地址。
LESSOPEN=|/usr/bin/lesspipe.sh %s: 定义了less程序如何打开文件。
B. 改PS1和PATH的值。将主提示符改为注册名:
$ PS1="$LOGNAME> "
在屏幕上会看到,主提示符变为注册名。注意,在“>”号之后有一个空格,整个字符串 要用双引号括起来。
在计算机上,变成以下形式:
shenwq>
在原有PATH的基础上,将主目录添加在其中(设psl又恢复原样):
$ PATH= $PATH: $HOME
- 显示$HOME、$PATH和$LOGNAME的值:
$ echo $HOME $PATH $LOGNAME
home/lfeifei 是 HOME 环境变量的值,表示用户 lfeifei 的主目录。
/home/lfeifei/bin:/bin:/usr/bin:... 是 PATH 环境变量的值,列出了用于查找可执行文件的目录,... 表示可能还有更多目录。
lfeifei 是 LOGNAME 环境变量的值,表示当前登录的用户名。
2.Shell中的特殊符号
shell 中除使用普通字符外,还使用了一些特殊字符, 它们有特定含义,如通配符*、?, 管道线|及单引号、双引号等。在使用时注意它们表示的意义和作用。
(1)通配符
通配符用于模式匹配、路径搜索等。常用的通配符有3种。
1) * 星号。它匹配任意字符的0次或多次出现。例如f*可以匹配f、fa、fl、fa2、ffa.s等,即匹配以f打头的任意字符串。但应注意,文件名前的(.)和路径名中的斜线(/)必须显式匹配。例如,模式“*.profile"才可匹配.profile.模式“/etc*.c"不能匹配在“/etc" 目录下带有后缀“c”的文件,而模式“/etc/*.c" 会匹配这些文件。
2) ? 问号。它匹配任何一个字符。例如,f?可以匹配f1、fa、fb等,但不能匹配f、fabe、f12等。
3) [] 一对方括号。其中有一个字符组,其作用是匹配该字符组所限定的任何-一个字符。 例如,f[abcd]可以匹配fa、fb、 fc 和fd,但不能匹配f、fabc、 f12 等。方括号中的字符组可以由直接给出的字符组成,如上面所示:也可以由表示限定范围的起始字符、终止字符及中间一个连字符(-)组成。例如,f[a-d]与 f[abed]的作用相同。又如f[1-9]与f[123456789]的作用相同,但前者的表示更简捷。
应该注意,连字符仅在一对方括号中表示字符范围,如在方括号外面就成为普通字符了。 但是,前面介绍的字符*和?在一对方括号外面是通配符,若出现在方括号内部,它们就失去了通配符的能力,成为普通字符了。例如,模式“-a[*?]abc",其中只有一对方括号是通配符, 因此它匹配的字符串只是-a*abc和-a?abc.
4) ! 如果它紧跟在一对方括号的左方括号[]之后, 则表示不在一对方括号中所列出的字符。例如,f[!1-9].c 表示以f打头,后面一个字符不是数字1~9的c文件名,它匹配fa.c、 fb.c、fm.c 等。
例如,列出在/bin目录下所有以a打头的命令:
$ ls /bin/a*
$ pwd
$ cat $HOME/ex?
(2)引号
在shell中引号有3种:双引号、单引号和倒引号。
1)双引号(“”)。由双引号括起来的字符,除$、倒引号和反斜线(\)仍保留其特殊功能外,其余字符通常作为普通字符对待。
双引号的作用,请建立以下文件ex8:
echo "current directory is 'pwd'"
echo "home directory is $HOME"
echo "file *.?"
echo "directory '$HOME'"
修改ex8的权限,使其具有执行权限。
执行脚本ex8, 观察并分析输出结果:
$ ex8
如上图所示,ex8里面的pwd显示当前工作目录的完整路径,因为它用倒引号括住,故其被解释为命令行而执行,而$HOME可以成功显示HOME环境变量值,显示用户的主目录,因为$在“”仍然未失效。
2)单引号('')。单引号括起来的字符都作为普通字符出现。例如:
ABC='echo "directory is $HOME"'
其结果是把字符串echo direter is $HOME"作为整体赋给变量ABC.由于使用了单引号,所以命令名echo 以及$HOME都作为普通字符,失去原有的特殊意义。输入并执行以下命令,观察并分析运行结果:
$ echo 'The time is 'date', the file is $HOME/abc'
如上图所示,date与HOME均显示当前日期以及主用户命令,故在验证‘’里面的字符都作为普通字符。
3)倒引号(``)。按“~”键输入。倒引号括起来的字符串被shell 解释为命令行,在执行时,shell 会先执行该命令行,并以它的标准输出结果取代整个倒引号。在前面示例中已经见过。例如:
$ echo current directory is `pwd`
current directory is /home/shenwq
shell执行此命令行时,先执行`pwd`中的命令pwd,将输出结果/home/shenwq取代`pwd`这一部分,最后输出替换后的整个结果。利用倒引号的这种功能可以进行命令置换,即把倒引号括起来的命令的执行结果赋给指定变量。
请执行以下命令,观察并分析运行结果:
$ today=`date`
$ echo Today is Stoday
$ users=`who|wc -1`
$ echo The number of users is $users
将 who 命令的输出通过管道传递给 wc -l 命令的结果赋值给变量 users
(3)反斜线(\)
这是转义字符,它能把特殊字符变成普通字符。例如:
$ echo "Filename is NO\$\*"
Filename is No$ *
如果想在字符串中使用反斜线本身,则必须采用“\”的形式,其中第一个反斜线作为转义字符,从而把第二个反斜线变为普通字符。应注意,在单引号括起来的字符串中,反斜线也成为普通字符,失去转义符的功能。
3.一般控制结构
shell具有一般高级程序设计语言所具有的控制结构和其他复杂功能,如if语句、case 语句、循环语句、函数等。
(1) if语句
if语句用于条件控制结构中,其般格式为:
if 测试条件
then命令1
else命令2
if
其中,if、 then、 else 和fi是关键字。
其执行过程是:先进行条件测试,如果测试结果为真,则执行then后的命令1;否则,执行else之后的命令2。
(2)测试语句。测试语句有两种形式:一种是 test命令,如上所示:另一种是用一对方括号将测试条件括起来。这两种形式是完全等价的。例如,测试位置参数$1是否为已存在的普通文件,也可写为test -f "$1"或写成[-f $1]。
在格式上注意,如果在test 语句中使用shell 变量,为表示完整、避免造成歧义起见,最好用双引号将变量括起来。利用一对括号表示测试时,在左方括号[之后、右方括号]之前应用空格。
test (或一对方括号)的条件测试可分为三类: 文件测试、字符串测试和数值测试。
1)文件测试。下-r、-w、-x选项分别测试对应文件是否可读、可写和可执行。-f、-d分别测试对应文件是普通文件还是目录文件。
2)字符串测试。-z s1、-n sl、s1分别测试字符串s1的长度为0、不为0、不是空串时,测试条件为真。
s1 = s2和s1 != s2分别测试s1和s2相等或不相等,测试条件为真(注意:在=和!=前后必须有空格)
3)数值测试。nl -eq n2、nl -ne n2、n1 -lt n2、nl -le n2、 nl -gt n2、nl -ge n2分别测试 整数nl等于、不等于、小于、小于等于、大于、大于等于整数n2时,测试条件为真。请按以下步骤练习:
1)建立脚本exl0, 如下所示:
#!/bin/bash
echo "Enter your filename"
read filename
if [ -f "$filename" ]
then cat $filename
elif [ -d "$filename" ]
then cd $filename
ls -l *
else echo "$filename:bad filename"
fi
2)修改ex10的权限,使其成为可执行的。
3)执行exl0,并分析显示的结果。
结果显示bad filename表示输入文件名无效,以下是对这个脚本的解释。
#!/bin/bash
这被称为 shebang 行,它告诉系统这个脚本应该用 /bin/bash(Bash shell 的路径)来执行。
echo "Enter your filename"
这行输出提示信息 "Enter your filename" 到终端,请求用户输入一个文件名。
read filename
这个命令读取用户输入的文件名,并将其存储在变量 filename 中。
if [ -f "$filename" ]
这是一个条件语句,检查 filename 变量中存储的文件是否存在,并且是一个常规文件(非目录)。
-f 选项表示 "file",用于检查指定的文件名是否存在并且是一个文件。
then cat $filename
如果上面的条件为真(即存在一个常规文件),则执行 cat $filename 命令,该命令会输出 filename 指定的文件内容到标准输出(通常是终端)。
elif [ -d "$filename" ]
elif 是 "else if" 的缩写,用于检查如果不满足上一个条件,当前条件是否满足。
这个条件语句检查 filename 是否存在并且是一个目录。
-d 选项表示 "directory",用于检查指定的文件名是否存在并且是一个目录。
then cd $filename
如果 elif 条件为真(即 filename 是一个目录),则执行 cd $filename 命令,该命令会尝试切换当前工作目录到 filename 指定的目录。
ls -l *
紧接着的命令 ls -l * 会列出当前工作目录(已经通过 cd 命令切换到 filename 指定的目录)中所有文件的详细列表,包括文件权限、所有者、大小和最后修改时间。
else echo "$filename: bad filename"
如果以上所有条件都不满足(即 filename 不是一个存在的文件或目录),则执行 echo 命令,输出 "bad filename" 并显示用户输入的文件名,表明输入的文件名无效。
fi
这个命令用于结束 if 语句块。
(3) while语句
shell 中有3种用于循环的语句,它们是while语句、for 语句和until 语句。
while语句的一般形式是:
while测试条件
do
命令表
done
其执行过程是:先进行条件测试,如果结果为真,则进入循环体(do-done 之间的部分), 执行其中的命令:然后再做条件测试,直至测试条件为假时才终止while语句的执行。请按以下步骤练习:
1)建立脚本exl1.
#!/bin/bash
while [ $1 ]
do
if [ -f $1 ]
then echo "display: $1"
cat $1
else echo "$1 is not a file name. "
fi
shift
done
2)修改ex11的权限,使其成为可执行的。
3)执行exl1,并分析显示的结果。
这段 Bash 脚本的目的是处理命令行传递给脚本的每个参数。它会检查每个参数是否是一个存在的文件,如果是,脚本会输出该文件的内容;如果不是,脚本会输出一个错误消息。其中shift 命令将脚本的参数向左移动,这意味着下一个 while 循环迭代时,原来的 $2 会变成新的 $1,依此类推。从结果可以看到成功显示文本文件text3的内容,而不存在1这个文件内容。
(4) for 语句
for 语句是最常用的建立循环结构的语句。其使用格式主要有3种,取决于循环变量的取值方式。
格式一:
for变量in值表
do
命令表
done
请将以下命令输入文件后执行,并分析显示的结果:
for day in Monday Wednesday Friday Sunday
do
echo $day
done
脚本首先设置一个循环,其中 day 是循环变量。
在循环体内,脚本使用 echo 命令打印出 day 的当前值。
循环按照列表中的顺序(星期一、星期三、星期五、星期日)逐个处理每个星期名称。
每次循环迭代后,脚本会自动移动到列表中的下一个元素,直到所有元素都被处理完毕。
格式二:
for变量in文件正则表达式
命令表
done
其执行过程是:变量的值依次取当前目录下(或给定目录下)与正则表达式相配的文件名,每取值一次,进入循环体执行命令表,直至所有的文件名取完为止,退出for循环。
例如:
for file in m*.c
do
cat $file | pr
done
该循环语句将当前目录下所有以m打头的C程序文件都按分页格式显示出来。格式三:
for I in $* 或者 for I
do do
命令表 命令表
done done
这两种形式是等价的。其执行过程是:变量I依次读取位置参数的值,然后执行循环体中的命令表,直至所有位置参数完成为止。请按以下步骤练习:
1)建立脚本ex13。
#!/bin/bash
#display files under a given directory
#$1-the name of directory
#$@-the name of the files
dir=$1
if [ -d "$dir" ]
then
cd $dir
shift
for name in $@
do
if [ -f "$name" ]
then cat $name
echo “End of ${dir}/$name”
else echo “Invalid file name: ${dir}/$name”
fi
done
else echo “Bad directory name: $dir”
fi
说明:执行这个shell脚本时,如果第一个位置参数是合法的目录,就把后面给出的各个位置参数所对应的文件显示出来;若输入的文件名不正确,则显示错误信息。如果第一个位置参数不是合法的目录,则显示目录名不正确。
- 执行ex13(如:./ex13 d1 test.txt),并分析运行结果。
这个 shell 脚本的目的是显示一个指定目录下所有文件的内容,如图所示,成功显示了当text3的内容。
4.配置工作环境
Shell 配置文件可以分为系统级别的配置文件和用户级别的配置文件。任何一种 Shell 都有用户级别的配置文件,以及对应的系统级别的配置文件。
- 系统级别的配置文件位于/etc下,这些配置会应用于所有用户。例如/etc/profile,/etc/bashrc。
- 用户级别的配置文件位于用户目录~下,通常会加一个.来隐藏。例如~/.profile,~/.bashrc。
- 在Shell启动时,会首先执行系统级别的配置文件(如果存在的话),再执行用户级别的配置文件。也就是说~/.bashrc中的配置会覆盖/etc/bashrc中的配置。修改这些配置文件后,可通过执行命令:“source 配置文件”的方式使之立即生效,例如:
source /etc/profile
请按下面步骤练习:
- 显示/etc/profile、/etc/bashrc、~/.profile和~/.bashrc文件的内容,了解其大体功能。
用户下有 .bash_profile 而没有 .profile。
这些文件包含 shell 的配置信息。/etc/profile 是全局配置,/etc/bashrc 包含对所有用户的 Bash shell 的设置,~/.profile 和 ~/.bashrc 是针对当前用户的 shell 配置。
- 显示当前工作目录和HOME环境变量的值。把工作目录改为上一级目录,再显示 HOME的值。前后两次结果一样吗?
如图所示,两次结果一样,因为HOME 环境变量通常不变,它在登录时设置,并且通常指向用户的主目录。
- 将工作目录改回主目录。
- 显示PATH环境变量。注意:各目录名是以冒号(:)分开的。
- 将建立脚本的目录从PATH中删除,看看执行脚本时有何问题。
如图所示,删除脚本目录的PATH后,脚本依然可以执行,意味着脚本是通过相对路径执行的,而不是通过 PATH 环境变量。
- 将PS1变量置为注册名,看环境变量有无变化。
- 将PS1恢复成原来位置的值。
5.实验总结
通过本次实验,深入理解了 Shell 命令在操作系统中的作用和重要性。学会了如何查看和编辑文件内容,如何使用 PATH 环境变量来管理可执行文件的搜索路径,以及如何通过 PS1 变量自定义命令行提示符。 也意识到了权限管理在操作系统中的重要性,学会了如何使用 chmod 命令来修改文件权限。此外,通过实验,认识到了环境变量对系统操作的影响,学会了如何通过修改环境变量来影响系统行为。
标签:bin,shell,变量,编程,filename,命令,echo,操作系统 From: https://blog.csdn.net/m0_74139884/article/details/143972325