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"
2.
\c不换行输出,在"\c"后面不存在字符的情况下,作用相当于echo -n但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。
[root@localhost ~]# echo -e "abcde\cfg"
3.
\n换行,被输出的字符从"\n"处开始另起一行,输出默认也是会换行
[root@localhost ~]# echo -e "abcde\nfg"
4.
\f换行,但是换行后的新行的开头位置连接着上一行的行尾
[root@localhost ~]# echo -e "abcde\ffg"
5.
\v与\f相同
[root@localhost ~]# echo -e "abcde\vfg"
6.
\t转以后表示插入tab, 即横向制表符
[root@localhost ~]# echo -e "abcde\tfg"
7.
\r光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
[root@localhost ~]# echo -e "abcde\rfg"
8.
\\表示插入"\"本身
- \有两个作用,一个是可以配一些普通字符实现特殊效果
\n \t \r \c \b \f \v- 另一个是可以把一些特殊符号转换成普通字符
$ ! . & * ^
[root@localhost ~]# echo -e "abcde\\mn"
2.2 echo匹配符号删除部分字符
1. 从最后倒数到最短的匹配部分(用%)后面的逗号的地方被删除
[root@localhost ~]# i=`echo "11,22,33, 44"`
[root@localhost ~]# echo ${i%,*}
2. 从最后倒数到最长的匹配部分(用%%)后面的逗号的地方都被删除
[root@localhost ~]# i=`echo "11,22,33, 44"`
[root@localhost ~]# echo ${i%%,*}
3. 从开头到最短的匹配部分(用#)后面的逗号的地方被删除
[root@localhost ~]# i=`echo "11,22,33,44"`
[root@localhost ~]# echo ${i#*,}
4. 从开头到最长的匹配部分(用##)后面的逗号的地方被删除
[root@localhost ~]# i=`echo "11,22,33,44"`
[root@localhost ~]# echo ${i##*,}
2.3 echo截取字符
格式:echo ${需截取的字符段:下标:截取的长度}
注:下标是从0开始的
echo ${#需要截取的字符}:字符长度
[root@localhost ~]# echo ${i:3:2}
[root@localhost ~]# echo ${i:3:3}
[root@localhost ~]# echo ${i:5:1}
[root@localhost ~]# name=zhangsan
[root@localhost ~]# echo ${#name}
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" //输出随机密码
4. IFS字段分隔符
4.1 IFS特点
IFS全拼为:Internal Field Separator. 它有三个需要记住的特点:
- IFS 是一个特殊的Shell变量
- 如果需要,你可以改变IFS的值,跟普通的变量赋值一样。e.g.IFS='|'
- IFS的默认值即空格,制表符,空行
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