shell学习

基础

2019-08-26  本文已影响0人  limbo1996

基础

文件描述符和重定向

文件描述符:

重定向

>可以将文本保存到文件中

echo "This is a sample test 1" > test.txt

>>可以追加

echo "This is a sample test 2" >> test.txt

重定向错误信息

ls + 2> out.txt
ls + 2> out.txt
ls: cannot access +: No such file or directory

也可以将输出和错误全部输入到一个文件中

cmd > alloutput.txt 2>&1

cmd &> output.txt

有时候需要使用到管道操作

标准输出可以重定向到文件中或者通过管道传输到其他命名,但是想要同时发生,需要命令tee

cat a* | tee out.txt | cat -n

可以将cat a*命令的输出保留副本,一份副本传入out.txt中一份副本传入下一个命令

注意:这里副本中包含的是输出,是没有错误信息的

tee的参数有 -a 代表可以追加,参数-代表发送两份副本给输出

[admin@iz2zei59vocobndhxpsko9z test]$ echo who is this | tee -
who is this
who is this
重定向文本

<<EOF的用处

[admin@iz2zei59vocobndhxpsko9z test]$ cat<<EOF>log.txt#等于cat>log.txt<<EOF
> wangxuan
> EOF
[admin@iz2zei59vocobndhxpsko9z test]$ cat log.txt 
wangxuan

EOF通常与<<连用,表示后续会输入到文件中

>重定向输出

>>重定向输出但不覆盖

一般来说看见<<就知道后面的是分界符,是可以自定义的不一定是EOF,当遇见下一个分界符的时候,会将两个分界符之间的内容输入的文件中

数组和关联数组

创建数组

打印特定索引的数组的元素内容

echo ${array_var[0]}
test1

打印数组中所有的值

echo ${array_var[*]} 
test1 test2 test3 test4

打印数组的长度

echo ${#array_var[*]}
4

关联数组

也就是可以使用字符串来做数组索引。

首先需要声明,将一个数组定义为关联数组

declare -A fruits_value

fruits_value=([apple]='100 dollars' [orange]='150 dollars')
echo "Apple costs ${fruits_value[apple]}"
Apple costs 100 dollars

每一个数组元素都有索引,但是关联数组的索引类型不同,可以列出索引列表

[admin@iz2zei59vocobndhxpsko9z test]$ echo ${!fruits_value[*]}
orange apple

别名

别名是一种快捷方式,可以省去一长串命令序列的麻烦

创建别名

alias install='sudo apt-get install'

这样,install就可以代替sudo apt-get install

删除别名

别名是暂时的,重启后消失,删除别名可以将对应的定义从~/.bashrc中删除,或者使用unalias或者alias exampel=,后者会取消别名example。

采集终端信息

在编写命令行shell脚本的时候,总是要处理终端信息,比如行数,列数,光标位置等等。

采集终端信息需要的工具tputstty

获取终端行数和列数

tput cols

tput lines

打印当前终端

tput longname

将光标移动至(100,100)处

tput cuo 100 100

禁止回显

#!/bin/bash
echo -e "Enter password: "
#读取密码前禁止回显
stty -echo 
read password
#重新允许回显
stty echo
echo
echo Password read

获取并设置日期及延时

延时是指在程序执行过程中等待一段时间,或者每隔一段时间监控某项进程

系统内部时间储存称为一个整数,取值为1970年1月1日0时0分0秒起流逝的秒数

date
Mon Aug 26 14:17:12 CST 2019
date +%s
1566800170

sleep命令

#!/bin/bash
echo Count:
tput sc

#循环40秒
for count in `seq 0 40`
do
 tput rc
 tput ed
 echo -n $count
 sleep 1
done

调试脚本

bash 的参数

管道

除了常规的|

admin@iZ2zei59vocobndhxpsko9Z:~/learn_sh$ b=`ls | cat -n`
admin@iZ2zei59vocobndhxpsko9Z:~/learn_sh$ echo $b
1 1 2 2 3 out.txt 4 password.sh 5 sleep.sh 6 test.sh

不按回车的情况下读入n个字符

Bash命令read可以从键盘或标准输入来读取文本

read -n 2 var
echo $var
read -s var
read -p "Enter input" var
read -t var 
read -d ":" var

内部分隔符和迭代器

admin@iZ2zei59vocobndhxpsko9Z:~/learn_sh$ data="name, gender, rollno,location"
admin@iZ2zei59vocobndhxpsko9Z:~/learn_sh$ oldIFS=$IFS
admin@iZ2zei59vocobndhxpsko9Z:~/learn_sh$ IFS=,
admin@iZ2zei59vocobndhxpsko9Z:~/learn_sh$ for item in $data;
> do
> echo Item:  $item
> done
Item: name
Item:  gender
Item:  rollno
Item:  location
admin@iZ2zei59vocobndhxpsko9Z:~/learn_sh$ IFS=$oldIFS

IFS是一个环境变量是内部字段分隔符,上面的代码如果没有将IFS更换为逗号,会将data的所有元素认为成一个打印出来

上一篇 下一篇

猜你喜欢

热点阅读