echo的输出方式

184 阅读3分钟

1. echo的选项

选项说明
n表示不换行输出
e输出转义字符,将转义后的内容输出到屏幕上

2. echo输出

2.1 常用的转义字符

1. \b转义后相当于按退格键(backspace)

前提是"\b"后面存在字符: "\b"表示删除前一个字符,"\b\b"表示删除前两个字符。

[root@localhost ~]# echo -e "abcde\bfg"
[root@localhost ~]# echo -e "abcde\b\bfg"

image.png

2. \c不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo -n

但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。

[root@localhost ~]# echo -e "abcde\cfg"

image.png

3. \n换行,被输出的字符从"\n"处开始另起一行,输出默认也是会换行

[root@localhost ~]# echo -e "abcde\nfg"

image.png

4. \f换行,但是换行后的新行的开头位置连接着上一行的行尾

[root@localhost ~]# echo -e "abcde\ffg"

image.png

5. \v与\f相同

[root@localhost ~]# echo -e "abcde\vfg"

image.png

6. \t转以后表示插入tab, 即横向制表符

[root@localhost ~]# echo -e "abcde\tfg"

image.png

7. \r光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符

但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖

[root@localhost ~]# echo -e "abcde\rfg"

image.png

8. \\表示插入"\"本身

  1. \有两个作用,一个是可以配一些普通字符实现特殊效果\n \t \r \c \b \f \v
  2. 另一个是可以把一些特殊符号转换成普通字符$ ! . & * ^
[root@localhost ~]# echo -e "abcde\\mn"

image.png

2.2 echo匹配符号删除部分字符

1. 从最后倒数到最短的匹配部分(用%)后面的逗号的地方被删除

[root@localhost ~]# i=`echo "11,22,33, 44"`
[root@localhost ~]# echo ${i%,*}

image.png

2. 从最后倒数到最长的匹配部分(用%%)后面的逗号的地方都被删除

[root@localhost ~]# i=`echo "11,22,33, 44"`
[root@localhost ~]# echo ${i%%,*}

image.png

3. 从开头到最短的匹配部分(用#)后面的逗号的地方被删除

[root@localhost ~]# i=`echo "11,22,33,44"`
[root@localhost ~]# echo ${i#*,}

image.png

4. 从开头到最长的匹配部分(用##)后面的逗号的地方被删除

[root@localhost ~]# i=`echo "11,22,33,44"`
[root@localhost ~]# echo ${i##*,}

image.png

2.3 echo截取字符

格式:echo ${需截取的字符段:下标:截取的长度}

注:下标是从0开始的

echo ${#需要截取的字符}:字符长度

[root@localhost ~]# echo ${i:3:2}
[root@localhost ~]# echo ${i:3:3}
[root@localhost ~]# echo ${i:5:1}

image.png

[root@localhost ~]# name=zhangsan
[root@localhost ~]# echo ${#name}

image.png

3.shell小实验

编写能够自动生成一个8位随机密码的脚本

#!/bin/bash
keywords="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"  //设置密码库
for a in {1..8}  //循环8次
do
num=$[$RANDOM % ${#keywords}]  //随机字符除以密码库长度取余,可以随机得出密码库的下标
mima=${keywords:$num:1}   //截取密码库字符,每次截取一个字符
password+=$mima  //每次截取的字符加在一起
done
echo "随机密码为:$password"  //输出随机密码

image.png

4. IFS字段分隔符

4.1 IFS特点

IFS全拼为:Internal Field Separator. 它有三个需要记住的特点:

  1. IFS 是一个特殊的Shell变量
  2. 如果需要,你可以改变IFS的值,跟普通的变量赋值一样。e.g.IFS='|'
  3. IFS的默认值即空格,制表符,空行

image.png

4.2 IFS小实验一

使用IFS字段分隔符截出环境变量PATH的包含目录,并且如果IFS的值变了,但是在下面的循环中还可以使用原IFS的值

#!/bin/bash
OLD_IFS=$IFS   //先备份原IFS的值,以防下面的循环需要用到可以还原
IFS=$IFS':'   //改变IFS分割符号
for i in $(echo $PATH)  //echo $PATH命令赋值给i
do
echo $i  //输出变量i
done
IFS=$OLD_ IFS   /还原IFS

4.3 IFS小实验二

#!/bin/bash
a=0       //统计文件行数的变量
b=1       //分割的文件编号的变量
IFS_OLD=$IFS
IFS=$'\n'
for line in $(cat /ky22/test.txt)
do
  let a++
  c=$[a%50]   //统计每50行的变量
  if [ $c -eq 0 ];then   //每当一个文件写入满足50行则迭代文件编号的变量
     echo $line > ./test$b. txt
     let b++
  else
     echo $line >> ./test$b. txt
  fi
done

image.png