首页 > 系统相关 >简单shell编程(操作系统实验三)

简单shell编程(操作系统实验三)

时间:2024-11-22 14:45:35浏览次数:3  
标签:bin shell 变量 编程 filename 命令 echo 操作系统

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,添加方法如下:

  1. 临时添加(关闭当前shell命令窗口后失效),在命令行执行命令:export PATH=/home/xxx:$PATH
  2. 用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进行设置。所有的环境变量都可由用户自己进行重新赋值。

下面是几个常用环境变量的名字和意义。

  1. 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

  1. 显示$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脚本时,如果第一个位置参数是合法的目录,就把后面给出的各个位置参数所对应的文件显示出来;若输入的文件名不正确,则显示错误信息。如果第一个位置参数不是合法的目录,则显示目录名不正确。

  1. 执行ex13(如:./ex13 d1 test.txt),并分析运行结果。

这个 shell 脚本的目的是显示一个指定目录下所有文件的内容,如图所示,成功显示了当text3的内容。

4.配置工作环境

Shell 配置文件可以分为系统级别的配置文件和用户级别的配置文件。任何一种 Shell 都有用户级别的配置文件,以及对应的系统级别的配置文件。

  1. 系统级别的配置文件位于/etc下,这些配置会应用于所有用户。例如/etc/profile,/etc/bashrc。
  2. 用户级别的配置文件位于用户目录~下,通常会加一个.来隐藏。例如~/.profile,~/.bashrc。
  3. 在Shell启动时,会首先执行系统级别的配置文件(如果存在的话),再执行用户级别的配置文件。也就是说~/.bashrc中的配置会覆盖/etc/bashrc中的配置。修改这些配置文件后,可通过执行命令:“source 配置文件”的方式使之立即生效,例如:

source /etc/profile

请按下面步骤练习:

  1. 显示/etc/profile、/etc/bashrc、~/.profile和~/.bashrc文件的内容,了解其大体功能。

用户下有 .bash_profile 而没有 .profile。

这些文件包含 shell 的配置信息。/etc/profile 是全局配置,/etc/bashrc 包含对所有用户的 Bash shell 的设置,~/.profile 和 ~/.bashrc 是针对当前用户的 shell 配置。

  1. 显示当前工作目录和HOME环境变量的值。把工作目录改为上一级目录,再显示 HOME的值。前后两次结果一样吗?

如图所示,两次结果一样,因为HOME 环境变量通常不变,它在登录时设置,并且通常指向用户的主目录。

  1. 将工作目录改回主目录。

  1. 显示PATH环境变量。注意:各目录名是以冒号(:)分开的。

  1. 将建立脚本的目录从PATH中删除,看看执行脚本时有何问题。

如图所示,删除脚本目录的PATH后,脚本依然可以执行,意味着脚本是通过相对路径执行的,而不是通过 PATH 环境变量。

  1. 将PS1变量置为注册名,看环境变量有无变化。

  1. 将PS1恢复成原来位置的值。

5.实验总结

通过本次实验,深入理解了 Shell 命令在操作系统中的作用和重要性。学会了如何查看和编辑文件内容,如何使用 PATH 环境变量来管理可执行文件的搜索路径,以及如何通过 PS1 变量自定义命令行提示符。 也意识到了权限管理在操作系统中的重要性,学会了如何使用 chmod 命令来修改文件权限。此外,通过实验,认识到了环境变量对系统操作的影响,学会了如何通过修改环境变量来影响系统行为。

标签:bin,shell,变量,编程,filename,命令,echo,操作系统
From: https://blog.csdn.net/m0_74139884/article/details/143972325

相关文章

  • Linux操作系统的安装、基本管理和常用命令(操作系统实验一)
    1.Linux操作系统(Centos)的安装安装VMware16在VMware16上创建虚拟机并安装Centos2.Linux系统的基本管理Linux的启动和退出启动Linux系统,输入用户名和密码后,登录系统;退出Linux系统,使用完毕后,退出系统。用户和用户组管理用户组管理。用户管理包括增加、修改和删除用......
  • 编程之路,从0开始:动态内存笔试题分析
        Hello大家好,很高兴我们又见面啦!    给生活添点passion,开始今天的编程之路。今天我们来看几个经典的动态内存笔试题。1、题目1#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>voidGetMemory(char*p){ p=(char*)malloc(100......
  • 深入解析 JUC 并发编程:CountDownLatch 与 CyclicBarrier 的原理、应用与最佳实践
    1.引言1.1什么是JUC并发编程?在Java开发中,并发编程是提升程序性能、优化资源利用的核心技术之一。Java提供了强大的并发工具库,JUC(JavaUtilConcurrent)便是其中的精髓所在。JUC不仅包含了线程池、锁等基础组件,还为开发者提供了一系列同步工具类,方便实现线程间的协调与管......
  • 超详细版:Centos7在LAMP环境下的Shell脚本部署Nextcloud(13.0.9)
     一、核心功能文件同步与分享:通过Nextcloud,用户可以轻松地在不同设备之间同步和共享文件。无论是照片、视频、文档还是其他文件类型,都可以方便地访问和共享。二、应用场景个人用户:个人用户可以通过Nextcloud搭建自己的私有云、实现跨设备的数据同步和备份。企业:企业可以使......
  • [python] Python异步编程库asyncio使用指北
    Python的asyncio模块提供了基于协程(coroutines)的异步编程(asynchronousprogramming)模型。作为一种高效的编程范式,异步编程允许多个轻量级任务并发执行,且相比传统的多线程模型,具有更低的内存消耗。因此,asyncio在需要高并发处理的场景中,尤其是在Web开发、网络请求、API调用和套接字......
  • Linux串口应用编程:从UART到GPS模块及字符设备驱动
    往期内容本专栏往期内容:Uart子系统UART串口硬件介绍深入理解TTY体系:设备节点与驱动程序框架详解interrupt子系统专栏:专栏地址:interrupt子系统Linux链式与层级中断控制器讲解:原理与驱动开发–末片,有专栏内容观看顺序pinctrl和gpio子系统专栏:专栏地址:pinctrl和gpio......
  • 手搓操作系统-如何创建虚拟磁盘并装载内核(超详细版)
    写在前面:本篇是完整的在Linux环境下,创建一个虚拟磁盘,并且将内核安装到磁盘并用虚拟机运行的过程。需要对bootstrap过程有一定的基础知识。遇到不懂的概念,如MBR,Grub等请务必参考笔者的另一篇文章操作系统架构-Linux主机从按下电源键到加载内核,都经历了什么?(超详细版)此外,读者还......
  • ABB freelance下使用ST编程计算日均值
    最近现场需要在ABBDCS上做日均值计算,从前一天上午8点到第二天上午7点59分59秒,一秒一个数据,最后求日均值。freelance自定义功能块对数组总的元素个数有一个限制,无论是组态模拟控制器,还是组态实际控制器,我在做练习的时候遇见过,于是就减少总的数组元素数量。基本思路是这样子:1.......
  • AI 编程-工具篇
    by Claude3.5sonnet,Promptfrom李继刚TL;DR:主力工具组合:Cursor(新功能开发)+Zed(代码review/文档),AI代码占比90%关键启示:实践比理论更重要,需要具备表达、提问、抽象和想象能力才能更好地利用AI编程工具聊聊cursor,cline,continue,以及zed1.Cursor  -......
  • 泷羽Sec学习笔记:shell脚本(1)脚本创建执行与变量
    学习地址:shell脚本(1)脚本创建执行与变量使用_哔哩哔哩_bilibili创建与执行首先建立一个1.sh文件vim1.sh可以利用#!/bin/bash#!/bin/sh#!/bin/dash这三种无论是哪一种脚本解释器,最终调用的还是dash比如 ls-l/bin/sh  发现调用的还是dash比如我们 echoh......