シェルプログラミングにおける変数の役割とタイプ

1.シェル変数の役割とタイプ

「変数」の概念は、さまざまなシェル環境で使用されます。シェル変数は、システムとユーザーが使用する必要のある特定のパラメーター(値)を格納するために使用され、これらのパラメーターは、ユーザー設定またはシステム環境の変更に応じて変更できます。変数を使用することにより、シェルプログラムはより柔軟な機能とより強力な適応性を提供できます。
一般的なシェル変数のタイプには、カスタム変数、環境変数、読み取り専用変数、場所変数、および事前定義された変数が含まれます

2つのカスタム変数

カスタム変数は、システムユーザー自身が定義した変数であり、ユーザー自身のシェル環境でのみ有効であるため、ローカル変数とも呼ばれます。シェルスクリプトプログラムを作成する場合、通常、いくつかの特定のカスタム変数は、プログラムの実行中のさまざまな変更に適応し、さまざまなニーズを満たすように設定されます。

1.新しい変数を定義します

Bashの可変操作は比較的単純で、他の高レベルのプログラミング言語(C / C ++、Javaなど)ほど複雑ではありません。新しい変数を定義するときは、通常、事前に宣言する必要はありませんが、変数名を直接指定して、初期値(コンテンツ)に割り当てます。変数を定義するための基本的な形式は、等符号の両側にスペースを入れない「変数名=変数値」です。変数名は文字または下線で始まる必要があり、名前に特殊文字(+、-、*、/、。、?、%、&、#など)を含めることはできません。

たとえば、「Product」(値Python)という名前の変数と「Version」(値2.7.13)という名前の変数を定義するには、次のようにします。

[root@localhost ~]# Product=Python
[root@localhost ~]# Version=2.7.13
2.変数の値を表示および参照します

変数名の前に先頭記号「$」を追加することで、変数の値を参照できます。echoコマンドを使用して変数を表示すると、1つのechoコマンドで複数の変数値を表示できます。

[root@localhost ~]# echo $Product
Python
[root@localhost ~]# echo $Product $Version
Python 2.7.13

変数名がそれに続く他の文字と簡単に混同される場合は、中括弧「{}」を追加して囲む必要があります。そうしないと、正しい変数名を判別できません。未定義の変数の場合、null値が表示されます。

[root@localhost ~]# echo $Product2.5	//变量Product2.5 并未定义
.5
[root@localhost ~]# echo ${Product}2.5
Python2.5
3.変数割り当ての特別な操作

等号「=」の直後に変数の内容を指定することは、変数に値を割り当てる最も基本的な方法です。さらに、さまざまな複雑な管理タスクに適したように、変数に値をより柔軟に割り当てることができるいくつかの特別な割り当て操作があります。 。
(1)二重引用符( ")
二重引用符は、主に文字列を区切る役割を果たします。特に、割り当てられるコンテンツにスペースが含まれている場合は、二重引用符で囲む必要があります。それ以外の場合、二重引用符は通常省略できます。

たとえば、Python 2.7.13を変数PYTHONに割り当てる場合は、操作PYTHON = "Python2.7.13"を実行する必要があります。

[root@localhost ~]# PYTHON=Python 2.7.13 	//错误的赋值
bash: 2.7.13: command not found
[root@localhost ~]# PYTHON="Python 2.7.13"	//正确的赋值
[root@localhost ~]# echo $PYTHON
Python 2.7.13

二重引用符の範囲内で、他の変数(変数参照)の値を$」記号を使用して引用できるため、既存の変数の値を直接呼び出して新しい変数を割り当てることができます。

たとえば、次の操作を実行して、変数Versionの値を呼び出し、それを新しい変数PyVersionに割り当てます。最終的な値は、「Python2.7.13」です。

[root@localhost ~]# PyVersion="Python $Version"	//以变量的值进行赋值
[root@localhost ~]# echo $PyVersion
Python 2.7.13

(2)一重引用符( ')
割り当てるコンテンツに$、 "、\などの特殊な意味の文字が含まれている場合は、一重引用符で囲む必要があります。一重引用符の範囲内では、他の変数の値を引用することはできません。 、任意の文字は通常の文字として扱われます。ただし、割り当ての内容に一重引用符( ')が含まれている場合は、競合を避けるために\'記号でエスケープする必要があります。

[root@localhost ~]# PyVersion='Python $Version'       //$符号不能再引用变量
[root@localhost ~]# echo $PyVersion 	             //原样输出字符串
Python $Version

(3)バックアポストロフ(`)
バックアポストロフは主にコマンド置換に使用され、コマンド実行の画面出力結果を変数に割り当てることができます。バックティックで囲まれた範囲は実行可能なコマンドラインである必要があります。そうでない場合、エラーが発生します。

たとえば、コマンド行でuseraddコマンドプログラムの場所を検索し、その詳細な属性を一覧表示する場合は、次の操作を実行できます。

[root@localhost ~]# ls -lh `which useradd`
-rwxr-x---. 1 root root 101K 8 月 2 2011 /usr/sbin/useradd

上記の操作は、2つのコマンドを連続して実行するのと同じです。最初に、which useraddコマンドを介してuseraddコマンドのプログラムの場所を見つけ、次に検索結果に従ってファイル属性をリストします。実行中、バックティック範囲全体が、whichuseraddコマンドの出力に置き換えられます。

vsftpdサービスのログイン禁止ユーザーリストを抽出し、それを変数DenyListに割り当てるには、次の操作を実行できます。

[root@localhost ~]# DenyList=`grep -v "^#" /etc/vsftpd/ftpusers`
[root@localhost ~]# echo $DenyList
root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody

なお、逆アポストロフを使用してコマンド行にネストされたコマンド置換操作を実装することは困難です。現時点では、逆アポストロフ操作の代わりに$()」を使用してネストの問題を解決できます。

たとえば、useraddコマンドプログラムを提供するソフトウェアパッケージによってインストールされた構成ファイルの場所を照会する場合は、次の操作を実行できます(裏返しに置き換えます)。

[root@localhost ~]# rpm -qc $(rpm -qf $(which useradd))
/etc/default/useradd
/etc/login.defs

(4)、readコマンド
上記の割り当て操作に加えて、Bashの組み込みコマンドreadを使用して、変数に値を割り当てることもできます。readコマンドは、ユーザーに情報の入力を求めるために使用され、単純な対話プロセスを実現します。実行中に、スペースを区切り文字として標準の入力デバイス(キーボード)からコンテンツの行が読み取られ、読み取られた各フィールドが指定された変数に順番に割り当てられます(追加のコンテンツは最後の変数に割り当てられます)。指定された変数が1つしかない場合は、行全体がこの変数に割り当てられます。
たとえば、次の操作を実行すると、ユーザーがテキストを入力して、入力したコンテンツを変数ToDir1に割り当てるのを待ちます。

[root@localhost ~]# read ToDir1
/opt/backup/	//输入变量ToDir1 的值为/opt/backup/ [root@localhost ~]# echo $ToDir1
/opt/backup/

対話型操作インターフェースをより使いやすくし、使いやすさを向上させるために、readコマンドを「-p」オプションと組み合わせてプロンプト情報を設定し、ユーザーに入力内容やその他の関連事項を通知することができます。

たとえば、バックアップファイルのストレージディレクトリを入力するようにユーザーに促し、入力したパス情報を変数ToDir2に割り当てる場合は、次の操作を実行できます。

[root@localhost ~]# read -p "请指定备份存放目录:" ToDir2
请指定备份存放目录:/opt/backup
[root@localhost ~]# echo $ToDir2
/opt/backup
4.変数のスコープを設定します

デフォルトでは、新しく定義された変数は現在のシェル環境でのみ有効であるため、ローカル変数と呼ばれます。サブプログラムまたは新しいサブシェル環境に入ると、ローカル変数は使用できなくなります。

たとえば、Bashを直接実行して新しい子シェルスクリプトを入力した後は、親シェル環境で定義されている製品、バージョン、およびその他の変数を参照することはできません。

[root@localhost ~]# echo "$Product $Version"	//查看当前定义的变量值Python 2.7.13
[root@localhost ~]# bash	//进入子Shell 环境
[root@localhost ~]# echo "$Product $Version" //无法调用父Shell 环境中的变量
[root@localhost ~]# exit                    //返回原有的Shell 环境

ユーザー定義変数を引き続きすべてのサブシェル環境で使用できるようにし、繰り返し設定を減らすために、指定された変数を内部コマンドexportを介してグローバル変数としてエクスポートできます。ユーザーは複数の変数名をパラメーターとして同時に指定でき(「$」記号を使用する必要はありません)、変数名はスペースで区切られます。

[root@localhost ~]# echo "$Product $Version"	//查看当前定义的变量值Python 2.7.13
[root@localhost ~]# export Product Version	   //将Product、Version 设为全局变量
[root@localhost ~]# bash	                 //进入子Shell 环境
[root@localhost ~]# echo "$Product $Version"
Python 2.7.13	                           //可以调用父Shell 的全局变量
[root@localhost ~]# exit	              //返回原有的Shell 环境

エクスポートを使用てグローバル変数エクスポートするときに、変数に値を割り当てることもできるため、グローバル変数を新しく定義するときに事前に値を割り当てる必要はありません。

たとえば、次の操作を実行して、FQDNという名前の新しいグローバル変数を直接作成します。

[root@localhost ~]# export FQDN="www.jb-aptech.com.cn"
[root@localhost ~]# echo $FQDN
www.jb-aptech.com.cn
5.数値変数の操作

シェル変数の数値演算は、主にスクリプトプログラムのプロセス制御に使用されます(サイクルタイム、使用状況の比較など、以降の章で紹介します)。Bash Shell環境では、単純な整数演算のみを実行でき、10進演算はサポートされていません。整数値の計算は主に内部コマンドexprを介して実行され、基本的な形式を以下に示します。演算子と変数の間には少なくとも1つのスペースが必要であることに注意してください。
expr変数1演算子変数2 [演算子変数3] ...
その中で、変数1、変数2 ...は、計算する必要のある数値変数に対応します(「$」記号で呼び出す必要があります)。一般的に使用されるいくつかの演算子を以下に説明します。

  • +:追加操作。
  • -:減算操作。
  • *:乗算操作。「*」記号のみを使用することはできません。使用しない場合は、ファイルのワイルドカードと見なされます。
  • /:分割操作。
  • %:モジュロ演算。残差演算とも呼ばれ、値を除算した後の残差を計算するために使用されます。
    たとえば、2つの変数X(値35)とY(値16)が設定され、変数XとYの加算、減算、乗算、除算、およびモジュロ演算の結果が順番に示されます。
[root@localhost ~]# X=35 
[root@localhost ~]# Y=16
 [root@localhost ~]# expr $X + $Y 51
[root@localhost ~]# expr $X - $Y
19
[root@localhost ~]# expr $X \* $Y
560
[root@localhost ~]# expr $X / $Y
2
[root@localhost ~]# expr $X % $Y
3

操作の結果を他の変数に割り当てたい場合は、コマンド置換操作を組み合わせることができます(バックティックを使用)。

たとえば、変数Yの3乗を計算し、その結果を変数Ycubeに割り当てます。

[root@localhost ~]# Ycube=`expr $Y \* $Y \* $Y`
[root@localhost ~]# echo $Ycube
4096

3つの特別なシェル変数

ユーザー定義のシェル変数に加えて、LinuxシステムとBashシェル環境には一連の特別な変数があります-環境変数、読み取り専用変数、場所変数、および事前定義された変数。

1.環境変数

環境変数とは、Linuxシステムが運用上のニーズに合わせて事前に作成する変数の一種で、主にユーザーのホームディレクトリ、コマンド検索パス、ユーザーの現在のディレクトリ、ログイン端末など、ユーザーの作業環境を設定するために使用されます。環境変数の値はLinuxシステムによって自動的に維持され、ユーザーのステータスが変化すると変化します。envコマンドを使用して、現在の作業環境の環境変数を表示します。いくつかの一般的な環境変数については、それぞれの使用法を理解する必要があります。

たとえば、変数USERはユーザー名、HOMEはユーザーのホームディレクトリ、LANGは言語と文字セット、PWDは現在の作業ディレクトリ、PATHはコマンド検索パスを表します。

[root@localhost ~]# env	//选取部分内容
XDG_SESSION_ID=135
HOSTNAME=localhost.localdomain 
…… //省略部分内容

PATH変数は、実行可能プログラムのデフォルトの検索パスを設定するために使用されます。コマンドプログラムを実行するためにファイル名のみが指定されている場合、LinuxシステムはPATH変数で指定されたディレクトリで対応する実行可能ファイルを検索します。見つからない場合は、「command」というプロンプトが表示されます。見つかりません"。

たとえば、first.shスクリプトは/ rootディレクトリにあります。スクリプトをファイル名で直接実行する場合は、PATH変数を変更して検索パスを追加するか、first.shスクリプトを既存の検索パスのフォルダーにコピーします。下。

[root@localhost ~]# vim frist.sh
#!/bin/bash
#一个简单的Shell脚本        //“#”用于注释的内容
cd/opt/                                    //切换到opt目录
echo "当前位于哪个目录:"    //在屏幕显示“ ....... ”
pwd                                          //查看当前在那个目录中
echo "查看当前目录:"      
ls -lh 
[root@localhost ~]# chmod +x first.sh       //为脚本增加执行权限
[root@localhost ~]# ls -lh /root/first.sh	//确认脚本位置
-rwxr-xr-x. 1 root root 27 Jul 4 09:24 /root/first.sh
[root@localhost ~]# echo $PATH	//查看当前搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin 
[root@localhost ~]# first.sh	//直接执行时找不到命令
-bash: first.sh: command not found
[root@localhost ~]# PATH="$PATH:/root"	//将/root 添加到搜索路径
[root@localhost ~]# echo $PATH	//查看修改后的搜索路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin:/root 
[root@localhost ~]# first.sh	//直接以文件名运行脚本
当前位于哪个目录:
/opt
........... //省略部分内容
2.読み取り専用変数

シェル変数には特殊なケースがあり、一度設定すると値を変更できません。このような変数は読み取り専用変数と呼ばれます。変数を作成するときに、読み取り専用属性として設定することも、既存の変数を読み取り専用属性として設定することもできます。読み取り専用変数は、主に変数の値を変更できない場合に使用されます。

たとえば、ログファイルのパスを定義する変数「log_path」がスクリプトで定義されています。スクリプトの実行中に変更したくない場合は、この変数を読み取り専用変数として設定できます。readonlyコマンドを使用して、変数を読み取り専用変数として定義します。定義後に再割り当てして変更することはできません。

[root@localhost ~]# name=cloud
[root@localhost ~]# readonly name	//设置为只读变量
[root@localhost ~]# echo $name
cloud
[root@localhost ~]# name=yun
-bash: name: readonly variable	//只读变量不可以被重新赋值
[root@localhost ~]# unset name	//只读变量不可以被删除
//上述 unset 命令通常用于删除变量。
-bash: unset: name: cannot unset: readonly variable
3.ロケーション変数

シェルスクリプトプログラムを使用するときにコマンドラインを介してプログラムの操作パラメーターを提供するために、Bashは位置変数の概念を導入しています。コマンドライン操作を実行する場合、最初のフィールドはコマンドまたはスクリプトプログラムの名前を表し、残りの文字列パラメーターは左から右の順に位置変数に割り当てられます。位置変数は位置パラメーターとも呼ばれ、$ 1、$ 2、$ 3、...、$ 9で表されます。

たとえば、コマンドライン「ls -lh / boot /」を実行すると、最初の位置変数は「-lh」で「$ 1」で表され、2番目の位置変数は「/ boot /」で「$ 2」で表されます。前記。コマンド「ls-lh / boot /」またはスクリプト自体の名前は「$ 0」で表されます。$ 0の形式は位置変数の形式と同じですが、$ 0は位置変数ではなく事前定義された変数です。

[root@localhost ~]# vim jf.sh     
#!/bin/bash 
SUM=`expr $1 + $2`                //声明脚本算法
echo "$1 + $2 = $SUM"             //打印到屏幕上
[root@localhost ~]# chmod +x jf.sh   //为脚本增加执行权限
[root@localhost ~]# ./jf.sh 12 34	//$1 为 12、$2 为 34 的情况
12 + 34 = 46
[root@localhost ~]# ./jf.sh 56 78	//$1 为 56、$2 为 78 的情况
56 + 78 = 134
4.事前定義された変数

事前定義された変数は、Bashプログラムによって事前定義された特殊変数の一種です。ユーザーは事前定義された変数のみを使用できますが、新しい事前定義された変数を作成したり、事前定義された変数に直接値を割り当てたりすることはできません。事前定義された変数は、「$」記号と別の記号の組み合わせで表されます。一般的に使用されるいくつかの事前定義された変数の意味は次のとおりです。

  • $#:コマンドラインの位置パラメータの数を表します。
  • $ *:すべての位置パラメータの内容を示します。
  • $ ?:前のコマンドが実行された後の戻りステータスを示します。戻り値0は、実行が正しいことを意味します。ゼロ以外の値が返された場合は、実行が異常であることを意味します。$?変数の使用については、次の章で紹介します。
  • $ 0:現在実行中のスクリプトまたはプログラムの名前を表します。

事前定義された変数の役割を説明するために、コマンドラインで指定された複数のファイルまたはディレクトリをパックおよび圧縮し、関連情報を出力するために使用される小さなバックアップ操作スクリプトを作成します。その中で、UNIXタイムスタンプ(1970年1月1日から経過した秒数)は、新しく作成された圧縮ファイルの名前に埋め込まれ、「date +%s」コマンドを使用して取得されます。

[root@localhost ~]# vim mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%s`.tgz   //声明变量引用时间戳
tar zcf $TARFILE $* &> /dev/null    /将备份的文件压缩命名
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份" 
echo "具体内容包括: $*"
[root@localhost ~]# chmod +x mybak.sh
[root@localhost ~]# ./mybak.sh /boot/grub       //备份一个对象的情况
已执行 ./mybak.sh 脚本,
共完成 1 个对象的备份
具体包括:/boot/grub
[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow     //备份两个对象的情况
已执行 ./mybak.sh 脚本, 
共完成 2 个对象的备份
具体包括:/etc/passwd /etc/shadow
[root@localhost ~]# ls -lh beifen-*	          //确认备份结果
-rw-r--r--. 1 root root 368 Jul 4 09:37 beifen-1499175456.tgz
-rw-r--r--. 1 root root 1.8K Jul 4 09:37 beifen-1499175464.tgz

おすすめ

転載: blog.csdn.net/wulimingde/article/details/108071594