シェルプログラミングの仕様と変数
1.シェルスクリプトの概要
(1)シェルスクリプトの概念
実行するコマンドを順番にテキストファイルに保存し
、ファイルに実行権限を付与し、
さまざまなシェル制御ステートメントを組み合わせて、より複雑な操作を完了します
vim first.sh #写一个first.sh的脚本文件
(2)、シェルスクリプトアプリケーションシナリオ
反復操作
インタラクティブタスク
バッチトランザクション処理
サービス実行ステータス監視
タイミングタスク実行
..。
(3)シェルコマンドインタープリター「トランスレーター」の役割
シェルは、オペレーティングシステムカーネルとユーザーの間にある特別なアプリケーションプログラムであり、「コマンドインタープリター」として機能し、ユーザーが入力した操作命令(コマンド)を受信して解釈し、実行する必要のある操作を渡す役割を果たします。カーネルを実行し、実行結果を出力します。
1.ユーザーのログインシェル
Bash(/ bin / bash)は、ほとんどのLinuxバージョンで使用されるデフォルトのシェルです。
異なるシェルの内部命令と操作環境は異なります
(4)最初のシェルスクリプトを書く
1.シェルスクリプトの構成
1.スクリプトステートメント(インタープリター):最初の行が「#!/ bin / bash」の場合、この行の下のコードステートメントは/ bin / bashプログラムによって解釈および実行され、#!/ bin / bashがデフォルトのインタープリターであることを意味します。 。#!/ usr / bin / python、#!/ usr / bin / expectなどの他のタイプのインタープリターがあります。
2.コメント情報:「#」で始まるステートメントはコメント情報として表され、コメントされたステートメントはスクリプトの実行時に実行されません。
3.実行可能なステートメント:「」の間の文字列を出力するために使用されるechoコマンドなど
vim /root/first.sh
#!/bin/bash
echo "hello world"
2.シェルスクリプトの実行
方法1:パスを指定するコマンドには、ファイルにx権限が必要です。
vim hello.sh
chmod + x hello.sh
絶対パスを指定します:/hello.sh
相対パスを指定します:./ hello.sh
方法2:スクリプトを解釈するためにシェルを指定します。ファイルにはx権限は必要ありません。
shスクリプトパス:sh hello.sh
ソーススクリプトパス:hello.shまたはソースhello.sh
(5)パイプラインとリダイレクト
1.パイプライン操作
パイプ記号「|」の左側にあるコマンドの出力結果は、右側のコマンドの入力(処理オブジェクト)として使用されます。同じコマンド行で複数のパイプを使用できます。
ps aux | wc -l#プロセスの数を表示
echo "abc123" | passwd --stdin zhangsan#ユーザーZhangSanのパスワードを変更
2.リダイレクト
インタラクティブハードウェアデバイス | |||
---|---|---|---|
の種類 | デバイスファイル | ファイル記述番号 | 標準デバイス |
標準入力 | / dev / stdin | 0 | キーボード |
標準出力 | / dev / stdout | 1 | モニター |
標準エラー出力 | / dev / stderr | 2 | モニター |
echo "123456" > pass.txt
passwd --stdin zhangsan < pass.txt
ls -lh > log.txt 2>&1 等同于 ls -lh &> log.txt
本来1-->屏幕 (1指向屏幕)
执行>log后, 1-->log.txt (1指向log.txt)
执行2>&1后, 2-->1 (2指向1,而1指向log.txt,因此2也指向了log.txt)
2、シェルスクリプト変数
(1)変数の役割
システムとユーザーが使用する必要の
ある特定のパラメーター(値)を格納するために使用されます。変数名:システムによって事前設定された、またはユーザー定義の固定名を使用します。
変数値:ユーザー設定およびシステム環境の変化に応じて変更できます。
(2)変数の分類
カスタム変数:ユーザーが定義、変更、使用します。
環境変数:システムによって維持され、作業環境を設定するために使用されます。
場所変数:コマンドラインを介してスクリプトプログラムにパラメーターを渡します。
事前定義変数:Bashに組み込まれている変数の一種で、直接変更することはできません。
1.カスタム変数
新しい変数を定義します。
変数名は文字または下線で始まります。大文字と小文字が区別されるため、すべて大文字にすることをお勧めします。
格式:变量名=变量值
PRODUCT=python
VERSION=2.7.13
変数の値を表示する
格式:echo $变量名
echo $PRODUCT
echo $VERSION
echo "$PRODUCT"
echo $PRODUCT$VERSION
赋值时使用引号
双引号:允许通过$符号引用其他变量值 (需要把$放入括号内)
单引号:禁止引用其他变量值,$视为普通字符
反撇号:命令替换,提取命令执行后的输出结果,`...`.和$(…)作用相同
読み取りコマンドは入力を取得します
方法1:
read -p "提示信息" 变量名
echo $变量名
vim name.sh
方法2:
echo -n "提示信息"
read 变量名
echo $变量名
(3)変数のスコープ
デフォルトでは、新しく定義された変数は現在のシェル環境でのみ有効であるため、ローカル変数と呼ばれます。サブルーチンまたは新しいサブシェル環境に入ると、ローカル変数は使用できなくなります。
指定された変数は、内部コマンドexportを介してグローバル変数としてエクスポートできるため、ユーザー定義変数はすべてのサブシェル環境で引き続き使用できます。
格式1:export 变量名
格式2:export 变量名=变量值
可以使用 pgtree 命令查看Shell环境,
输入 bash 命令进入子Shell环境,
按Ctrl+D组合键或输入 exit 命令退出子Shell环境
(4)整数変数の操作
格式:expr 变量1 运算符 变量2 [运算符 变量3]
运算符:+ 加法、- 减法、\* 乘法、/ 除法、% 取余
一般的に使用される操作式:
i=$(expr 12 \* 5)
i=$((12 * 5))
i=$[12 * 5]
let i=12*5
i++ 相当于 i=$[$i+1]
i-- 相当于 i=$[$i-1]
i+=2 相当于 i=$[$i+2]
2.環境変数
環境変数は、ユーザーの作業環境を設定するためにシステムによって事前に作成されます
構成ファイル:/etc/profile、~/.bash_profile
envコマンドを使用して、現在の作業環境の環境変数を表示します。
変数USERはユーザー名、HOMEはユーザーのホームディレクトリ、LANGは言語と文字セット、PWDは現在の作業ディレクトリ、
変数PATHは実行可能プログラムのデフォルト検索を表します。道
echo $PATH #查看当前搜索路径
PATH="$PATH:/root" #将/root目录添加到搜索路径
export PATH="$PATH:/root" #输出为全局环境变量
hello.sh
環境変数のグローバル構成ファイルは/ etc / profileであり、このファイルで定義されている変数はすべてのユーザーに適用されます。各ユーザーには、独自の独立したプロファイル(〜/ .bash_profile)もあります。長期間環境変数を変更または設定するために使用できます。
vim /root/.bash_profile
export HISTSIZE=200 #修改root用户的历史命令记录条数
echo $HISTSIZE
source /root/.bash_profile #读取并执行文件中的设置
echo $HISTSIZE
3. readonlyコマンドは、読み取り専用変数を設定します
product=benet
readonly product #设置为只读变量
echo $product
product=accp #只读变量不可以被重新赋值
unset product #只读变量不可以被删除,unset 命令用于删除变量
4.ロケーション変数
コマンドライン操作を実行する場合、最初のフィールドはコマンドまたはスクリプトプログラムの名前を表し、残りの文字列パラメーターは左から右の順に位置変数に割り当てられます。
$ n:nは数値、$ 0はコマンド自体を表し、$ 1〜9は1〜9番目のパラメーターを表し、10を超えるパラメーターは中括弧で表す必要があります。たとえば、10番目のパラメーターは9で、1〜9番目のパラメーターを表します。 10を超えるパラメーターは中括弧で表す必要があります。たとえば、10番目のパラメーターは9世代テーブルと番目の第9番目のパラメータ番号、10に参照番号が必要とするようにする大囲ま番号テーブル番組を、よりそのような第10番目のパラメータ番号がある{10}
vim addnum.sh
num1=$1
num2=$2
sum=$(($num1 + $num2))
echo $sum
./addnum.sh 12 34
$0 $1 $2
5.事前定義された変数
$@和$*:表示命令或脚本要处理的参数。
$*:把所有参数看成以空格分隔的一个字符串整体,代表"$1 $2 $3 $4"。
$@:把各个参数加上双引号分隔成n份的参数列表,每个参数是独立的,代表"$1" "$2" "$3" "$4"。
$0:表示当前执行的脚本或命令的名称。
$#:表示命令或脚本要处理的参数的个数。
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。
違いを確認するためのスクリプトを作成します。
vim bianliang.sh
vim mybak.sh
#!/bin/bash
time=backup-date +%F.tgz
tar zcf $time $* &> /dev/null #/dev/null表示的是一个黑洞文件,通常用于丢弃不需要的数据输出
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo "具体内容包括: $*"
chmod +x mybak.sh
./mybak.sh /etc/passwd /etc/shadow