mycpen

Mycpen

记录学习历程与受益知识
github
telegram
bilibili

11_Linux基础-SHELL入门2

一。练习:用户 增删改查#

脚本 编写一个脚本,实现如下功能

====================
1.增加用户并设置密码
2.删除用户
3.查看用户
4.退出
====================
输入的指定不是1-4,给提示给予提醒,并且如果不输入退出的话,可以循环添加。
按1  增加用户,并且设置密码 	useradd  passwd
按2  删除用户    			 userdel -r 
按3  查看用户   				 id 
按4  退出       			  exit
=====================================================================
示例1:
--------------------------------------------------------------------------------------------
menu(){									#(注:函数)
echo "===================="
echo "1.增加用户并增加密码"
echo "2.删除用户"
echo "3.查看用户"
echo "4.退出"
echo "===================="
read -p "请选择您所需要的服务:" ser
}
-------------------------------------------------
create_user(){							#(注:函数)
    read -p "创建用户名:" user1
    id $user1 &>/dev/null && echo "用户已存在!" && return	#(注:退出函数,接return)
    useradd $user1 &>/dev/null				#(注:导入黑洞文件)
    id $user1 &>/dev/null || return 	#(注:用户已存在 用Id 判断比较好。返回值非0可能是命令执行错误)
    read -s -p "设置密码:" passwd1			#(注:-s密码隐藏)
    echo $passwd1|passwd $user1 --stdin &>/dev/null
}
-----------------------------------------------------------
while :
do
menu				#(注:调用函数)
case $ser in			
1)
    clear			#(注:清空屏幕)
    create_user
    ;;
2)
# ……………………………………
4)
    echo “退出!”
    exit
    ;;
*)							#(注:表示其他的所有选项,从上至下依次匹配)
    echo “请输入1-4!”
esac
done
-----------------------------------------------------------------------------------------------------------
示例2:if 语法
---------------------------------------------------------------------
    if ["$options"==1]||["$options"==2]||["$options"==3]||["$options"==4]
    then
        case $options in
        1)
            read -p "请输入用户名:" username
            if id $username &>/dev/null
            then
                echo "$username is exist!"
            else
                read -s -p "请设置密码:" password
                useradd $username &>/dev/null
                echo $password | $username --stdin &>/dev/null
                echo -e "\n create $username ok!"
            fi 
            ;;
    # ……………………………………………………
        4)
            echo "退出!"
            exit
        esac
    else
        echo "请输入数字1或2或3或4!"
    fi
补充:&&可以连接2个命令
--------------------------------------------------------------------
&&可以连接2个命令
[root@sanchuang-linux ~]# id chen222
uid=1017(chen222) gid=1017(chen222) 组=1017(chen222)
[root@sanchuang-linux ~]# id chen222 && echo "chen222存在"
uid=1017(chen222) gid=1017(chen222) 组=1017(chen222)
chen222存在
[root@sanchuang-linux ~]# id chen222 &>/dev/null && echo "chen222存在"
chen222存在

#注:用户已存在 用id 判断比较好。返回值非0可能是命令执行错误

二。变量#

变量 全局 / 局部

Shell#

Shell中定义的变量 默认全局变量

===========================================================================================
local a=10 局部变量
示例1:local 局部变量
--------------------------------------------------------------------------------------------
func01(){
    local a=10
}

func01								#(注:调用函数)
echo $a
--------------------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# sh aaa.sh 
									#(注:为空。局部变量)
============================================================================================
示例2:默认全局变量
--------------------------------------------------------------------------------------------
func01(){
    a=10
}

func01								#(注:调用函数)
echo $a
[root@sanchuang-linux chenpeng]# sh aaa.sh 
10									#(注:全局变量)

Python#

Python定义的变量 默认局部变量

===========================================================================================
global a 全局变量
示例1:global a 全局变量
--------------------------------------------------------------------------------------------
def func01():
    global a 				#(注:全局变量)
    a = 10

func01()
print(a)
[root@sanchuang-linux ~]# python3 python_hanshu.py 
10
============================================================================================
示例2:默认局部变量  只能在函数体内使用的变量
--------------------------------------------------------------------------------------------
def func01():
    a = 10

func01()
print(a)

[root@sanchuang-linux ~]# python3 python_hanshu.py 
Traceback (most recent call last):
  File "python_hanshu.py", line 5, in <module>
    print(a)
NameError: name 'a' is not defined				#(注:局部变量)

Shell 函数里传参(位置变量)#

shell 函数里传参(位置变量)

示例:
--------------------------------------------------------------------------------------------
Shell里传参
func01(){
    a=100
    echo "$1 $2 $3"						#(注:函数的参数 [位置变量])
}
func01 第一个参数 第二个参数 第三个参数		#(注:调用参数)
echo $a

Python 里传参#

python 里传参

示例:python里传参
--------------------------------------------------------------------------------------------
def func01(x,y):
    global a
    a = 10

func01(1,2)
print(a)

三. test#

test 判断 等同于 []

示例:test
--------------------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# a=123
[root@sanchuang-linux chenpeng]# b=123
[root@sanchuang-linux chenpeng]# test a==b
[root@sanchuang-linux chenpeng]# test a==b && echo ok
ok

四。判断方式 [] [[]] (()) test#

判断方式 [] [[]] (()) test

  • (()) 判断数字 > < == !=
  • [[]] 判断字符串 或者 -eq -ne -gt -lt 判断数字
  • 有些语法 [] 是不支持的,建议使用 [[]]
  • test (测试) 判断,等同于 1 个中括号
示例:test
---------------------------------------------------------------------
[root@sanchuang-linux ~]# a=123
[root@sanchuang-linux ~]# b=123
[root@sanchuang-linux ~]# test a==b && echo ok
ok
[root@sanchuang-linux ~]# test a==b && echo ok || echo error
ok

五。连接运算#

连接运算

使用分号 (;) 实现一行中写多条语句

示例:
--------------------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# echo "abc";echo "xyz"
abc
xyz

六。函数#

函数的定义 / 使用#

示例
--------------------------------------------------------------------------------------------
add(){
    echo “两数相加为:$(( $num1 + $num2 ))
}
add
============================================================================================

函数的传参#

示例:位置参数传参
--------------------------------------------------------------------------------------------
func01(){
    a=100
    echo "$1 $2 $3"
}

func01 第一个参数 第二个参数 第三个参数
echo $a
============================================================================================
·函数内的变量定义 	  默认为全局变量
·使用local关键字 	可以转换为局部变量

七. seq#

seq 命令

seq 命令 类似于 python 中的 range 函数

用途:** 打印出一串有序的数字 **

格式:seq [选项] 数字范围

-s:指定分隔符

-w:指定同等宽带输出

----------------------------------------

数字范围的展示:

[start] [step] end

start 和 step 都是选填的

step 为正,表示从小到大输出

step 为负,表示从大到小输出

示例1:[start] [step] end
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# seq 3 -1 1			# 注:中间是步长。左右是起始位置
3
2
1
[root@sanchuang-linux ~]# seq 1 2 6
1
3
5
[root@sanchuang-linux ~]# seq 1 -2 6			# 注:步长为负数时,从1到6没有输出
[root@sanchuang-linux ~]# seq 6 -2 1
6
4
2
示例2:# seq 2 5 # seq -w 9 12
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# seq 2 5
2
3
4
5
[root@localhost ~]# seq -w 9 12			# -w 指定同等宽度输出
09
10
11
12
============================================================================================
补充 获取命令的返回结果
·使用反引号 ``
·或者 $()
示例3:获取/etc/passwd最后一行,赋给一个变量
[root@sanchuang-linux ~]# tail -n1 /etc/passwd				# 注:获取最后一行 # tail -n1
wtc:x:1029:1029::/home/wtc:/bin/bash
[root@sanchuang-linux ~]# line=`tail -n1 /etc/passwd`		# 注:方法1
[root@sanchuang-linux ~]# echo $line
wtc:x:1029:1029::/home/wtc:/bin/bash
[root@sanchuang-linux ~]# line1=$(tail -n1 /etc/passwd)		# 注:方法2
[root@sanchuang-linux ~]# echo $line1
wtc:x:1029:1029::/home/wtc:/bin/bash
============================================================================================
示例4:seq命令 类似于 python中的range函数
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# vim seq_test.sh
for i in `seq 2 10`		# 注:反引号 执行这个命令,获取命令的返回值
do						# 注:seq 2 10 包括2,包括10
    echo $i
done
-----------------------------------------------------------------------
for i in $(seq 2 10)	# 注:也表示执行这个命令,获取命令的返回值
do
    echo $i
done
[root@sanchuang-linux ~]# bash seq_test.sh 
2
3
4
5
6
7
8
9
10
============================================================================================
示例5:-s:指定分隔符
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# seq -s "+" 10			# -s:指定分隔符
1+2+3+4+5+6+7+8+9+10							# 注:不搞开头,默认情况下 从1开始,到10
[root@sanchuang-linux ~]# seq 10				#注:默认情况下 连接符是 换行符
1
2
3
4
5
6
7
8
9
10

八。练习:创建用户#

创建用户(3 次重试机会)脚本

示例:seq命令  创建失败 重试
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# vim user_add.sh
#!/bin/bash
# 增加								# 注:用户增加的部分
add(){
    for i in `seq 3 -1 1`				# 注:seq 命令类似于pythonrange函数 3 2 1
    do
        echo "增加用户"
        read -p "请输入用户名:" username
       id $username &>/dev/null && echo "用户已存在,还有$(( $i - 1))次机会" && continue
       #if id $username &>/dev/null 
       #then
       #     echo "用户已存在,还有$(( $i -1 ))次机会"
       #     continue
       #fi  
       #useradd $username &>/dev/null && echo "创建成功!" && echo $password | passwd $username --stdin &>/dev/null && break || echo -e "\n创建失败!"
       if useradd $username &>/dev/null
       then
           echo "创建${username}成功!"
           read -s -p "请设置密码:" password
           echo $password | passwd $username --stdin &>/dev/null
           break
       else
           echo "创建失败!,还有$(($i-1))次机会!"
       fi
    done
}
# 删除
del(){
    echo "删除用户"
    read -p "请输入用户名:" username
    userdel -r $username &>/dev/null && echo "删除成功!" || echo "用户不存在,删除失败!"
}
# 查看
seek(){
    echo "查看用户"
    read -p "请输入用户名:" username
    id $username 
}
echo "#############################"
echo "按1  增加用户,并且设置密码"
echo "按2  删除用户"
echo "按3  查看用户"
echo "按4  退出"
echo "#############################"
while :
do
    read -p "请输入你的选择:" options
    case $options in
    1)
        add
        ;;
    2)
        del
        ;;
    3)
        seek
        ;;
    4)
        echo "退出!"
        exit
        ;;
    *)
        echo "请输入指定内容 1-4!"
    esac
done

九。循环获取文件或者命令输出的内容 (3 种)#

重定向#

示例1:重定向  while read a b c < a.txt
--------------------------------------------------------------------------------------------
#!/bin/bash
while read a b c
do
   echo "name is $a, sex is $b, age is $c "
done < a.txt					# 注:当前路径下的文件。可以接绝对路径
============================================================================================

管道符号#

示例2:管道符号	cat a.txt | while read a b c
--------------------------------------------------------------------------------------------
cat a.txt | while read a b c
do 
    echo "name is $a, sex is $b, age is $c "
done
============================================================================================

for 循环#

示例3:for 循环实现(注:使用for循环去做,不太好)
#for循环默认以空白(空格/回车 制表符)分割
--------------------------------------------------------------------------------------------
echo "for 循环实现..........."
for i in `ls`					# i 代表空白输出的每个文件
do
    echo $i
done
--------------------------------------------------------------------------------------------
示例3.2:i代表文件的每一项,以空白分割
[root@sanchuang-linux ~]# vim file_test.sh
for i in `cat a.txt`
do
    echo $i
done
[root@sanchuang-linux ~]# bash file_test.sh 
wenyao
f
18
chenpeng
m
19
wtc
f
17
[root@sanchuang-linux ~]# cat a.txt 
wenyao f 18
chenpeng m 19
wtc f 17
示例3.3:for i in `ls -al`		# i代表当前目录下详细信息,i代表以空白分割的每一项

十。练习:找出 list.xml 中主机为 ZF 的行然后循环输出 ip 与区服对应的关系#

找出 list.xml 中主机为 ZF 的行然后循环输出 ip 与区服对应的关系

示例
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# cat list.xml 
####IP    主机名    区服#########
127.0.0.1 ZF-1      1 33 49 57
127.0.0.1 ZF-11     65 67 69
127.0.0.1 HF-1      22 34 6
127.0.0.1 HF-11     6 17 36
127.0.0.1 ZF-12     1 2
127.0.0.1 HF-1      34 7
--------------------------------------------------------------------------------------------
步骤1:首先过滤出ZF所在的行
[root@sanchuang-linux ~]# vim test6.sh 
#!/bin/bash									# 管道| 把输出 作为下一条命令的输入
cat list.xml |grep ZF |while read ip host qufu		# 首先过滤出ZF所在的行
do											# while read 获取内容
    echo "ip:$ip, qufu:$qufu"					# 注:参数3整个赋给$qufu
done
[root@sanchuang-linux ~]# cat list.xml | grep ZF
127.0.0.1 ZF-1      1 33 49 57
127.0.0.1 ZF-11     65 67 69
127.0.0.1 ZF-12     1 2
[root@sanchuang-linux ~]# sh test6.sh 			# 注:$ip  $host  $qufu  不一定需要对应
ip:127.0.0.1, qufu:1 33 49 57					# 前两个对应的,把前两个都取了
ip:127.0.0.1, qufu:65 67 69						# 后面有的话,就全部是后面的内容
ip:127.0.0.1, qufu:1 2							# 没有的话就为空(取不到的话就为空)
--------------------------------------------------------------------------------------------
步骤2:套个循环
#!/bin/bash
cat list.xml |grep ZF |while read ip host qufu
do
    for i in $qufu								# 注:套个循环。for循环以空格进行分割
    do
        echo "ip:$ip, qufu:$i"					# 注:这里是i。对区服进行循环
    done
done
[root@sanchuang-linux ~]# sh test6.sh 
ip:127.0.0.1, qufu:1
ip:127.0.0.1, qufu:33
ip:127.0.0.1, qufu:49
ip:127.0.0.1, qufu:57
ip:127.0.0.1, qufu:65
ip:127.0.0.1, qufu:67
ip:127.0.0.1, qufu:69
ip:127.0.0.1, qufu:1
ip:127.0.0.1, qufu:2

十一。循环获取文件或者命令输出的内容#

循环获取文件或者命令输出的内容

  • for i in 默认 以空白分割 循环获取每个元素

  • while read 每次获取整行

while read 的参数 可以接任意个,默认还是以空白分割

如果参数没有对应获取的值,那参数就为空

如果文件中空白分割的参数大于 read 接受的参数,那多出的参数都会赋给最后一个 read 接受的参数

管道  进制之间通信的一种方式

十二. shell 中的一维数组#

shell 中的一维数组

shell 中的一维数组 使用
定义:使用圆括号,中间以 空格 作为分隔符
博客连接:https://www.cnblogs.com/tangshengwei/p/5446315.html

示例14.1:定义、索取
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# a=(xx yy zz)			# 注:a 是一个数组
[root@sanchuang-linux ~]# a=(xx yy zz ff)		# 注:a 是一个数组
[root@sanchuang-linux ~]# echo ${a[0]}			# 注:通过索引查找,下标从0开始
xx
[root@sanchuang-linux ~]# echo ${a[1]}			# 注:通过索引查找
yy
[root@sanchuang-linux ~]# echo ${a[3]}
ff
[root@sanchuang-linux ~]# echo ${a[@]}			# 注:${a[@]} 表示它里面的每一个数,@ 取它里面的全部值
xx yy zz ff										# 注:$@ 参数列表里面的全部内容
[root@sanchuang-linux ~]# echo ${a[@]:1:4}		# 注:索取(切片)
yy zz ff
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# a=(xx yy zz ff)
[root@sanchuang-linux ~]# echo $a			# 注:echo $a  只取出一位数组里的第一个元素
xx
[root@sanchuang-linux ~]# echo ${a[*]}		# 注:${a[*]} 取出一位数组里面的全部内容,效果一样
xx yy zz ff
[root@sanchuang-linux ~]# echo ${a[@]}		# 注:${a[@]} 取出一位数组里面的全部内容
xx yy zz ff
[root@sanchuang-linux ~]# echo ${a:0:4}		# 注:对字符 xx 进行截取 从0开始
xx
[root@sanchuang-linux ~]# echo ${a:1:4}		# 注:对字符 xx 进行截取 从1开始
x
[root@sanchuang-linux ~]# echo ${a[*]:1:3}	# 注:索取,效果一样(切片)
yy zz ff
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# a=(1 2 3 4)
[root@sanchuang-linux ~]# echo ${a[*]:1:3}	# 注:索取,闭区间(切片)
2 3 4
============================================================================================
获取长度(元素个数)
#注:$#	获取参数列表长度
# echo ${#a[*]}
# echo ${#a[@]}
示例14.2:获取一位数组长度(元素个数)
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# echo ${#a[*]}			# 注:不能用$a直接获取,因为 $a 代表 里面第一个元素
4
[root@sanchuang-linux ~]# echo ${#a[@]}
4
[root@sanchuang-linux ~]# echo ${#a}			# 注:第一个元素长度
2
###########################################################################################
示例14.3:获取字符串长度 echo ${#b}
[root@sanchuang-linux ~]# b=abc
[root@sanchuang-linux ~]# echo ${#b}
3
============================================================================================
修改/删除 元素(shell里面一维数组的修改/删除)
示例14.4:修改/删除 元素
[root@sanchuang-linux ~]# echo ${a[*]}
xx yy zz ff
[root@sanchuang-linux ~]# a[3]="hh"					# 注:修改元素
[root@sanchuang-linux ~]# echo ${a[*]}
xx yy zz hh											# 注:清空数组 unset a
[root@sanchuang-linux ~]# unset a[3]				# 注:删除指定元素(下标为3)
[root@sanchuang-linux ~]# echo ${a[*]}
xx yy zz
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# echo ${a[*]}
xx zz
[root@sanchuang-linux ~]# unset a[1]				# 注:删除不了
[root@sanchuang-linux ~]# echo ${a[*]}
xx zz
[root@sanchuang-linux ~]# echo ${!a[*]}				# 注:加! 看元素的下标
0 2				# 注:删除后,不会重新分配下标。一开始每个值的下标都一一对应了,不会改
[root@sanchuang-linux ~]# unset a[2]				# 注:删除zz元素,unset a[2],下标为2
[root@sanchuang-linux ~]# echo ${a[*]}
xx
[root@sanchuang-linux ~]# 

十三. linux 里 生成随机数#

linux 里 生成随机数

示例
--------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# echo $RANDOM 		# 注:自定义的环境变量
15386
[root@sanchuang-linux ~]# echo $RANDOM 
24960
############################################################################################
知识点15.2 生成指定范围内的随机数
示例1:产生10以内的随机数(不含10)
[root@sanchuang-linux ~]# echo $(($RANDOM % 10)) 
1
[root@sanchuang-linux ~]# echo $(($RANDOM % 10)) 
8
[root@sanchuang-linux ~]# echo $(($RANDOM % 10)) 
2
[root@sanchuang-linux ~]# echo $(($RANDOM % 10)) 
3

十四。练习:编写一个随机抽取同学唱歌的程序,如果唱过了,就不能再次被抽到了#

编写一个随机抽取同学唱歌的程序,如果唱过了,就不能再次被抽到了

1、编写一个文件,里面存放我们歌手的名字 name.txt

2、随机抽取歌手 # 1. 循环抽取 2. 抽到了就丢掉

============================================================================================
#注:使用命令的输出  用``反引号
#注:把读到的人员名单变成一个数组
示例
--------------------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# vim geshou_test.sh
#!/bin/bash
# 将name.txt的内容读取出来					   # 注:反引号` ` 把cat命令的输出放到数组里
singers=(`cat name.txt`)					# 注:把读取的内容放到数组里面(cat读取)
echo ${singers[@]}			# 注:验证是否取出数据	# 注:相对路径 指当前下的文件
# 有多少人
total=${#singers[@]}						# 首先 获取人数(对singers长度进行统计)

for i in `seq $total`						# 然后循环(for 循环次数,$total 人数进行循环)
do											# 注:反引号` `  命令去执行它
    read -p "请输入任意键进行抽取"			 # 注:read 目的:敲一下键盘  才会接着循环
    # 随机抽取一个人演唱				# 每次循环都是抽取 新的 列表里面的人数(因为下标问题)
    random_num=$(( $RANDOM % ${#singers[*]} ))		#注:生成随机数,范围0 ~ 一维数组长度
    echo "随机数为:$random_num"				# 注:随机抽取索引/下标
    echo "有请${singers[$random_num]}献唱一首!大家热烈欢迎!"
    unset singers[$random_num]				# 注:把选中的人删除(与python不同的是,删除以后下标不变)
    singers=(`echo ${singers[@]}`)			# 注:解决办法 重新赋值,赋值给一个新的一维数组
    echo "未献唱者具体名单为: ${singers[@]}"	 # 注:↑也可以使用 singers=(${singers[@]})
done										# 注:↑也可以使用singers= `echo ${singers[@]}`
[root@sanchuang-linux chenpeng]# cat name.txt 	# 注:↑重新赋值后  下标会变 从0~总长度
fengcheng
zhanghuayou
pengyifan
chenpeng
xulilin
tangliangfei
wangtiancheng
lixinhai
liangluyao
--------------------------------------------------------------------------------------------
演示
[root@sanchuang-linux chenpeng]# sh geshou_test.sh 
fengcheng zhanghuayou pengyifan chenpeng xulilin tangliangfei wangtiancheng lixinhai liangluyao
请输入任意键进行抽取
随机数为:2
有请pengyifan献唱一首!大家热烈欢迎!
未献唱者具体名单为: fengcheng zhanghuayou chenpeng xulilin tangliangfei wangtiancheng lixinhai liangluyao
请输入任意键进行抽取
随机数为:2
有请chenpeng献唱一首!大家热烈欢迎!
未献唱者具体名单为: fengcheng zhanghuayou xulilin tangliangfei wangtiancheng lixinhai liangluyao

#注:获取命令输出的时候  加``反引号

十五。练习:产生 5--10 之间随机数#

产生 5--10 之间随机数

产生5--10之间随机数
[root@sanchuang-linux chenpeng]# echo $(( $RANDOM % 10 ))		# 注:产生10以内随机数
3
[root@sanchuang-linux chenpeng]# echo $(( $RANDOM % 5 +5 ))		# 注:取5以内的随机数 +5
6
[root@sanchuang-linux chenpeng]# echo $(( $RANDOM % 5 +5 ))
8
--------------------------------------------------------------------------------------------
50--150之间随机数
[root@sanchuang-linux chenpeng]# echo $(( $RANDOM % 100 +50 ))
79                                                    # 注:100是区间绝对值,50是初始值
--------------------------------------------------------------------------------------------
150-200之间随机数                      # 注:150初始值, 50 + 150 末尾值
[root@sanchuang-linux ~]# echo $(( $RANDOM % 50 + 150 ))	# 注:150~200之间
190

十六. tr(替换命令)#

tr 命令(替换命令)

tr 命令(主要用来做字符的替换) # 注:对文本处理常用

  • 字符转换工具
  • 只能对stdin操作,不能直接对文件操作 # 注:只能对标准输入进行操作

----------------------------------------------------

使用 tr 转换字符

  • tr SET1 SET2
  • 用 SET2 中的字符替换掉 SET1 中同一位置的字符

tr -d 删除指定字符
tr -s 压缩相同字符,将连续的指定字符压缩成一个字符

示例
--------------------------------------------------------------------------------------------
示例1:替换
#注:替换同位置的
[root@sanchuang-linux chenpeng]# echo 123456| tr 345 xyz	# 注:把345替换成xyz
12xyz6														# 注:只能对标准输入进行操作
[root@sanchuang-linux chenpeng]# echo 123456| tr 3 xyz		# 注:把3替换成xyz
12x456														# 注:只替换了x,对应位置的
															# 注:有几个位置,替换几个字符
															# 注:替换同位置的
============================================================================================
示例2:删除 # echo 123456| tr -d 34
tr -d  删除指定字符
[root@sanchuang-linux chenpeng]# echo 123456| tr 3 ""		# 注:"" 不能为空,它要替换同位置的
tr: 当不截断设置1 时,字符串2 不能为空
[root@sanchuang-linux chenpeng]# echo 123456| tr -d 34		# 注:删除接tr -d
1256
============================================================================================
tr -s  压缩相同字符,将连续的指定字符压缩成一个字符
将连续的指定字符压缩成一个字符
示例3:tr -s  压缩相同字符
[root@sanchuang-linux chenpeng]# echo 111223333444445556666| tr -s 34
11122345556666												# 注:当有连续的时候压缩成一个
[root@sanchuang-linux chenpeng]# echo 11122333344444555666633377744| tr -s 34
1112234555666637774											# 注:并不是去重
============================================================================================
练习4:把环境变量里 : 替换成空格								   # 注:关键点 tr不能替换文件内容
[root@sanchuang-linux chenpeng]# echo $PATH |tr ":" " "		# 注:关键点 tr接收的是标准输入
/lianxi/sc /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /root/bin /usr/local/nginx/sbin /root/bin /usr/local/nginx5/sbin /root/bin
============================================================================================
扩展5:替换文件里的内容,生成一个新文件
#注:把文件导进来  进行标准输入
示例:将/etc/passwd里的 :替换成空格
--------------------------------------------------------------------------------------------
写法1:cat导入
[root@sanchuang-linux chenpeng]# cat /etc/passwd |tr ":" " " >/tmp/passwd
[root@sanchuang-linux chenpeng]# less /tmp/passwd 			# 注::全变空格了
写法2:tr接收标准输入  重定向标准输入 tr ":" " " </etc/passwd
[root@sanchuang-linux chenpeng]# tr ":" " " </etc/passwd  >/tmp/passwd2 
[root@sanchuang-linux chenpeng]# less /tmp/passwd2			# 注::全变空格了
#注:写法2把一个文件导进来,进行标准输入    tr ":" " " </etc/passwd
============================================================================================
扩展5.1 重定向标准输入
[root@sanchuang-linux chenpeng]# wc -l /etc/passwd			# 注:wc -l 查看文件行数
52 /etc/passwd
示例:重定向标准输入
[root@sanchuang-linux chenpeng]# wc -l < /etc/passwd
52

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。