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 は存在します!"
            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
読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。