• Linux 认识与学习Bash——2


    1 read 从键盘读取变量的值

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

    1. #!/bin/bash
    2. echo -n "请输入你的名字:"
    3. read name
    4. echo "欢迎您 $name"
    5. echo "----------------"
    6. echo -n "请输入你的名字2:"
    7. read
    8. echo "欢迎您 $REPLY"

    1. #!/bin/bash
    2. #echo -n "请输入你的名字:"
    3. #read name
    4. read -p "请输入你的名字:" name #上面注释两行等于这一行
    5. 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 变量内容的删除与替换

    1. r=${xx-"abcdefg"}
    2. r=${xx:-"abcdefg"}
    3. r=${xx:?"abcdefg"}
    4. 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

    1. stty -a
    2. ctrl+c #取消命令
    3. ctrl+? #删除命令


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

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

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

    1. name="Anton"
    2. echo $name
    3. unset name
    4. echo $name

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

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

    set -x #这个命令在我们写脚本排错的时候非常有用。它会显示我们当前执行了什么命令

    set +x #取消显示当前执行了什么命令

  • 相关阅读:
    【无标题】发的东方人
    直播流在线测试地址 m3u8,rtsp,rtmp,flv,mp4
    SpringSecurity 快速入门
    C++类型安全
    Android studio连接MySQL并完成简单的登录注册功能
    【C语言】数组的强化训练(详细讲解+源码展示)
    在机器学习领域中,One-Hot Encoding是什么
    Chat2DB下载、以及AI功能使用
    java面试题-并发编程基础
    详聊设计模式之动态代理
  • 原文地址:https://blog.csdn.net/usstmiracle/article/details/137924853