基础

基础

文件描述符和重定向

文件描述符:

  • 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脚本的时候,总是要处理终端信息,比如行数,列数,光标位置等等。

采集终端信息需要的工具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
  • 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 的参数

  • -xbash -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的所有元素认为成一个打印出来

  • &&操作是指前面成功了在运行后面的命令
  • ||是指前面不成功运行后面的命令
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容