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命令的基本用法,但实际上它还有更多功能。
set -x #这个命令在我们写脚本排错的时候非常有用。它会显示我们当前执行了什么命令
set +x #取消显示当前执行了什么命令