Linux 认识与学习Bash——2

news/2024/11/14 6:59:03/

1 read 从键盘读取变量的值

read 后面不带变量,那么默认会给REPLY变量赋值

#!/bin/bash
echo -n "请输入你的名字:"
read name
echo "欢迎您 $name"
echo "----------------"echo -n "请输入你的名字2:"
read 
echo "欢迎您 $REPLY"

#!/bin/bash
#echo -n "请输入你的名字:"
#read name
read -p  "请输入你的名字:" name  #上面注释两行等于这一行
echo "欢迎您 $name"

内置变量

 

2 定义一个数组和取值

  arr=(aa bb cc dd)

  • echo ${arr[0]}       #查看数组中第1个元素
  • echo ${arr[@]} 或者 echo ${xx[*]}   #查看数组中的所有元素
  • echo ${!arr[@]}    #查看数组中所有的下标
  • echo ${#arr[@]}   #查看数组中元素的个数

declare -x liu=888  #定义的变量liu

export        #查看定义的变量

declare +x liu=888   #取消变量

declare -r liu=888  #定义一个只读的变量liu

readonly hello   #定义一个只读的变量hello  

echo "$x" #双引号会输出变量x的值

echo '$x'  #在使用单引号输出$x时,变量将不起效果,当作字符串输出

在Bash中,一旦你使用declare -r命令将变量声明为只读,就不能使用常规的unset命令来取消或删除该变量

只读变量是设计为不可更改和不可删除的,这是为了防止它们的值在脚本执行期间被意外修改。

然而,有一种高级技术可以通过使用gdb(GNU调试器)来解除变量的只读属性,但这通常不推荐,因为它涉及到对shell进程的内存进行操作,这可能会导致不稳定或不可预测的行为。如果你决定使用这种方法,请确保你完全理解可能的后果,并且在一个安全的环境中进行,例如在一个不重要的临时shell会话中1。

如果你想避免使用只读变量,最好的做法是在声明变量之前仔细考虑,确保你以后不需要更改或删除它。如果你发现自己需要修改一个只读变量,你可能需要重新考虑你的脚本设计或重新启动一个新的shell会话。

ulimit -a

3 变量内容的删除与替换

r=${xx-"abcdefg"}
r=${xx:-"abcdefg"}
r=${xx:?"abcdefg"}
r=${xx:+"abcdefg"}

在Linux中,这四个命令是参数扩展的例子,它们用于处理变量和提供默认值或其他操作。下面是每个命令的具体含义:

  • r=${xx-"abcdefg"}:如果变量xx未设置或为空,r将被赋值为"abcdefg"。如果xx已设置并且非空,r将取xx的值。
  • r=${xx:-"abcdefg"}:这与第一个命令类似,但即使变量xx被设置为空(即声明了变量但没有值),r也将被赋值为"abcdefg"。
  • r=${xx:?"abcdefg"}:如果变量xx未设置或为空,将打印出"abcdefg"并退出当前命令或脚本。如果xx已设置并且非空,r将取xx的值。
  • r=${xx:+"abcdefg"}:如果变量xx已设置并且非空,r将被赋值为"abcdefg"。如果xx未设置或为空,r将不被设置。

4 别名设置alias,unalias

ifconfig eth0 #如果觉得命令太长了,可以为其取一个别名
#取别名
alias aa="ifconfig eth0"

通过alias 命令可以查看目前shell下存在哪些别名

unalias 取消别名

unalias aa

 echo -n "123456"  #这样输出后就不会换行了

alias echo='echo -n' #这样设置后,每次使用echo输出就不会换行了

type -a echo #可以查看目前echo命令生效的是哪个echo命令

命令的查找顺序:type -a echo

5 历史命令history

在Linux系统中,history命令用于列出用户在当前终端会话中输入过的命令历史。如果你想重新执行历史列表中的某个命令,可以使用感叹号!后跟该命令在历史列表中的编号。这是一种快速重复执行先前命令的方法。

例如,如果你输入!314,它将执行历史列表中编号为314的命令。

6 bash的登录与欢迎信息

Linux登录前的提示信息存储在/etc/issue文件中

在Linux系统中,登录前的提示信息存储在/etc/issue文件中。这个文件包含在登录提示之前显示的信息或系统标识。它可能包含各种由getty支持的@字符和\字符序列。

登录后显示的信息则存储在/etc/motd(Message of the Day)文件中

这个文件在用户登录后、启动他们的shell之前显示信息。默认情况下,这个文件可能为空,但可以编辑以显示自定义消息。

更简洁的描述是:

  • /etc/issue 文件定义了用户登录前在终端上看到的系统欢迎信息。
  • /etc/motd 文件定义了用户登录后在终端上看到的日常消息或系统通知。这些文件为系统管理员提供了一种向用户展示重要信息的方式。
  • /etc/issue.net 文件仅显示给从网络连接的用户。这些横幅可以包含任何文本,包括欢迎消息、版权信息和安全警告。

例如,可以在/etc/issue中添加安全警告

                  在/etc/motd中添加系统维护通知。

可以通过编辑/etc/issue.net文件来自定义登录前的消息。在文件中添加您想要的文本,然后保存并关闭文件。

可以使用以下转义代码来扩展文本:

\\d:插入当前日期。
\\t:插入当前时间。
\\n:插入机器的节点名称(也称为主机名)。
其他转义代码,如插入操作系统的版本、系统名称等。

7 Bash的环境配置文件

login-shell

 在Linux系统中,login-shell 是用户登录时启动的shell,它会读取一系列配置文件来设置用户环境。这些配置文件包括:

  • /etc/profile:这是一个全局配置文件,它为所有用户设置环境变量和系统级别的shell行为。这个文件通常是只读的,一般不推荐去修改它,它对所有用户都有影响。
  • /etc/inputrc:这个文件定义了Readline库使用的键盘映射,它影响命令行编辑行为和快捷键。
  • /etc/profile.d:这个目录包含一系列脚本,这些脚本在登录时被/etc/profile读取并执行,用于设置特定应用程序或shell环境的变量。


登录shell读取完上述文件后,会进入用户的家目录,并执行.bash_profile文件。

.bash_profile文件用于设置用户特定的环境变量和启动程序,这些设置只在登录时执行一次,以便在用户的整个会话中保持。

no-login shell

相比之下,no-login shell 是在用户已经登录后启动的shell,通常不需要再次输入用户名和密码。这种shell不会读取/etc/profile或.bash_profile,而是读取.bashrc文件。.bashrc文件包含了特定于交互式shell会话的配置,如别名和函数,这些配置每次打开新的shell时都会被加载4。

总结来说,login-shell在用户登录时启动并读取一系列配置文件来设置环境,而no-login shell在用户已登录后启动,通常只读取.bashrc文件来加载shell会话的配置。

终端机的环境设置stty,set

stty -a
ctrl+c  #取消命令
ctrl+? #删除命令


set -u 是Linux中的一个内置shell命令,用于设置或取消设置shell选项和位置参数的值。

它就像一个主控面板,允许您设置或取消设置shell环境的值。

让我们来看一个简单的例子:

name="Anton"
echo $name
unset name
echo $name

在这个例子中,我们首先将变量name设置为“Anton”,然后打印它。接着,我们取消了变量name的设置,并尝试再次打印它。

因为我们在脚本开头使用了set -o nounset,所以尝试打印一个未设置的变量会导致shell退出。这是使用set命令的基本用法,但实际上它还有更多功能。


http://www.ppmy.cn/news/1428231.html

相关文章

双臂复合机器人平台叠方块例程使用与自启设置

睿尔曼双臂升降复合机器人平台,旨在为机器人教育提供强大的实训平台,该平台全自主研发,实现机器人建图导航、路径规划,机械臂运动学、动力学、轨迹规划、视觉识别等算法和应用,提供开放式的软件框架,为教学…

Rust 入门-更换镜像源(MAC)

1、创建或修改文件内容 首先是在 crates.io 之外添加新的注册服务,在 $HOME/.cargo/config.toml (如果文件不存在则手动创建一个)中添加以下内容 [source.crates-io] replace-with ustc[source.ustc] registry "git://mirrors.ustc.…

oracle快速定位数据库瓶颈

oracle快速定位数据库瓶颈 –数据库巡检或性能优化方法各异,但首要的是要发现数据库性能瓶颈,系统自带的statspack,或awr太耗时. 查询数据库等待事件top10,关注前前几个等待事件,关注前三个等待事件是否有因果或关联关系–oracle 9i select…

React + Ts + Vite + Antd 项目搭建

1、创建项目 npm create vite 项目名称 选择 react 选择 typescript 关闭严格模式 建议关闭严格模式,因为不能自动检测副作用,有意双重调用。将严格模式注释即可。 2、配置sass npm install sass 更换所有后缀css为sass vite.config.ts中注册全局样式 /…

深度学习基础——残差神经网络(ResNet)

深度学习基础——残差神经网络(ResNet) 1. 定义 残差神经网络(ResNet)是一种深度神经网络结构,由微软研究院的Kaiming He等人于2015年提出。它通过引入残差块(Residual Block)来解决深度神经网…

探索C++的奇妙世界:学习之旅的点点滴滴

在这个信息技术飞速发展的时代,编程语言作为计算机与人类沟通的桥梁,其重要性不言而喻。在众多编程语言中,C以其高效、灵活和强大的特性,吸引了无数编程爱好者的目光。今天,我将与大家分享我学习C的历程和心得&#xf…

Golang插件系统实现

插件可以在解耦的基础上灵活扩展应用功能,本文介绍了如何基于Golang标准库实现插件功能,帮助我们构建更灵活可扩展的应用。原文: Plugins with Go 什么是插件 简单来说,插件就是可以被其他软件加载的软件,通常用于扩展应用程序的功…

java-Spring-入门学习-第二天(单例模式和多例模式)

目录 Bean作用域 单例模式(默认可以不写) Spring下的 AutoWired 依赖注入 JaveEE下的 Resource 依赖注入 多例模式 Bean作用域 ​在Spring框架中,Bean是按照作用域来创建的,常见的作用域有两种:Singleton 和 Prototype。Singleton (单例…