一。入力出力リダイレクト#
復習 1 入力出力リダイレクト
入力
read -p “入力してください” a -p プロンプト a に a を代入
read -s パスワード隠す
出力
echo
# echo -e “abc\t abc” エスケープ文字出力
abc abc
# echo “abc\t abc”
abc\t abc
echo -n 改行なし
echo -e エスケープ文字出力
二. 2 つの特殊ファイル#
知識点 2 2 つの特殊ファイル
2 つの特殊ファイル
·/dev/null
:標準エラー情報をフィルタリング
·/dev/zero
:指定された長さのファイルを作成するために使用
/dev/null
:ブラックホールファイル、保存せず、出力しない情報はブラックホールファイルに捨てられる
/dev/zero
:指定されたサイズのファイルを生成するために使用、0 の束を生成
例:/dev/zero
:指定されたサイズのファイルを生成するために使用、0 の束を生成
/dev/zero
は一般的に指定されたサイズのファイルを生成するために使用され、テスト用に作成される
dd はバックアップコマンドであり、指定されたサイズのファイルを生成することもできる
if 入力ファイル input file
of 出力ファイル output file
bs 出力データの単位サイズ
count 出力データの単位数
例:_______________________________________________________
[root@sanchuang-linux dev]# dd if=/dev/zero of=/tmp/test.dd bs=1M count=5
5+0の読み込みが記録されました
5+0の書き込みが記録されました
5242880バイト (5.2 MB, 5.0 MiB) コピーされました, 0.00196718 s, 2.7 GB/s
[root@sanchuang-linux dev]# du -sh /tmp/test.dd
5.0M /tmp/test.dd
if どこから導入され、of そのファイルを出力し、bs データ単位サイズ、countデータ単位数
三. here document#
知識点 3 here document
here document 文書はここにある
<<
指定された内容の文書を生成する。
簡単なスクリプトで使用
例:
-----------------------------------------------------------
[root@sanchuang-linux chenpeng]# cat >here_test.txt <<EOF
> こんにちは
> サンチュアン
> ようこそ
> 世界............
> x y z
\> EOF
[root@sanchuang-linux chenpeng]# cat here_test.txt
こんにちは
サンチュアン
ようこそ
世界............
x y z
知識点 3.2 EOF は文書の終了マークであり、自由に定義できる(end of file)
例:
------------------------------------------------------
[root@sanchuang-linux chenpeng]# cat >here_test <<XYZ
> こんにちは
> こんにちは世界
> XYZ
[root@sanchuang-linux chenpeng]# cat here_test
こんにちは
こんにちは世界
四. tee コマンド#
知識点 4 tee コマンド
teeコマンド 画面に出力し、ファイルにもリダイレクトする
例:
----------------------------------
[root@sanchuang-linux chenpeng]# echo "aa" >test_aa.txt #(注:デフォルトでは画面に出力しない)
[root@sanchuang-linux chenpeng]# cat test_aa.txt
aa
[root@sanchuang-linux chenpeng]# echo "bb" |tee test_bb.txt #
(注:画面 + ファイル)
bb
[root@sanchuang-linux chenpeng]# cat test_bb.txt
bb
五。ファイル内容のクリア#
知識点 5 ファイル内容のクリア
[root@sanchuang-linux chenpeng]# >test_bb.txt
[root@sanchuang-linux chenpeng]# echo > test_bb.txt
#(注:改行あり)
[root@sanchuang-linux chenpeng]# cat test_bb.txt
[root@sanchuang-linux chenpeng]# echo -n > test_bb.txt
[root@sanchuang-linux chenpeng]# cat test_bb.txt
[root@sanchuang-linux chenpeng]# :>test_bb.txt
[root@sanchuang-linux chenpeng]# cat test_bb.txt
知識点 6 echo
echo
画面にテキストや指定された内容を表示する
変数を出力し、指定された内容を出力する
-e オプション エスケープ文字出力
-n オプション 改行なし
六. SHELL 入門#
shell入門
shell は C 言語で書かれたプログラムであり、ユーザーが Linux を使用するための橋渡しです
shell スクリプトは自動化を実現し、繰り返しの操作をスクリプトで完了させ、人為的なミスを減らします
SHELL の変数#
shellの変数
1、ローカル変数 スクリプトやコマンド内で定義される
2、環境変数 shell が起動したプログラムがアクセスできる環境変数 env、 echo $PATH
3、shell 変数
例:環境変数
------------------------------------------
[root@sanchuang-linux chenpeng]# which ls
alias ls='ls --color=auto'
/usr/bin/ls #(注:環境変数)
[root@sanchuang-linux chenpeng]# echo $PATH #(注:環境変数)
/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
例2:ローカル変数
-------------------------------------------
a=1
echo $a
echo ${a}
知識点 8.2 変数名の命名規則
変数名の命名規則:
数字、アルファベット、アンダースコアの組み合わせで、数字で始めてはいけない
bash のキーワードを使用してはいけない
定義された変数を使用するには、前に$記号を付ける必要があります
例:
--------------------------------------------
[root@sanchuang-linux chenpeng]# echo $PATH #(注:環境変数)
/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
SHELL の引数を受け取る#
知識点 9 shell の引数を受け取る
shell は引数を受け取る
位置変数 :$1 - $9 、それぞれパラメータリストの第1 - 9のパラメータを表す
繰り返し使用可能(つまり、スクリプト内に $1 が 2 つ存在することができる)
予定義変数、システムが予約したいくつかの変数:
$0 現在のプロセスまたはスクリプト名
$! バックグラウンドで実行されている最後のプロセスの pid 番号
$? 前のコマンドプログラムの戻り値
$* すべてのパラメータの内容を表す
$$ 現在のプロセス pid 番号を示す
$# パラメータの個数を示す
$@ すべてのパラメータを表す(逐次抽出)
# perror 1
コマンドの戻り値を確認し、戻り値の具体的な意味を確認する
$? コマンドの戻り値が 0 であることは正常に実行されたことを示す
0 でない場合はすべて実行エラーを示す
例は以下の通り:__________________________________
[root@mysql-binary shell_test]# echo $?
1
[root@mysql-binary shell_test]# perror 1
OS error code 1: Operation not permitted
#!/bin/bash スクリプトの前にこの行を追加することをお勧めします。どのインタプリタを使用して実行するかをデフォルトで指定します
理由:Unix系オペレーティングシステム、unbuntu、debian、centosの各オペレーティングシステムのデフォルトbashは異なる可能性があります
例 1:位置変数$1、$2
__________________________________
[root@sanchuang-linux shell_test]# cat canshu.sh
#!/bin/bash
echo "######## これは $1########" #(注:位置変数)
echo "$1" #(注:位置変数)
echo "######## これは $2########" #(注:位置変数)
echo "$2" #(注:位置変数)
[root@sanchuang-linux shell_test]# sh canshu.sh "hello" "world" #
(注:2 つの引数を渡した)
######## これは hello######## #(注:引数 1)
hello
######## これは world######## #(注:引数 2)
world
例 2:予定義変数 $0
__________________________________________________________
[root@sanchuang-linux shell_test]# echo $0 #(注:$0 現在のプロセスまたはスクリプト名)
-bash
[root@sanchuang-linux shell_test]# sh canshu.sh "hello" "world"
########これはhello########
hello
########これはworld########
world
canshu.sh #(注:$0 現在のプロセスまたはスクリプト名)
[root@sanchuang-linux shell_test]# cat canshu.sh
#!/bin/bash
echo "########これは$1########"
echo "$1"
echo "########これは$2########"
echo "$2"
echo "$0"
例 3:予定義変数 $* $# $@
_____________________
[root@sanchuang-linux shell_test]# vim canshu.sh
#!/bin/bash
echo "########これは$1########"
echo "$1"
echo "########これは$2########"
echo "$2"
echo "$0"
echo "これはすべて:$*" #(注:$* すべてのパラメータの内容を表す)
echo "パラメータ#:$#" #(注:$# パラメータの個数を示す)
echo "これは@:$@" #(注:$@ すべてのパラメータ(逐次抽出)を表す)
──────────────────────────────────────────────
[root@sanchuang-linux shell_test]# sh canshu.sh hello world 2020 #(注:3つの引数)
########これはhello########
hello
########これはworld########
world
canshu.sh
これはすべて:hello world 2020
パラメータ#:3
これは@:hello world 2020
知識点 10 python での引数の受け取り sys モジュール
python では
sys モジュール内の argv 属性。python の後に渡された引数はリスト
であり、最初の 2 つを取得する
[root@sanchuang-linux ~]# vim canshu.py
import sys
print(sys.argv[1],sys.argv[2]) #(注:1は引数1を受け取る、2は引数2を受け取る)
print(sys.argv[0]) #(注:0はファイル名)
----------------------------------------------------------------------
[root@sanchuang-linux ~]# python3 canshu.py "hello" "world"
hello world
canshu.py
データ型#
知識点 11 データ型
shellでよく使われる数字、文字列、配列
文字列の定義は、シングルクォートを使用することも、ダブルクォートを使用することも、クォートなしで使用することもできます
例:文字列の定義__________________
[root@sanchuang-linux ~]# echo abc
abc
[root@sanchuang-linux ~]# a=b
[root@sanchuang-linux ~]# echo $a
b
[root@sanchuang-linux ~]# a="b"
[root@sanchuang-linux ~]# echo $a
b
[root@sanchuang-linux ~]# a='b'
[root@sanchuang-linux ~]# echo $a
b
例:数字の定義_________________
[root@sanchuang-linux ~]# a=1
[root@sanchuang-linux ~]# a=2
引号の違い#
知識点 12 引号の違い:ダブルクォートは変数を認識でき、シングルクォートは変数を認識できない
引号の違い:ダブルクォートは変数を認識でき、シングルクォートは認識できない
[root@sanchuang-linux ~]# head -n1 /etc/passwd #(注:passwdの最初の行を出力)
root:x:0:0:root:/root:/bin/bash
[root@sanchuang-linux ~]# cat /etc/passwd |head -n1 #(注:この2つのコマンドは推奨されない)
root:x:0:0:root:/root:/bin/bash
#!/bin/bash
# 文字列操作
line=`head -n1 /etc/passwd` #(注:バッククォート``を使用)(注:コマンドの出力をlineに保存)
echo $line
---------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# bash test2.sh
root:x:0:0:root:/root:/bin/bash
例:ダブルクォートは変数を認識でき、シングルクォートは変数を認識できない_____________________________
echo "文字列は:$line"
文字列は:root:x:0:0:root:/root:/bin/bash
------------------------------------------
echo '文字列は:$line'
文字列は:$line
文字列操作#
知識点 13 文字列操作
切り取り
最初の4文字を切り取る:echo ${line:0:4}
最後の9文字を切り取る echo ${line:0-9}
最後から9文字目から4文字を切り取る echo ${line:0-9:4}
左から右へ最後の文字を切り取る echo ${line##*:}
左から右へ最初の文字を切り取る echo ${line#*:}
右から左へ最後の文字を切り取る echo ${line%%:*}
右から左へ最初の文字を切り取る echo ${line%:*}
文字列の長さ echo ${#line}
例:文字列操作_______________________________
# 文字列操作
[root@sanchuang-linux chenpeng]# vim test2.sh
line=`head -n1 /etc/passwd`
echo $line #(注:root:x:0:0:root:/root:/bin/bash)
echo "文字列は:$line" #(注:文字列は:root:x:0:0:root:/root:/bin/bash)
echo '文字列は:$line' #(注:文字列は:$line)
echo "最初の4文字を切り取る:"
echo ${line:0:4} #(注:root)
echo "最後の9文字を切り取る"
echo ${line:0-9} #(注:/bin/bash)
echo "最後から9文字目から4文字を切り取る"
echo ${line:0-9:4} #(注:/bin)
echo "左から右へ最後の文字を切り取る:"
echo ${line##*:} #(注:/bin/bash)
echo "左から右へ最初の文字を切り取る"
echo ${line#*:} #(注:x:0:0:root:/root:/bin/bash)
echo "右から左へ最後の文字を切り取る"
echo ${line%%:*} #(注:root)
echo "右から左へ最初の文字を切り取る"
echo ${line%:*} #(注:root:x:0:0:root:/root)
echo "文字列の長さ"
echo ${#line} #(注:31)
-----------------------------------------------
[root@sanchuang-linux chenpeng]# bash test2.sh
root:x:0:0:root:/root:/bin/bash
文字列は:root:x:0:0:root:/root:/bin/bash
文字列は:$line
最初の4文字を切り取る:
root
最後の9文字を切り取る
/bin/bash
最後から9文字目から4文字を切り取る
/bin
左から右へ最後の文字を切り取る:
/bin/bash
左から右へ最初の文字を切り取る
x:0:0:root:/root:/bin/bash
右から左へ最後の文字を切り取る
root
右から左へ最初の文字を切り取る
root:x:0:0:root:/root
文字列の長さ
31
練習 13 百度の URL を切り取る
line="http://www.baidu.com/login"
# 切り取る:login
echo ${line:0-5} #(注:最後の5文字を取得)
echo ${line##*/} #(注:左から右へ最後の/の後の内容を取得)
# 切り取る:www.baidu.com/login
echo ${line##*//}
# 切り取る:http://www.baidu.com
echo ${line%/*}
# 切り取る:http:
echo ${line%%/*}
数値の演算と比較#
知識点 14 数値の演算と比較
数値の演算:
第一の方法: $(( 表現 ))
第二の方法: $[ 表現 ]
第三の方法: expr 表現
演算子の左右の空白
に注意
例:↓↓↓↓↓↓↓↓↓↓↓↓↓↓
[root@sanchuang-linux ~]# a=10
[root@sanchuang-linux ~]# b=20
[root@sanchuang-linux ~]# $(($a + $b))
-bash: 30: コマンドが見つかりません
[root@sanchuang-linux ~]# echo $(($a + $b))
30
[root@sanchuang-linux ~]# echo $[ $a +$b ]
30
[root@sanchuang-linux ~]# expr $a + $b
30
[root@sanchuang-linux ~]# expr $a+$b
10+20
SHELL 構造文、ループと条件#
知識点 15 shell 構造文、ループと条件
知識点 15.1 for ループ
for ループ
構文1:↓↓↓↓↓↓↓↓
-----------------------
for 変数 in 値1 値2
do
ループ実行文
done
=======================================
構文2:↓↓↓↓↓↓↓
---------------------------------------
# for ((i=0;i<3;i++))
for ((初期化変数; ループ終了条件; 演算))
do
ループ実行文
done
知識点 15.2 while ループ
While ループ
構文1:↓↓↓↓↓
---------------------------------------
while read line
do
ループ実行文
done
=======================================
構文2↓↓↓↓↓↓↓↓↓
---------------------------------------
while [条件(必須ではない)]:
do
ループ実行文
done
=======================================
注:break、continueもサポートされています
知識点 15 条件
知識点 15.3 if 文
if 文
構文1:↓↓↓↓↓
-------------------------
if 条件
then
実行文
fi
=========================
構文2:↓↓↓↓↓
if 条件
then
実行文
else
実行文
fi
==========================
構文3:↓↓↓↓↓↓
----------------------
if [ コマンド ];then
条件に合致する場合の実行文
elif [ コマンド ];then
条件に合致する場合の実行文
else
条件に合致しない場合の実行文
fi
知識点 15.4 case 文
case 文
構文:↓↓↓↓↓________________
case $変数名 in
条件1)
実行文1
;;
条件2)
実行文2
;;
*)
esac
練習 16
シェルスクリプトを作成する
ユーザーが入力した 2 つの数を受け取り、2 つの数に対して何の計算を行うかを選択し、結果を出力する
メニュー選択を実現する
================
-
add 加算
-
sub 減算
-
mul 乗算
-
exit 終了
================
注:メニュー選択は case を使用し、サービス再起動スクリプトは case を使用
例:↓↓↓↓↓↓↓↓↓_________________________
[root@sanchuang-linux chenpeng]# vim num_test.sh
#!/bin/bash
read -p "数字1を入力してください:" num1
read -p "数字2を入力してください:" num2
echo "================"
echo "1.add 加算"
echo "2.sub 減算"
echo "3.mul 乗算"
echo "4.exit 終了"
echo "================"
read -p "あなたの選択を入力してください:" options
case $options in
1)
echo "2つの数の合計は:$(($num1 + $num2))"
;;
2)
echo "2つの数の差は:$(($num1 - $num2))"
;;
3)
echo "2つの数の積は:$(($num1 * $num2))"
;;
4)
echo "終了!"
exit
esac
-------------------------------------------------------------------------------------------
関数形式に整える
add(){
echo "2つの数の合計は:$(($num1 + $num2))"
}
case $options in
1)
add #(注:必要なときに呼び出す)
;;
2)…………………………
/etc/init.d サービスの起動スクリプト#
知識点 17 /etc/init.d サービスの起動スクリプト
/etc/init.d/ サービスの起動スクリプトが置かれています
[root@sanchuang-linux chenpeng]# cd /etc/init.d/
[root@sanchuang-linux init.d]# ls
functions README
例:サービス再起動スクリプトはcaseを使用↓↓↓↓↓__________________
case $mode in
start)
起動
;;
stop)
停止(killコマンドを使用)
;;
restart)
停止
起動
;;
reload)
設定を再読み込み(kill -HUPを使用)
;;
esac
kill#
知識点 18 kill
killは実行中のプログラムや作業を削除するために使用されます
killは指定された情報をプログラムに送信できます
# kill -l でkill信号を確認できます (kill -L(小文字))
# kill -0 プロセスが存在するかどうかを検出するために使用され、プロセスが存在しない場合、kill -0はエラーを報告します
# kill -1 pid プロセスを再読み込みします(一般的に使用されます)
# kill -HUP pid と kill -1 pidは同じです
# kill -1 pid または kill -HUP pid はこのファイルを再読み込みすることを示します
# kill -9 強制終了
# kill -15 プロセスを正常に停止します
killが信号量を指定しない場合、デフォルトでは信号15です
9号信号以外の信号は、プロセスが実行を拒否する権利があります
注:再読み込みは最新の設定を読み込むことに相当し、サービスは正常に実行され続けます(接続は切断されません)
再起動するとサービスは切断されます
例:↓↓↓↓↓↓↓↓↓____________
[root@sanchuang-linux ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
…………………………
63) SIGRTMAX-1 64) SIGRTMAX
SHELL プログラミング if 判断#
知識点 19 shell プログラミング if 判断
if 判断
例:↓↓↓↓↓↓____________________________________________________________
[root@sanchuang-linux ~]# if id wenyao; then echo "ok"; else echo "error"; fi
id: “wenyao”:ユーザーが存在しません
error
--------------------------------------------------------
同等の:↓↓↓↓↓________________________________________________
if id wenyao;
then
echo "ok";
else
echo "error";
fi
[ ]#
知識点 20 [ ]
[ ] は条件テストを示します
ここでの空白は非常に重要です。'[' の後と ']' の前には必ず空白を入れる必要があります。
一般的な判断:
[ -d FILE ] FILEが存在し、ディレクトリである場合は真を返します。
[ -f FILE ] FILEが存在し、通常のファイルである場合は真を返します。
[ -e **** ] ファイル/フォルダが存在するかどうかを判断します
文字列の判断:
[ -z STRING ] STRINGの長さがゼロである場合は真を返します、つまり空は真です
[ -n STRING ] STRINGの長さがゼロでない場合は真を返します、つまり非空は真です
[ STRING1 ] 文字列が空でない場合は真を返します、-nと似ています
[ STRING1 == STRING2 ] 2つの文字列が同じである場合は真を返します
[ STRING1 != STRING2 ] 文字列が異なる場合は真を返します
[ STRING1 < STRING2 ] “STRING1”が“STRING2”より辞書順で前にある場合は真を返します。
[ STRING1 > STRING2 ] “STRING1”が“STRING2”より辞書順で後にある場合は真を返します。
数値の判断
[ INT1 -eq INT2 ] INT1とINT2が等しい場合は真を返します ,=
[ INT1 -ne INT2 ] INT1とINT2が異なる場合は真を返します ,<>
[ INT1 -gt INT2 ] INT1がINT2より大きい場合は真を返します ,>
[ INT1 -ge INT2 ] INT1がINT2以上である場合は真を返します,>=
[ INT1 -lt INT2 ] INT1がINT2より小さい場合は真を返します ,<
[ INT1 -le INT2 ] INT1がINT2以下である場合は真を返します,<=
論理判断
[ ! EXPR ] 論理否定、もしEXPRがfalseであれば真を返します。
[ EXPR1 -a EXPR2 ] 論理AND、もしEXPR1とEXPR2が全て真であれば真を返します。
[ EXPR1 -o EXPR2 ] 論理OR、もしEXPR1またはEXPR2が真であれば真を返します。
[ ] || [ ] ORを使用して2つの条件を結合します
[ ] && [ ] ANDを使用して2つの条件を結合します
例:↓↓↓↓↓↓↓↓↓↓↓↓↓
[root@sanchuang-linux ~]# a=10
[root@sanchuang-linux ~]# b=20
[root@sanchuang-linux ~]# if [ $a -gt $b ];then echo "a>b";else echo "a<b";fi #(注:正しい)
a<b
[root@sanchuang-linux ~]# if [ $a > $b ];then echo "a>b";else echo "a<b";fi #(注:エラー)
a>b (注:2つの中括弧を使用するとエラーが出ない)
[root@sanchuang-linux ~]# if [[ $a > $b ]];then echo "a>b";else echo "a<b";fi #(注:正しい)
a<b
[root@sanchuang-linux ~]# if [ $a -gt $b ] && [ $a -ne 20 ];then echo "出力a>b";else echo "出力a<b";fi
出力a<b
練習 21
現在のディレクトリにファイル a が存在するかどうかを判断し、存在しない場合は作成します
存在する場合は、ファイルが既に存在することを出力します
例:↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
書き方1:
if [ -f a.txt ];
then echo "ファイルが存在します"
else
touch a.txt
fi
-------------------------------------------------
書き方2:推奨(Pythonのif三項演算子に似ています)
[ -f a.txt ] && echo "ファイルは既に存在します" || touch a.txt
例 2:
スクリプトを作成し、以下の機能を実現します
==============
-
ユーザーを追加し、パスワードを設定する
-
ユーザーを削除する
-
ユーザーを表示する
-
終了する
==============
入力が 1-4 でない場合は、警告を表示し、終了を入力しない限り、ループして追加できます。
1 を押すと、ユーザーを追加し、パスワードを設定します useradd passwd
2 を押すと、ユーザーを削除します userdel -r
3 を押すと、ユーザーを表示します id
4 を押すと、終了します exit
&& ||#
知識点 22 Python の if 三項演算子に似ています
&& || を使用して実現する
・cmd1 && cmd2 cmd1 が成功した場合、または真であれば、cmd2 を実行します
・cmd1 || cmd2 cmd1 が成功しなかった場合、または偽であれば、cmd2 を実行します
・cmd1 && cmd2 || cmd3 cmd1 が成功した場合、cmd2 を実行し、成功しなかった場合は cmd3 を実行します
例:前の練習↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
[ -f a.txt ] && echo "ファイルは既に存在します" || touch a.txt
[[ -f a.txt ]] && echo "ファイルは既に存在します" || touch a.txt #(注:2つの中括弧を推奨)
例:
-------------------------------------------------------------------------------------------
[root@sanchuang-linux ~]# a=10
[root@sanchuang-linux ~]# b=20
[root@sanchuang-linux ~]# [ $a -gt $b ] && echo "出力 a>b"
[root@sanchuang-linux ~]# [ $a -gt $b ] || echo "出力 a<b"
出力 a<b
[root@sanchuang-linux ~]# [ $a -gt $b ] && echo "出力 a>b" || echo "出力 a<b"
出力 a<b
[] 、[[]]、 (()) (判断方法)#
知識点 23 [] 、[[]]、 (()) (判断方法)
[ ] は単語の分割を行います
[ ] は多くの表現をサポートしていません、[[]] を使用して判断することを推奨します(2 つの中括弧)
まとめ:
·判断には
[[ ]]を使用することを推奨します
·文字列には
[[]] (推奨)
·数字の比較には
(( ))
結論:判断には [[]] を使用することを推奨します
例1:if判断時
-------------------------------------------------------------------------------------------
[root@sanchuang-linux chenpeng]# name="wen yao"
[root@sanchuang-linux chenpeng]# [ $name == "wen yao" ] && echo "ok" || echo "error"
-bash: [: 引数が多すぎます #(注:自動的に単語を分割します)
error
[root@sanchuang-linux chenpeng]# [[ $name == "wen yao" ]] && echo "ok" || echo "error"
ok #(注:2つの中括弧を推奨)
[root@sanchuang-linux chenpeng]# [ "$name" == "wen yao" ] && echo "ok" || echo "error"
ok #(注:引用符で結合して、全体を表します)
============================================================================================
例2:数値比較
-------------------------------------------------------------------------------------------
[root@mysql-binary shell_test]# echo $a
10
[root@mysql-binary shell_test]# echo $b
20
[root@mysql-binary shell_test]# [[ $a > $b ]] && echo "ok" || echo "error"
error
[root@mysql-binary shell_test]# [ $a > $b ] && echo "ok" || echo "error"
ok #(注:エラー)
[root@mysql-binary shell_test]# (( $a == $b )) && echo "ok" || echo "error"
error
例:
--------------------------------------------------------------------------------------------
[root@mysql-binary shell_test]# a=10
[root@mysql-binary shell_test]# b=20
[root@mysql-binary shell_test]# if [[ $a > $b ]]; then echo "ok"; else echo "error"; fi
error
[root@mysql-binary shell_test]# [[ $a > $b ]] && echo "ok" || echo "error"
error
例:文字列比較(( )) でも可能
--------------------------------------------------------------------------------------------
[root@mysql-binary shell_test]# a=abc
[root@mysql-binary shell_test]# b=abc1
[root@mysql-binary shell_test]# (( $a > $b )) && echo "ok" || echo "error"
error
[root@mysql-binary shell_test]# a=abc
[root@mysql-binary shell_test]# b=bac1
[root@mysql-binary shell_test]# (( $a > $b )) && echo "ok" || echo "error"
error
[root@mysql-binary shell_test]# a=abc
[root@mysql-binary shell_test]# b=abc
[root@mysql-binary shell_test]# (( $a == $b )) && echo "ok" || echo "error"
ok
結論:判断には[[ ]]を使用することを推奨します
SHELL 関数 定義#
知識点 24 Shell 関数 定義
例:
add() {
echo "2つの数の合計は:$(( $num1 + $num2 ))" #(注:関数内の操作内容)
}
------------------------------------------------
呼び出すとき add
case $options in
1)
add
;;
2)……………………
--------------------------------------------------------------------------------------------
add(){
echo "2つの数の合計は:$(($num1 + $num2))"
}
case $options in
1)
add #(注:必要なときに呼び出す)
;;
2)…………………………
判断方法 [] [[]] (()) test#
知識点 25 判断方法 [] [[]] (()) 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