Shell利剑之export、read和history


概述

最近在学习shell,发现自己shell的强大,强大的已经被他征服。热爱shell,利用shell,珍惜生命。哈哈哈,现在最流行的两个shell:bash shell 和 zsh shell

查看当前用户所使用的shell

cat /etc/shells 或者 chsh -l
#查看当前用户的所采用的SHELL
echo $SHELL
#更改用户登录的shell,设置完成并重新登录.
chsh -s /bin/zsh

export 命令

shell 有“环境变量”和“自定义变量”,环境变量可以在其进程的子进程中继续有效,而自定义变量作用范围无法再子进程中有效。

  • env 显示当前用户的环境变量,但不会显示自定义变量。
  • export 既显示当前用户的环境变量也显示自定义变量,我们也可以通过export来设置变量为环境变量。
  • declare 显示当前shell中定义的环境变量,包括用户的环境变量和自定义变量。
  • set 同declare工程一样。

其中env和export显示的环境变量,set和declare显示的环境变量和自定义变量。

val="brian"
echo $val
val1="brian1"
echo $val1
export val
bash
echo $val1
echo $val2

read

read读取输入数据并赋值给变量,格式为:read -p “提示语” varname read -p “提示语” -t(等待时长) number -s(不显示任何输入信息) varname 比如读取你的名字并打印:

#!/bin/bash
read -p "input your name!" name
echo $name
exit 0
brian@Dmaster:~$./test.sh
input your name! brian
brian

read注意

  • 当输入是一个变量时,它会赋值到name中。
  • 当输入的数据量多于变量的个数时,那么超出的数据将被赋值在最后一个变量中。例如:
#!/bin/bash
read -p "input your name!" name name1
echo "hello $name,$name1"
exit 0
brian@Dmaster:~$./test.sh
input your name! brian brian1 brian2
brian,brian1 brian2

  • 当你没有设置一个变量时,它会自动存储在$REPLY
#!/bin/bash
read -p "input your name!"
echo "reply! $REPLY"
exit 0
brian@Dmaster:~$./test.sh
input your name! brian
reply! brian

read 设置输入超时

我们设置一个超时限制来来提示用户必须在制定时间范围内输入,否则失败提示。通过-t参数可以实现这个功能。

#!/bin/bash
if read -t 5 -p "Please input your name:" name
then
   echo "welcome $name"
else
   echo "sorry,too slow!"
fi
exit 0
brian@Dmaster:~$./test.sh
Please input your name:#等待五秒
sorry,too slow!

read读取文件

read不仅可以去读数据赋值给变量参数,还可以读取文件的内容。-u [ n ]读取一位数的文件描述符号码 n 作为输入。

直接读取

#!/bin/bash
# 从文件读取的内容重定向到编号为3的文件描述。
exec 3< test.txt
count=0
while read -u 3 var
do
    let count=$count+1
    echo "Line $count:($var)"
done
echo "finished"
echo "Line no is $count"
#关闭了编号为3的文件
exec 3<&-
brian@Dmaster:~$./test.sh

解释:exec 3< test.txt执行重定向shell命令,将test.txt文件内容重定向到描述文件3中。然后从3中读取内容复制给变量var。最后关闭文件描述编号为3的内容。Linux标准文件描述符:

  • 0 STDIN 标准输入
  • 1 STDOUT 标准输出
  • 2 STDERR 标准错误输出 Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。文件描述符0理解为我和计算机交互时的输入,而这个输入默认是指向键盘的; 文件描述符1理解为我和计算机交互时的输出,而这个输出默认是指向显示器的; 文件描述符2理解为我和计算机交互时,计算机出现错误时的输出,而这个输出默认是和文件描述符1指向一个位置。使用管道
#!/bin/bash
count=1
cat test.txt | while read line
do
echo "Line $count:($line)"
let count=$count+1
done
echo "finished"
echo "Line number is $count"#这里的count显示为1,管道的两边都需要新建进程。
exit 0
brian@Dmaster:~$./test.sh

使用重定向

!/bin/bash
count=1
while read line
do
echo "Line $count:($line)"
let count=$count+1
done < test.txt
echo "finished"
echo "Line number is $count"
exit 0
brian@Dmaster:~$./test.sh

值得注意的是如果文本含有一些转义字符,如果想让转义字符不起作用,可以通过-r来显示。

expr

具有计算功能和字符处理功能的expr,我们先来介绍一下把他当做计算器。

计算器

expr 10 + 20
brian@Dmaster:~$ 30
expr 20 \* 10
brian@Dmaster:~$ 2
expr \( 10 + 10 \) \* 2 + 100
brian@Dmaster:~$ 110
  • 请用空格隔开每个选项.
  • 用反斜杠\放在shell特殊字符前面.
  • 对包含空格和其他特殊字符的字符串用引号括起来。匹配功能
    • match STRING REGEXP匹配字符串并返回匹配字符串的长度。
    • substr STRING POS LENGTH 从第pos个位置,截取字符串的长度。
    • index STRING SUBSTRING 返回子字符串的起始位置
    • length STRING 计算字符串的长度。
brian@Dmaster:~$ expr match "hello world" ".*w"
brian@Dmaster:~$ 7
brian@Dmaster:~$ expr substr "hello world" 1 3
brian@Dmaster:~$ subs
brian@Dmaster:~$ expr index "hello world" "wo"
brian@Dmaster:~$ 7
brian@Dmaster:~$ expr length "hello"
brian@Dmaster:~$ 5

alias和unalias

如果shell命令行过长或者我们想设置自己的命令,可以通过alias来设置自己喜欢的别名。当然你也可以通过unalias来取消别名。如果想一直用用,你可以放在一个alias文件下面,比如: 在用户目录下创建alias文件:

# -f 为常规文件则为真,-e为指定文件存在则为真,-d目录存在为真,-L为符号链接为真,-r或-w或-x 具有可读可写可执行为真。
if [ -f ~/.alias ]; then
    . ~/.alias
fi

把上述代码放在.bash_profile里面。需要注意的是,在shell脚本中alias别名默认是关闭的,在shell里面执行命令是重新生成一个子进程。所以你可以通过login 选项来设置。

#!/bin/bash --login
shopt expand_aliases
shopt -s expand_aliases
shopt expand_aliases
alias
ll
exit 0

—login 选项的作用是使脚本的子shell成为一个login shell,而login shell会读取系统和用户的profile及rc文件。

history

history列出历史输入的shell命令,重复上一次的执行shell。

  • !!
  • !-1
  • Ctrl+p
叹号定位法
history
!16
## 高级点的用法是搜索曾经的命令
Ctrl+R
  • history -c:清空所有的历史命令
  • history -w: 内存中的历史命令覆盖.bash_history

history的配置

#显示命令时间戳,并使日期和命令分开。
export HISTTIMEFORMAT='%F %T'
#设置内从中的history数量
export HISTSIZE=100
#设置文件中的history命令的个数
export HISTFILESIZE=1000

#自定制存储history的文件
export HISTFILE=~/history.log
#清除命令行重复的条目
export HISTCONTROL=erasedups
#忽略记录命令历史张连续重复的命令。
export HISTCONTROL=ignoredups
#忽略记录为开头为空格的命令。
export HISTCONTROL=ignorespace
#等价于ignoredups+ignorespace
export HISTCONTROL=ignoreboth

保护重要的shell命令

  • 第一种方式
    • 设置环境变量,export HISTCONTROL=ignorespace
    • 输入重要命令前输入空格
  • 第二种方式
    • export HISTIGNORE=*
    • 输入重要的命令。。。。
    • export HISTIGNORE=

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏同步博客

浅谈PHP异常处理

  PHP中的异常的独特性,即PHP中的异常不同于主流语言C++、java中的异常。在Java中,异常是唯一的错误报告方式,而在PHP中却不是这样,而是把所有不...

1393
来自专栏Linyb极客之路

文件监听之WatchService浅析

用watchservice修改配置文件方式仅适合于比较小的项目,例如只有一两台服务器,而且配置文件是可以直接修改的。例如 Spring mvc 以 war 包的...

1332
来自专栏Youngxj

[教程]黑客级别的批量处理文件

2363
来自专栏www.96php.cn

【fastadmin】踩坑第二发-CMS插件后台文章状态修改未通过前台报错

我们找到模板application\index\view\cms\archives\my.html 大概46-52行

5953
来自专栏gaoqin31

XDebug分析php代码性能

XDebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。是一个C语言扩展包(Windows下扩展名...

3933
来自专栏技术博客

C#简单的面试题目(六)

76.HashMap和Hashtable的区别。 答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于H...

882
来自专栏凉城

[教程]黑客级别的批量处理文件

2375
来自专栏青玉伏案

iOS开发之再探多线程编程:Grand Central Dispatch详解

Swift3.0相关代码已在github上更新。之前关于iOS开发多线程的内容发布过一篇博客,其中介绍了NSThread、操作队列以及GCD,介绍的不够深入。今...

1977
来自专栏偏前端工程师的驿站

Java魔法堂:找外援的利器——Runtime.exec详解

一、前言                                  Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用...

21710
来自专栏IMWeb前端团队

上手 yeoman generator

最近折腾脚手架相关的一些事情。说到脚手架,不得不谈的就是yeoman了。 是什么 yeoman是一个脚手架生成工具。 yeoman generator则是yeo...

2365

扫码关注云+社区

领取腾讯云代金券