前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell利剑之export、read和history

Shell利剑之export、read和history

作者头像
吕海峰
发布2018-04-03 14:52:20
9350
发布2018-04-03 14:52:20
举报
文章被收录于专栏:BrianBrian

概述

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

查看当前用户所使用的shell

代码语言:javascript
复制
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显示的环境变量和自定义变量。

代码语言:javascript
复制
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 比如读取你的名字并打印:

代码语言:javascript
复制
#!/bin/bash
read -p "input your name!" name
echo $name
exit 0
brian@Dmaster:~$./test.sh
input your name! brian
brian

read注意

  • 当输入是一个变量时,它会赋值到name中。
  • 当输入的数据量多于变量的个数时,那么超出的数据将被赋值在最后一个变量中。例如:
代码语言:javascript
复制
#!/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
代码语言:javascript
复制
#!/bin/bash
read -p "input your name!"
echo "reply! $REPLY"
exit 0
brian@Dmaster:~$./test.sh
input your name! brian
reply! brian

read 设置输入超时

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

代码语言:javascript
复制
#!/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 作为输入。

直接读取
代码语言:javascript
复制
#!/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指向一个位置。使用管道
代码语言:javascript
复制
#!/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

使用重定向

代码语言:javascript
复制
!/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,我们先来介绍一下把他当做计算器。

计算器

代码语言:javascript
复制
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 计算字符串的长度。
代码语言:javascript
复制
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文件:

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

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

代码语言:javascript
复制
#!/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
代码语言:javascript
复制
叹号定位法
history
!16
## 高级点的用法是搜索曾经的命令
Ctrl+R
  • history -c:清空所有的历史命令
  • history -w: 内存中的历史命令覆盖.bash_history

history的配置

代码语言:javascript
复制
#显示命令时间戳,并使日期和命令分开。
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=
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-12-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 查看当前用户所使用的shell
  • export 命令
  • read
    • read注意
      • read 设置输入超时
        • read读取文件
          • 直接读取
        • 使用重定向
        • expr
          • 计算器
          • alias和unalias
          • history
            • history的配置
              • 保护重要的shell命令
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档