最近在学习shell,发现自己shell的强大,强大的已经被他征服。热爱shell,利用shell,珍惜生命。哈哈哈,现在最流行的两个shell:bash shell 和 zsh shell。
cat /etc/shells 或者 chsh -l
#查看当前用户的所采用的SHELL
echo $SHELL
#更改用户登录的shell,设置完成并重新登录.
chsh -s /bin/zsh
shell 有“环境变量”和“自定义变量”,环境变量可以在其进程的子进程中继续有效,而自定义变量作用范围无法再子进程中有效。
其中env和export显示的环境变量,set和declare显示的环境变量和自定义变量。
val="brian"
echo $val
val1="brian1"
echo $val1
export val
bash
echo $val1
echo $val2
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
#!/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
#!/bin/bash
read -p "input your name!"
echo "reply! $REPLY"
exit 0
brian@Dmaster:~$./test.sh
input your name! brian
reply! brian
我们设置一个超时限制来来提示用户必须在制定时间范围内输入,否则失败提示。通过-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不仅可以去读数据赋值给变量参数,还可以读取文件的内容。-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标准文件描述符:
#!/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 10 + 20
brian@Dmaster:~$ 30
expr 20 \* 10
brian@Dmaster:~$ 2
expr \( 10 + 10 \) \* 2 + 100
brian@Dmaster:~$ 110
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
如果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列出历史输入的shell命令,重复上一次的执行shell。
叹号定位法
history
!16
## 高级点的用法是搜索曾经的命令
Ctrl+R
#显示命令时间戳,并使日期和命令分开。
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