一。練習:ユーザーの増減改査#
スクリプト スクリプトを作成し、以下の機能を実現する
====================
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
五。接続演算#
接続演算
セミコロン (;) を使用して 1 行に複数の文を書く
例:
--------------------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# echo "abc";echo "xyz"
abc
xyz
六。関数#
関数の定義 / 使用#
例
--------------------------------------------------------------------------------------------
add(){
echo “2つの数の合計は:$(( $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コマンドはPythonのrange関数に似ている 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 "名前は$a、性別は$b、年齢は$cです"
done < a.txt # 注:現在のパス下のファイル。絶対パスも接続可能
============================================================================================
パイプ記号#
例2:パイプ記号 cat a.txt | while read a b c
--------------------------------------------------------------------------------------------
cat a.txt | while read a b c
do
echo "名前は$a、性別は$b、年齢は$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" # 注:パラメータ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, 区服:1 33 49 57 # 最初の2つは対応し、最初の2つを取得
ip:127.0.0.1, 区服:65 67 69 # 後ろにある場合は、すべて後ろの内容
ip:127.0.0.1, 区服: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, 区服:$i" # 注:ここはi。区服をループする
done
done
[root@sanchuang-linux ~]# sh test6.sh
ip:127.0.0.1, 区服:1
ip:127.0.0.1, 区服:33
ip:127.0.0.1, 区服:49
ip:127.0.0.1, 区服:57
ip:127.0.0.1, 区服:65
ip:127.0.0.1, 区服:67
ip:127.0.0.1, 区服:69
ip:127.0.0.1, 区服:1
ip:127.0.0.1, 区服:2
十一。ファイルまたはコマンド出力の内容をループで取得する#
ファイルまたはコマンド出力の内容をループで取得する
-
for i はデフォルトで空白で分割し、各要素をループで取得する
-
while read は毎回行全体を取得する
while read の引数は任意の数を受け取ることができ、デフォルトでは空白で分割される
引数が取得される値に対応していない場合、その引数は空になる
ファイル内の空白で分割された引数が read が受け取る引数より多い場合、余分な引数はすべて最後の read が受け取る引数に代入される
パイプ プロセス間通信の一種
十二. shell の 1 次元配列#
shell の 1 次元配列
shell の 1 次元配列の使用
定義:丸括弧
を使用し、間に 空白
を区切り文字として使用
ブログリンク: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[*]}は1次元配列の中のすべての内容を取得し、効果は同じ
xx yy zz ff
[root@sanchuang-linux ~]# echo ${a[@]} # 注:${a[@]}は1次元配列の中のすべての内容を取得
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:1次元配列の長さ(要素数)を取得
--------------------------------------------------------------------------------------------
[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の1次元配列の変更/削除)
例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の目的は、キーボードを叩くことで次のループに進む
# ランダムに1人を抽選する # 毎回のループで新しいリストの人数を抽選する(インデックスの問題)
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 コマンド(主に文字の置換に使用) # 注:テキスト処理でよく使用される
- 文字変換ツール
- 標準入力に対してのみ操作でき、ファイルに直接操作できない # 注:標準入力に対してのみ操作可能
----------------------------------------------------
tr を使用して文字を変換する
- tr SET1 SET2
- SET2 の文字で SET1 の同じ位置の文字を置き換える
tr -d 指定した文字を削除
tr -s 同じ文字を圧縮し、連続する指定文字を 1 つの文字に圧縮
例
--------------------------------------------------------------------------------------------
例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 同じ文字を圧縮し、連続する指定文字を1つの文字に圧縮
連続する指定文字を1つの文字に圧縮
例3:tr -s 同じ文字を圧縮
[root@sanchuang-linux chenpeng]# echo 111223333444445556666| tr -s 34
11122345556666 # 注:連続する場合は1つに圧縮
[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