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

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.