一。練習:用戶 增刪改查#
腳本 編寫一個腳本,實現如下功能
====================
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 已存在!"
else
read -s -p "請設置密碼:" password
useradd $username &>/dev/null
echo $password | $username --stdin &>/dev/null
echo -e "\n 創建 $username 成功!"
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 ~]# 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