1.8 Linuxの基礎(8) - シェルスクリプトの基礎
1.8.1、シェルスクリプトを作成します
- テキストファイルのvimを作成するには、テキストエディタを使用します
- 最初のラインシェル宣言シーケンス:!#を含まなければならない(マジックナンバー)
- #!/ binに/ bashの
- #で始まるコメントを追加します(中国語を使用しないようにしてください)
スクリプトの1.8.2実装
- bashのscript-name.sh
- /path/to/script-name.shまたは./script-name.sh スクリプトは、ジョブの実行権限が必要です
给脚本增加执行权限:
chmod +x script-name.sh
- またはソース。スクリプト名
- 注:このスクリプトは、親シェルに渡された変数または関数の戻り値の値ではなく、スクリプトを実行するためにサブシェルを生成するよりも、現在のシェル内でスクリプト変数をロードするコマンドを実行するであろう。、Bはペースサブシェルを生成するために実行されます。
[root@CentOS7 data]# cat source.sh
#!/bin/bash
#
name=10000
[root@CentOS7 data]# name=0
[root@CentOS7 data]# echo $name
0
[root@CentOS7 data]# sh source.sh
[root@CentOS7 data]# echo $name
0
[root@CentOS7 data]# . source.sh
[root@CentOS7 data]# echo $name
10000
[root@CentOS7 data]# cat source2.sh
echo $name
[root@CentOS7 data]# . source2.sh
10000 ##一个脚本调用另一个脚本的参数
1.8.3、スクリプト仕様
スクリプトコード協定の始まり
1、通常呼び出すために使用される言語の最初の行
ファイル名を変更しないようにする2、プログラム名は、右のファイルを見つけることができません
図3に示すように、バージョン番号
4、時間の変更後
5.著者情報
6、プログラムの役割、および注意事項
アップデートの各バージョンの7、最終的には、簡単な説明
#!/bin/bash
# ------------------------------------------
# Filename: hello.sh
# Revision: 1.1
# Date: 2018/08/01
# Author: zhu
# Email: [email protected]
# Website: www.xxx.com
# Description: This is the first script
# ------------------------------------------
# Copyright: 2018 zhu
# License: GPL
echo “hello world
スクリプトデバッガ1.8.4
バッシュ-n構文エラー検出スクリプト/パス/に/ some_script
デバッグbashの-x /パス/に/ some_scripをステップ実行
1.8.5スクリプトを書くための良い習慣を開発
- 抜け出すためにワンタイムシンボルペア、その後、バックスペースの追加コンテンツは、漏れを防ぐためにログイン
- []大カッコは、[[]]端は二つのスペースを持っている必要があります
- ワンタイムフォーマットを終えた制御文を、フロー、コンテンツを追加
- インデントによってコードが読みやすくします
- 参照コマンドの場合は、「二重引用符」、文字列変数の数の従来の変数の値を追加する必要がある定義、および等号の前後にスペースを持つことができない、参照は「」で、強い必要
- Linuxのシンボルは英語の状態で記号であります
1.8.6は、あなたの最初のスクリプトのHello Worldを書きます
[root@CentOS7 ~]# vim test1.sh
[root@CentOS7 ~]# cat test1.sh
#!/bin/bash
# ------------------------------------------
# Filename: test1.sh
# Revision: 1.1
# Date: 2018/08/01
# Author: zhu
# Email: [email protected]
# Website: www.studylinux.net
# Description: This is the first script
# ------------------------------------------
# Copyright: 2018 zhu
# License: GPL
echo "hello world"
1.8.7は、現在のホストのシステム情報を表示し、スクリプト/root/bin/systeminfo.shにスクリプトを書きます
ホスト名、IPv4アドレス、オペレーティングシステムのバージョン、カーネルバージョン、CPUの種類、メモリサイズ、ハードディスクドライブのサイズを含みます
[root@CentOS7 ~]# cat /root/bin/systeminfo.sh
#!/bin/bash
echo "OS_version is `cat /etc/centos-release| grep -o "[0-9]\+"|head -n1`"
echo "Kernel_version is `uname -r`"
echo "IPv4 is `ifconfig ens33|grep "cast"|tr -s ' ' |cut -d" " -f3`"
echo "CPU_type is `lscpu |grep "Model name"|tr -s " " |cut -d: -f2`"
echo "Memory Size is `cat /proc/meminfo |head -n1 |tr -d " "|cut -d: -f2`"
lsblk|grep "^sd"|tr -s " "|cut -d " " -f1,4`"
echo "Hostname is $HOSTNAME"
echo "My name is "$USER""
1.8.8変数
- 変数:名前のメモリ空間
データ保存:ASCII
- キャラクター:110
- 値:110
- キャラクター:110
- 変数の効果:
- 1、データ・ストレージ・フォーマット
- 操作に関連する2、
- 図3に示すように、データの範囲が示され
- 1、データ・ストレージ・フォーマット
- 変数タイプ:
- 文字
- 値:整数、浮動小数点
- 文字
- 強く型付けされた:使用前に変数は、事前に宣言し、さらに初期化する必要がありますする必要があります
弱い型:変数、使用前には、前に宣言することなく、自動的に暗黙的型変換を計算することに関与します。デフォルトの文字形式は、bashは浮動小数点型をサポートしていません。
- 変数の命名規則:
- 1、ようにプログラムが確保できない単語:例えば、もし
- 2、唯一の数字、文字、アンダースコアを使用することができますし、数字で始めることはできません
- 3、正義を知っている名前を参照してください
- 4、統一命名規則:こぶ命名法
- 1、ようにプログラムが確保できない単語:例えば、もし
以下は、力可変式可変範囲の規格に分かれています。
- ローカル変数:現在のシェル・プロセスのための有効範囲、現在のシェルのシェルプロセス以外のために、現在のサブシェルプロセスシェルを含むが無効です
- 環境(グローバル)変数:現在のシェルプロセスとその子のための有効範囲
- ローカル変数:有効範囲は現在のシェルプロセスの抜粋、通常の関数であります
- 場所変数:$ 1、$ 2、...引数がスクリプトコードで、コマンドラインに渡さ呼び出すためのスクリプトのために、表現されています
- 特殊変数:$、$ 0、$ *、$ @#$、$$?
- 現在のプロセスのPID:$$
$:!PID実行する1つの命令
1.8.8.1ローカル変数
- 変数の代入:名=「値」
- あなたは、基準値を使用することができます。
- NAME =「ルート」、(1)直接文字列であってもよいです
- (2)変数の参照:名= "$のUSER"
- (3)コマンドリファレンス:名= `COMMAND`名= $(COMMAND)
- NAME =「ルート」、(1)直接文字列であってもよいです
- 変数の参照:$ {名前} $名
- 「」:変数参照変数の値が置換されている弱参照、
- 「」:元の文字列を保持しながら、可変基準変数値が、置換されていない、請求強い参照、
- すべての変数定義された表示:設定
- 変数を削除:未設定の名前を
1.8.8.2環境変数
- 変数宣言、割り当て:
- エクスポート名= VALUE
- -x名前を宣言= VALUE
- エクスポート名= VALUE
- 変数の参照:$名、$ {名前}
- すべての環境変数を表示します:
- ENV
- printenvの
- 輸出する
- -x宣言
- ENV
- 変数を削除:未設定の名前を
1.8.8.3読み取り専用変数
- 読み取り専用変数:のみ、変更、および削除宣言ではなく、
- 読み取り専用変数宣言を:
- 読み取り専用の名前
- -r名を宣言
- 読み取り専用の名前
読み取り専用変数を見る:読み取り専用-p
1.8.8.4位置変数
- 位置変数:スクリプトコードで、コマンドラインからスクリプトに渡されたコール・パラメータ
- $ 1、$ 2、...:対応する第1及び第2のパラメータ、
- [n]の位置トランスデューサをずらします
- $ 0:コマンド自体
- 「$の*」:スクリプトに渡されるすべてのパラメータは、1つの文字列にすべてのパラメータが相当に「$ 1 $ 2 $ 3」
- 「$ @を」:スクリプトに渡されたすべてのパラメータは、各パラメータに埋め込まれたすべての空白を保持してしまう、「$ 1」の異なる独立した文字列と同等として、すべてのパラメータ「$ 2」「$ 3」
- $#:スクリプトに渡すパラメータの数
- $ @を:スクリプトに渡されたすべてのパラメータ
- $の*:すべてのスクリプトを参照することによって渡されたパラメータ、およびだけで$ * $#は、時間の差は、二重引用符で包まれています。
セット - 明確なすべての変数の位置
[root@CentOS7 ~]# name=parent;{ echo "1:$name";name=son;echo "2:$name"; };echo "3:$name"
1:parent ## 花扩号在当前shell中执行,前后有空格,不开启子shell
2:son
3:son
[root@CentOS7 ~]# name=parent;(echo "1:$name";name=son;echo "2:$name");echo "3:$name"
1:parent ## 小括号在执行时,会开启子进程,子进程能拿到父进程的变量,子进程内变量赋值、内部命令将会影响子进程的环境,()执行完成后,子进程结束,不保留变量赋值。
2:son
3:parent
1.8.9 $?コマンド実行状態の戻り値(終了状態)
終了ステータスレポートの成功または失敗を使用するためのプロセス
- 失敗1〜255の成功のための0
- $?戻り値を保持する変数のコマンド実行状態
- たとえば、次のようにping -c1 -W1 hostdown&>を/ dev / nullエコー$?
1.8.10終了ステータス
- bashのカスタム終了ステータスコード
- 出口[N]:カスタム終了ステータスコード
- 注意:exitコマンドスクリプトのイベントでは、スクリプトは直ちに終了します。状態を終了するには、exitコマンドを終了後者の数字注によって異なります。あなたはスクリプトに終了ステータスを指定しない場合、スクリプト全体の終了ステータスは、最後のスクリプトの実行に依存しますステータスコードコマンド
1.8.11算術
- 算術バッシュ:bashのデジタル暗黙的型変換を実行します
- 算術演算子:+、 - 、*、/、%モジュラス(残り)、**(電源)
- 算術演算を実装します。
- (1)せVAR =算術式
- (2)VAR = $ [演算式]
- (3)VAR = $((演算式))
- (4)各=の$(exprのARG1 ARG2 ARG3 ...)
- (5)-i VAR =値を宣言する
- (6) "算術式を" エコー| BC
- いくつかのシーンのような、エスケープする必要があるサイン乗算*
- bashが組み込まれている乱数発生器:0から49の間の乱数:$ RANDOM(0〜32767)は、$ [$ RANDOM%50]エコー
- 強化された割り当て:+ =、 - =、* =、/ =、%=
- varOPERvalueを聞かせて
- 例えば:自己割り当てプラス3から+ 3をカウント=カウント+ = 3、すなわち、カウントを聞かせ
- インクリメント、デクリメント:
- 容易であった+ = 1
- 簡単だっ++
- 簡単熱= 1
- 簡単var--
1.8.12論理演算
- 真偽
- 1、0
- そして、:
- 1 = 1,1
- 1と0 = 0
- = 0 1,0
- 0 0 = 0
- 1 = 1,1
- または:
- 1 = 1又は
- 1 = 0又は1
- 1 = 0又は1
- 0 = 0または0
- 1 = 1又は
- 非:
- !1 = 0
- !0 = 1
- !1 = 0
- 短絡計算
- 短絡および
- 最初は0で、結果は0でなければなりません
- 最初は1であり、第二は、計算に関与しなければなりません
- ショートか
- 最初の結果は、必ずしも1であり、1であります
- 最初は0であり、第二は、計算に関与しなければなりません
- 最初の結果は、必ずしも1であり、1であります
- XOR:^
- XOR二つの値、0偽同じ、異なる真1
1.8.13試験条件
- 一定の要件を満たしているかどうかを判断し、それはテストのメカニズムによって実装される必要があります
- 注:テストコマンドの補助により必要な特別なテスト式は、テストプロセスを完了します
- 条件付き実行で使用するためのアセスメントブール声明
- それは、0を返す場合
falseの場合、それは1を返します。
1.8.14テストコマンド
- テスト式
- [式]
- [式]]
- 注:末尾の空白EXPRESSIONを持っている必要があります
テスト1.8.15のbashの値
- 数値テスト:
- -gtかどうかよりも大きくなっています
- -ge以上あります
- これは、-eqに等しく、
- -ne等しくありません
- 未満-ltかどうか
- -le以下であります
- -gtかどうかよりも大きくなっています
1.8.16 bashの文字列テスト
- 文字列のテスト:
- それは=に等しく、
- > ASCIIコードASCIIコードよりも大きいです
- <以下であります
- !=等しくありません
- =〜文字列は、パターンの右側に一致させることができる残っています
- 注:この式は、一般的には[[]]で使用され、拡張正規表現、PATTERN右引用符なし
- -z「STRING」という文字列が空の偽の、空が真である、空ではありません
-n「STRING」という文字列が空でない、空は事実ではない、空はfalseです
注意:オペランドの比較のために使用される文字列は引用符を使用する必要があります
- それは=に等しく、
[root@CentOS7 ~]# var=abcdef;[[ "$var" = abc* ]] && echo 1 || echo 0
1 ## [[ = ]] 支持通配符
[root@CentOS7 ~]# var=abcdef;[[ "$var" = "abc*" ]] && echo 1 || echo 0
0 ## 引号引起来的都视为是字符串
[root@CentOS7 ~]# filename=a.conf;[[ "$filename" =~ \.conf ]] && echo 1 || echo 0
1 ## 正则表达式不加引号
1.8.17バッシュファイルのテスト
存在テスト1.8.17.1ファイル
- -a FILE:同-e
- -e FILE:ファイルには、そうでない場合は、trueとfalseがあり、テストの存在します
1.8.17.2ドキュメントタイプテスト
- -b FILE:およびブロックデバイスファイルが存在する場合
- -c FILE:ファイルが存在し、キャラクタ・デバイスであるかどうか
- -d FILE:ファイルが存在し、ディレクトリであるかどうか
- -f FILE:存在し、通常のファイルであるかどうか
- -h FILEまたは-L FILE:ファイルが存在し、シンボリックリンクであります
- -p FILE:ファイルが存在し、名前付きパイプであるかどうか
- -S FILE:ファイルが存在し、ソケットであるかどうか
1.8.17.2 Bashのテストファイルのパーミッション
- -r FILE:読めるがあれば
- -w FILE:存在し、書き込み可能である場合
- -x FILE:存在し、実行可能であるか否か
1.8.17.3特別な権限ファイルテスト:
- -u FILE:SUID持っており、権限の有無
- -g FILE:特権の存在とSGIDを持っています
- -k FILE:権限の有無と粘着性を持っています
1.8.17.4 Bashのテストファイル属性
- ファイルサイズ試験:
- -s FILE:非空がある場合
1.8.17.5ファイルを開く、次のとおりです。
- -t FD:FDファイルディスクリプタは、端末で開始されています
- -N FILE:ファイルそれが読み込まれた最後の時間は変更されていないので、
- -O FILE:現在のユーザーが、有効なファイルの所有者であります
- -G FILE:現在のユーザーが有効なファイルでは、グループです
1.8.17.6 Bashのテストファイル属性
- 双眼鏡のテスト:
- FILE1 FILE2 -ef:それはハードリンクであるかどうかのFILE1 FILE2
- FILE1はどうかFILE2より古い: - FILE1 FILE2が-ot FILE1 FILE2は、(最終変更時刻)より新しい場合:FILE1はFILE2を-NT
試験条件の1.8.17.7バッシュの組み合わせ
- 最初の方法:
- COMMAND1 && COMMAND2と
- COMMAND1 || COMMAND2か
- !COMMANDの非
- 如:[-r FILE] && [-w FILE]
- COMMAND1 && COMMAND2と
- 第二の方法:
- 2式-a式2のと
- 式2の-o式2式または
- !EXPRESSION非
- あなたは、テストコマンドを使用する必要があります
- 例:
- 2式-a式2のと
[root@CentOS7 ~]# [ -z "$HOSTNAME" -o $HOSTNAME == "CentOS7.5.zhu.com" ] && echo 1 || echo 0
1
[root@CentOS7 ~]#[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
[root@CentOS7 ~]#[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
# /etc/fstab
# Created by anaconda on Wed Jul 18 17:26:27 2018
1.8.18入力を受け付けるようにリードコマンドを使用します
- 一つ以上のシェル変数に割り当てられた入力値を読み取るために使用
- 表示されるプロンプト-p、
- 一般的にパスワードに使用サイレント入力し、-s
- N -n指定入力文字の長さN
- -d「文字」末端記号
- Nの-t NのTIMEOUT秒の
- 標準入力から読み取られた値は、変数の各単語に割り当てられ、残りのすべての単語が最後の変数に割り当てられている読み出し
- 「ファイル名を入力します:」-p読みFILEを
1.8.19 bashのプロフィール
- 有効範囲が分割されることで、2つの種類があります。
- グローバル設定:/ etc / profileを/etc/profile.d/*.shの/ etc / bashrcに
- 個人設定:〜/ .bash_profileを〜/ .bashrcに
1.8.20シェルは、ログオンするには、2つの方法があります
- 対話型ログオン:
- (1)アカウントのパスワードを入力端子を介して直接ログイン
- ユーザー - "ユーザー名SU" スイッチ(2)
- 実行順序:/ etc / profileを - > /etc/profile.d/*.sh - >〜/ .bash_profileの - >〜/ .bashrcに - >の/ etc / bashrcに
- 非対話型ログオン:
- (1)SUのユーザー名
- オープン(2)グラフィカル端末
- (3)スクリプトを実行
- (4)のbashの他のインスタンスを
- 実行順序:〜/ .bashrcに - >の/ etc / bashrcに - > /etc/profile.d/*.sh
1.8.20.1プロフィールカテゴリ
- プロフィールカテゴリ:対話型ログオンシェルを提供するように構成
グローバル:/ etc / profileを、/etc/profile.d/*.sh
個人:〜/ .bash_profileの
機能:
(1)環境変数を定義するために使用されます
(2)コマンドやスクリプトを実行します
1.8.20.2 bashrcにクラス
- bashrcにカテゴリ:インタラクティブおよび非対話型ログインシェルは、コンフィギュレーションを提供します
- グローバルます。/ etc / bashrcに
- 個人:〜/ .bashrcに
- 機能:
- (1)と機能定義されたコマンドエイリアス
- (2)ローカル変数の定義を
- グローバルます。/ etc / bashrcに
有効にする設定ファイルを編集します。
- プロファイルとbashrcにファイルを変更した後に有効になります必要があります
- 二つの方法:
- 1シェルプロセスを再起動します
- 2つのまたはソース
例:.〜/ .bashrcに
- 1シェルプロセスを再起動します
- 任意のスクリプトを入力パスのディレクトリが実行できない実行権限を持ってみましょう。
[root@CentOS7 scripts]# cat /etc/profile.d/zhu.sh
PATH=.:$PATH
[root@CentOS7 scripts]# . /etc/profile.d/zhu.sh
[root@CentOS7 scripts]# yesorno.sh
please input yes or no:y
Your answer is YES.
[root@CentOS7 scripts]# echo $PATH
.:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
tips:为了安全考虑,在生产中不建议这么做
1.8.21バッシュを終了タスク
- 〜/ .bash_logoutファイル(ユーザー)を保存
- 退出ログインシェル上で実行されています
- 自動バックアップを作成するための
- クリア一時ファイル
1.8.22 $ - 変数
- 時間:hashall、このオプションを開いて、シェルはそれのハッシュパスを指揮し、毎回クエリを避けることができます。オフセット+ H hオプションにより、
- I:インタラクティブ・コメントは、現在のシェルが対話型シェルであることを示すには、このオプションが含まれています。いわゆるインタラクティブシェルは、スクリプトの中で、-iオプションがオフになっている(猫/etc/profile.d/vte.sh)
- mは:モニタは、モニタモードをオンにし、あなたはこのような背景や前景として、引き続き、ジョブ制御停止によってプロセスを制御することができます。
- B:braceexpand、ブレース展開
- H:歴史、Hオプションがオンになっている、あなたは、最近の歴史コマンド、上のコマンド履歴、感嘆符によって達成することができ、例えば、「!!」復帰のリスト拡張することができ、n番目のコマンド履歴に戻るには「Nを!」!