基础
文件描述符和重定向
文件描述符:
0 标准输入
1 标准输出
2 标准错误
重定向
>
可以将文本保存到文件中
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,当遇见下一个分界符的时候,会将两个分界符之间的内容输入的文件中
数组和关联数组
创建数组
-
单行
array_var={test1 test2 test3 test4}
-
多行
array_var[0]="test1" array_var[1]="test2" array_var[2]="test3" array_var[3]="test4"
打印特定索引的数组的元素内容
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脚本的时候,总是要处理终端信息,比如行数,列数,光标位置等等。
采集终端信息需要的工具tput
和stty
获取终端行数和列数
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
-
stty
的-echo
选项可以用来禁止将输出发送到终端
获取并设置日期及延时
延时是指在程序执行过程中等待一段时间,或者每隔一段时间监控某项进程
系统内部时间储存称为一个整数,取值为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 的参数
-
-x
,bash -x name.sh
管道
除了常规的|
-
子shell法
a=$(ls | cat -n) echo $a 1 1 2 2 3 out.txt 4 password.sh 5 sleep.sh 6 test.sh
反引用法
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
显示提示信息
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的所有元素认为成一个打印出来
-
&&
操作是指前面成功了在运行后面的命令 -
||
是指前面不成功运行后面的命令