シェルスクリプトプログラミングの仕様と変数
記事のディレクトリ
シェルは特別なアプリケーションプログラムであり、オペレーティングシステムカーネルとユーザーの間にあり、「コマンドインタープリター」として機能し、ユーザーが入力した操作命令(コマンド)を受信して解釈し、必要な操作を渡します。実行カーネルを実行し、実行結果を出力します。Bash(/ bin / bash)は、ほとんどのLinuxバージョンで使用されるデフォルトのシェルです。
1.シェルスクリプトの概要
1.シェルスクリプトの概念
1)実行するコマンドの順序をテキストファイルに保存します
2)ファイルに実行許可を与えます
3)さまざまなシェル制御ステートメントを組み合わせてより複雑な操作を完了します
2.シェルスクリプトのアプリケーションシナリオ
1)反復操作
2)バッチトランザクション処理
3)自動操作とメンテナンス
4)サービス実行ステータスの監視
5)タスク実行のタイミング
3.シェルの役割
1)シェルは、ユーザーとカーネルの間の「トランスレーター」であるコマンド解釈チューブであり、ユーザーが入力したコマンドラインの解釈を担当します。
2)ユーザーログインシェル
- ログイン後にデフォルトで使用されるShellIプログラム、通常は/ bin / bash
- 異なるシェルの内部命令と動作環境は異なります
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
....
2つ目は、シェルスクリプトを作成することです。
1.スクリプトコードを書く
●vimテキストエディタを使用して
、実行順に記述された1行に1つのLinuxコマンド
[root@localhost ~]#vim first.sh #编辑脚本文件,以.sh结尾是方便识别出这是个shell脚本文件
cd /boot/ #切换到根目录
pwd #查看当前所在目录
ls -lh vml* #以长格式更人性化的方式显示以vml开头的文件
上記のfirst.shスクリプトファイルには、cd / boot /、pwd、ls -lh vml *の3つのコマンドが含まれています。このスクリプトファイルを実行した後の出力結果は、実際にはこれら3つのコマンドを順番に実行した結果であり、「バッチ処理」を実現しています。
2.実行可能権限を付与します
●スクリプトを実行可能にする
[root@localhost~]#chmod +x first.sh
3.スクリプトファイルを実行します
1)方法1:パスを指定するコマンドには、ファイルにx権限が必要です。(絶対パスと相対パス)
chmod + x /root/first.sh
絶対パスを指定します:/root/first.sh
相対パスを指定します:./ first.sh
2)方法2:スクリプトを解釈するためにシェルを指定します。ファイルにはx権限は必要ありません。
shスクリプトパス:shfirst.shまたはsh / root / first.sh
相対パス(スクリプトが配置されているディレクトリにある必要があります)。このスクリプトは元々ホームディレクトリ(〜ディレクトリ)に作成され、ルートのホームディレクトリはルートです。
絶対パス(ファイルの特定のパスを直接指定します)
3)方法3:ソーススクリプトパスまたはスクリプトパス(x権限は必要ありません)
。first.shまたはsourcefirst.sh(パス要件については上記と同じ)
この実行方法は、自動的にブートディレクトリに切り替わります。これは、ソースとが現在のプロセスでスクリプトの構成を直接読み取り、新しいプロセスを開始しないためです。
ソースは、スクリプトのコンテンツを親プロセスに直接実行します(新しいプロセスを開かないため、スクリプトの実行コンテンツを現在のプロセスに直接追加すると言えます)。したがって、ソースを作成した後、内部で構成された変数が現在の環境に追加され、シェルのスクリプトで変数を呼び出すことができます。
また、。/ first.shとshfirst.sh
は、現在のプロセスでこのスクリプトを実行するための新しいサブシェルプロセスです。スクリプトが終了すると、shとサブプロセスで設定された変数が一緒に破棄されます。(サブシェルは親プロセスシェルの環境変数を継承し、サブシェルが終了すると変数は破棄されます。エクスポートを使用すると、サブシェルの変数を親レベルのシェルにフィードバックできます)。
4.より完全なスクリプト構成
- スクリプトステートメント
- 注釈情報
- 実行可能ステートメント
[root@localhost~]#vim /first.sh
#!/bin/bash
#This is my first Shell-Script.
cd /boot
echo "当前的目录位于∶"
pwd
echo "其中以vml开头的文件包括∶" #输出友好提示信息
ls -Ih vml*
上記のfirst.shスクリプトファイルでは、最初の行「#!/ bin / bash」は特別なスクリプトステートメントであり、この行の後のステートメントが/ bin / bashプログラムによって解釈および実行されることを示しています。他のステートメントは「 # "コメント情報を示します。echoコマンドを使用して文字列を出力し、スクリプトの出力情報を読みやすくします。たとえば、書き直したfirst.shスクリプトを実行すると、出力結果は次のようになります。
第四に、リダイレクトとパイプライン操作
1.インタラクティブハードウェア機器
- 標準入力:デバイスからユーザー入力データを受信します
- 標準出力:デバイスを介してユーザーにデータを出力します
- 標準エラー:このデバイスを介して実行エラー情報を報告します
の種類 | デバイスファイル | ファイル記述番号 | 標準デバイス |
---|---|---|---|
標準入力 | / dev / stdin | 0 | キーボード |
標準出力 | / dev / stdout | 1 | モニター |
標準エラー出力 | / dev / stderr | 2 | モニター |
2.リダイレクト操作
の種類 | オペレーター | 使用する |
---|---|---|
入力をリダイレクトする | < | 指定されたファイルからデータを読み取ります |
出力をリダイレクトする | >> | 標準出力結果を指定したファイルに保存し、元の内容を上書きします |
出力をリダイレクトする | >> | 元のコンテンツを上書きせずに、指定したファイルの最後に標準出力結果を追加します |
標準エラー出力 | 2> | 指定したファイルにエラー情報を保存し、元の内容を上書きします |
標準エラー出力 | 2 >> | 元のコンテンツを上書きせずに、指定したファイルの最後にエラーメッセージを追加します |
混合出力 | &> | 標準出力と標準エラーを同じファイルに保存します |
混合出力 | 2>&1 | 標準エラー出力を標準出力にリダイレクトします |
例えば:
vim passwd.txt
222222
echo "123456" > passwd.txt
echo "123456" >> passwd.txt
>を使用してコンテンツをファイルに出力します。これにより、ファイルのコンテンツが直接上書きされます。
>>を使用してファイルに追加することを示すと、新しい行が開始されます
setenforce 0
echo "123456" > passwd.txt
passwd --stdin zs < passwd.txt
pass.txtファイルからパスワードを取得します。SELinuxはコマンドの実行に影響を与えることに注意してください。実行が失敗した場合は、パスワードを閉じて再試行できます。
3.配管操作記号「|」
左側のコマンドの出力結果は、右側のコマンドの入力(処理オブジェクト)として使用されます。同じコマンドラインで複数のパイプを使用できます。
例えば:
ps aux | wc -l #显示所有进程数
echo "abc123" | passwd --stdin zs #更改用户zs的密码为abc123
5、シェル変数の役割とタイプ
変数は変化する値であり、変化しない値は定数です
1.変数の役割
システムとユーザーが使用する必要の
ある特定のパラメーター(値)を格納するために使用されます。変数名:システムによって事前設定された、またはユーザー定義の固定名を使用します。
変数値:ユーザー設定およびシステム環境の変更に応じて変更できます。
2.変数の種類
カスタム変数:ユーザーが定義、変更、使用します。
特別な変数:環境変数、読み取り専用変数、場所変数、事前定義変数
3.カスタム変数
新しい変数を定義する
变量名=变量值 #变量名以字母或下划线开头,区分大小写,建议全大写
変数の値を表示する
echo $变量名 #查看当前变量的值
注:値を割り当てるときは、「=」の両側にスペースを入れることはできません。
例えば:
4.値を割り当てるときは引用符を使用します
二重引用符:$記号を使用して他の変数値を引用できます
一重引用符:他の変数値を引用することは禁止されており、$は通常の文字として扱われます
バッククォート:コマンドの置換、コマンドの実行後に出力を抽出します、「$(...)と同じ効果があります
5.キーボードからコンテンツを入力して、変数に値を割り当てます
読み取りコマンドは入力を取得します
read -p 提示信息 变量名
echo $变量名
また、スクリプトで情報を収集するために使用することもできます。
例えば:
スクリプト実行権限を付与した後の実行結果は以下のとおりです。
6.変数のスコープ
1)デフォルトでは、新しく定義された変数は現在のシェル環境でのみ有効であるため、ローカル変数と呼ばれます。サブルーチンまたは新しいサブシェル環境に入るとき、ローカル変数は使用できなくなりました。
2)指定された変数は、内部コマンドexportを介してグローバル変数としてエクスポートできるため、ユーザー定義変数はすべてのサブシェル環境で引き続き使用できます。
- 変数のスコープ式を設定します。
格式1:export 变量名
格式2:export 变量名=变量值
pstreeコマンドを使用してシェル環境を表示したり、bashコマンドを入力してサブシェル環境を開始したり、Ctrl + Dキーの組み合わせを押したり、exitコマンドを入力してサブシェル環境を終了したりできます。
bashと入力して、サブbash環境(サブシェル環境とも呼ばれます)に入ります。これは、サブプロセスを開くのと同じです。
現在の親bash環境でPRODUCTに値を割り当てた後、サブ環境に入ったところ、PRODUCTはグローバル環境変数ではなく、PRODUCTはグローバル環境変数であるため、サブ環境でPRODUCTの変数値を表示できないことがわかりました。サブ環境が割り当てられていません。PRODUCTをグローバル環境変数として出力した後でも、子シェル環境に入った場合でも、親環境変数PRODUCTの変数値を表示できます。
7.整数変数の操作
- 操作式
格式:expr 变量1 运算符 变量2 [运算符 变量3]
- 一般的な演算子
加算+、減算-、乗算\ *、除算/、余り%を取ります。
一般的に使用される算術式:
a=`expr 11 \* 2`
echo $((10 / (1+1)))
echo $[10 / (1+1)]
let i=12*4
i++ 相当于 i=$[$i+1]
i-- 相当于 i=$[$i-1]
i+=2 相当于 i=$[$i+2]
6つの特別なシェル変数
1.環境変数
ユーザーの作業環境を設定するためにシステムによって事前に作成されます。
構成ファイル:/ etc / profile(グローバルに有効)、〜/ .bash_profile(現在のユーザー環境)
2.一般的な環境変数
PWD、PATH
USER、SHELL、HOME
envコマンドを使用して、現在の作業環境の環境変数を表示します。
変数USERはユーザー名、HOMEはユーザーのホームディレクトリ、LANGは言語と文字セット、PWDは現在の作業ディレクトリ、変数PATHは実行可能プログラムのデフォルト検索。path
3.PATH(パス環境変数)
echo $PATH #查看当前搜索路径
PATH="$PATH:/root" #将/root目录添加到搜索路径
export PATH="$PATH:/root" #输出为全局环境变量
first.sh
サブシェル環境への切り替えは引き続き実行可能であり、他のディレクトリも引き続き実行可能です。
4.読み取り専用変数
変数値の変更が許可されていない場合に使用されます
readonly 命令设置只读变量
readonly PRODUCT #设置为只读变量
echo $PRODUCT
PRODUCT=Python #只读变量不可以被重新赋值
unset PRODUCT #只读变量不可以被删除,unset 命令用于删除变量,但无法删除只读变量,只能重启系统解决
5.ロケーション変数
スクリプトを実行しますshxxx.sh 1 2 3 4 5 6 7 8 910…n
$ n:nは数値、$ 0はコマンド自体を表し、1〜9は最初から9番目のパラメーターを表し、10を超えるパラメーターは中括弧で表す必要があります。たとえば、10番目のパラメーターは$ {10}です。
6.事前定義された変数
$*、$@:表示命令或脚本要处理的参数。
$*:把所有参数看成以空格分隔的一个字符串整体,代表"$1 $2 $3 $4"。
$@:把各个参数加上双引号分隔成n份的参数列表,每个参数是独立 的,代表"$1" "$2" "$3" "$4"。
$0:表示当前执行的脚本或命令的名称。
$#:表示命令或脚本要处理的参数的个数。
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。
也常被用于Shell脚本中return退出函数并返回的退出值。
[root@localhost ~]#echo `date +%F` #查看完整日期,按照年-月-日的格式输出
2020-12-20
[root@localhost ~]#vim mybak.sh #编辑脚本
#!/bin/bash #表示此行以后的语句通过/bin/bash程序来解释执行
time=backup-`date +%F`.tar.gz #把变量值backup-`date+%F`.tar.gz赋值给变量time
tar zcf $time $* &> /dev/null #/dev/null表示的是一个黑洞文件,通常用于丢弃不需要的数据输出。
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo "具体内容包括: $*"
[root@localhost ~]#chmod +x mybak.sh #赋予执行权限
[root@localhost ~]#./mybak.sh /etc/passwd /etc/shadow