bashスクリプトの作成。 スクリプト内のbash関数。 条項。 複数の選択肢

ために 簡単なbashスクリプトを書く次の簡単な手順を実行する必要があります。

すべての仕組み:

スクリプトの最初の行#!/ bin / bashは、スクリプトを正常に実行するために不可欠です。

2行目のmkdirtestdirは、ディレクトリtestdirを作成します

3行目のcdtestdirを使用すると、作成したディレクトリtestdirに変更できます。

指図 触る次の行でtouchfile1file2file3は3つのファイルを作成します

スクリプトls-alの行の最後のコマンドを使用すると、現在のディレクトリの内容を表示できます。前の行のおかげで、3つの空のファイルが表示されました。

ご覧のとおり、 簡単なスクリプト すべてのコマンドは新しい行から始まります。 各行は、スクリプトが起動されると、その作業を順番に実行し、特定のアクションを実行します。

Linuxで(定数パラメーターを使用して)いくつかの同一のコマンドのチェーンを毎日実行する場合は、同じコマンドを作成するのが理にかなっている可能性があります 単純なbashスクリプト、これにより、時間を節約し、作業を自動化できます。

Linuxでのスクリプトの作成(例による学習)

———————————————————————————-

1.はじめに

スクリプトを書くために必要なもの
ツールの所有権 コマンドラインおよびそれらに必要なオプション。
基本知識 英語で小学校レベルは干渉しません。

スクリプトが必要な理由
まず、Linuxサーバーの管理は、ある程度、同じコマンドを体系的に実行することになります。 さらに、これらのコマンドを人が実行する必要はありません。 それらは、マシンによって実行されるようにプログラムすることができます。
第二に、(突然)20〜1000に達する通常のタスクを実行するだけでも、繰り返し操作をスクリプトに実装する方がはるかに簡単です。

スクリプトとは
スクリプトは、特定の順序である必要がある一連の命令です。 一定時間コンピューターを実行します。 命令は、内部シェルコマンド(ループ、条件、テキスト情報の処理、操作 環境変数など)、および必要なパラメータを使用してコンソールで実行するプログラム。

スクリプトの書き方
この場合、スクリプトは次のようになります テキストファイル実行属性付き。 スクリプトファイルが#!で始まる場合(UNIXの世界ではsha-bangと呼ばれます)、これは、スクリプトの実行に使用するインタプリタをシステムに通知します。 これを理解するのが難しい場合は、#!/ bin / bashまたは#!/ bin / shの行ですべてのスクリプトを書き始めることを覚えておいてください。そうすると、コマンドとコメントが表示されます。

別れの言葉
スクリプトのほぼすべての行にできるだけ多くのコメントを書くことを心からお勧めします。 時間が経ち、一度書かれたスクリプトを変更または最新化する必要があります。 スクリプトに書かれていることを覚えていない、または理解していないと、変更が難しくなり、最初から書きやすくなります。

必要なスクリプト:

    システムの起動時にファイアウォールルールを設定します。
    設定とデータのバックアップを実行します。
    特定の時間(できれば毎晩)に、プロキシサーバーのログをスキャンし、ダウンロードされたトラフィックの量に関する便利なWebレポートを発行するプログラムを起動します。
    誰かがssh、接続時間、クライアントアドレスを介してサーバーにアクセスしたという情報をメールで送信します。

スクリプト手法について
テキストファイルを作成し、編集し、実行権を設定し、実行し、エラーをチェックし、修正し、実行し、エラーをチェックします...
すべてがなめられて正しく機能するようになったら、オートロードまたはスケジューラーに一定時間置きます。

———————————————————————————-

2.内部BASH言語でスクリプトを書くことを学ぶ
オリジナル:https://www.linuxconfig.org/Bash_scripting_Tutorial

このチュートリアルは、Bash内部言語を使用してスクリプト(以下、スクリプトと呼びます)を作成する方法についての予備知識がないことを前提としています。 経由 このマニュアルスクリプトの作成は非常に簡単な作業であることがすぐにわかります。 文字列「HelloWorld!」を出力する簡単なスクリプトからチュートリアルを始めましょう。 (英語からの翻訳-みなさん、こんにちは!)

1.シナリオ「みなさん、こんにちは」
これが最初のbashスクリプトの例です。

#!/ bin / bash
echo "Hello World"

hello_world.shファイルを含むディレクトリに移動し、実行可能にします。

コード:すべてを選択$ chmod + x hello_world.sh

スクリプトを実行して実行する

コード:すべての$./hello_world.shを選択します

2.単純なアーカイブbashスクリプト

#!/ bin / bash
tar -czf myhome_directory.tar.gz / home / user

コード:すべての$./backup.shを選択します

$ du -sh myhome_directory.tar.gz
41M myhome_directory.tar.gz

3.変数の操作
この例単純な変数を宣言し、echoコマンドを使用して画面に表示します

#!/ bin / bash
STRING = "HELLO WORLD !!!"
エコー$STRING

コード:すべての$./hello_world.shを選択します
こんにちは世界!!!

変数を使用したアーカイブスクリプト:

#!/ bin / bash
OF = myhome_directory _ $(date +%Y%m%d).tar.gz
IF=/ホーム/ユーザー
tar -czf $ OF $ IF

コード:すべての$./backup.shを選択します
tar:メンバー名から先頭の「\」を削除
$ du -sh * tar.gz
41M myhome_directory_20100123.tar.gz

3.1グローバル変数とローカル変数

#!/ bin / bash
#グローバル変数を宣言する
#この変数は、このスクリプトのどこでも使用できます
VAR="グローバル変数"
関数bash(
#ローカル変数を宣言する
#そのような変数は、それが宣言されている関数に対してのみ有効です
ローカルVAR="ローカル変数"
エコー$VAR
}
エコー$VAR
bash
#グローバル変数は変更されていないことに注意してください
エコー$VAR

コード:すべての$./variables.shを選択します
グローバル変数
ローカル変数
グローバル変数

4.スクリプトに引数を渡す

#!/ bin / bash
#事前定義された変数を使用して引数にアクセスする
#引数を画面に出力します
echo $ 1 $ 2 $ 3‘-> echo $ 1 $ 2 $ 3’

#特別な配列args =("を介して引数にアクセスすることもできます [メール保護]»)
#引数を画面に出力します
echo $(args)$(args)$(args)‘-> args =(“ [メール保護]»); エコー$(args)$(args)$(args) '

#変数を使用する [メール保護]すべての引数を一度に表示します
エコー [メール保護]'->エコー [メール保護]

$#変数を使用して、スクリプトに渡された引数の数を表示します
echo渡された引数の数:$#‘-> echo渡された引数の数:$#’

コード:すべての$./arguments.shBashスクリプトチュートリアルを選択します
Bashスクリプトチュートリアル->echo$ 1 $ 2 $ 3
Bashスクリプトチュートリアル->args=( " [メール保護]"); echo $(args)$(args)$(args)
Bashスクリプトチュートリアル->echo [メール保護]
渡された引数の数:3-> echo渡された引数の数:$#

5.スクリプトでのシェルコマンドの実行

#!/ bin / bash
#backticksを使用»``»シェルコマンドを実行する
echo `uname -o`
#引用符なしで試してみましょう
エコーうなめ-o

コード:すべての$uname-oを選択します
GNU / Linux
$ ./bash_backtricks.sh
GNU / Linux
uname-o

ご覧のとおり、2番目のケースでは、コマンド自体が表示されており、実行結果ではありません。

6.ユーザー入力の読み取り(対話性)

#!/ bin / bash
echo -e "こんにちは、単語を入力してください:\ c"
単語を読む
echo "入力した単語は次のとおりです:$ word"
echo -e「2つの単語を入力していただけますか? »»
word1を読むword2
echo "ここに入力があります:\" $ word1 \ "\" $ word2 \ ""
echo -e「bashスクリプトについてどう思いますか? »»
#readコマンドは、応答をデフォルトの組み込み変数$REPLYに格納するようになりました
読んだ
echo"あなたは$REPLYと言った、それを聞いてうれしい! »»
echo -e「好きな色は? »»
#-aは、配列に読み込むための読み取りコマンドを作成します
読む-色
echo "私のお気に入りの色は$(colours)、$(colours)、$(colours):-)"

コード:すべての$./read.shを選択します
こんにちは、単語を入力してください:何か
入力した単語は次のとおりです。
2つの単語を入力していただけますか?
Debian Linux
これがあなたの入力です: "Debian" "Linux"
bashスクリプトについてどう思いますか?
良い
あなたは良いと言った、私はそれを聞いてうれしい!
あなたの好きな色は何ですか?
ブルーグリーンブラック
私の好きな色も青、緑、黒です:-)

7.トラップの使用

#!/ bin / bash
#トラップを宣言する
トラップバッシュトラップINT
#画面をクリアする
クリア;
#ユーザーがCTRL-Cを押すと、フック機能が実行されます。
#表示されます=> bashトラップサブルーチンを実行しています!
#ただし、スクリプトは引き続き実行されます
bashtrap()
{
echo "CTRL + Cが検出されました!…bashトラップを実行しています!"
}
#スクリプトは最大10までカウントされます
`seq110`のaの場合; する
「$a/10で終了」とエコーします。
sleep1;
終わり
echo "Exit Bash Trap Example!!!"

コード:すべての$./trap.shを選択します
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL + Cが検出されました!... bashトラップを実行しています!
10/10
Bashトラップの例を終了します!!!

ご覧のとおり、Ctrl-Cキーの組み合わせはスクリプトの実行を停止しませんでした。

8.アレイ
8.1単純な配列の宣言

#!/ bin / bash
#4つの要素を持つ単純な配列を宣言します
ARRAY =('Debian Linux''Redhat Linux' ubuntu linux)
#配列内の要素の数を取得します
ELEMENTS = $(#ARRAY [@])

#配列の各要素をループします
for((i = 0; i<$ELEMENTS;i++)); do
エコー$(ARRAY [$(i)])
終わり

コード:すべての$./arrays.shを選択します
Debian Linux
redhat linux
ubuntu
Linux

8.2ファイルからの値で配列を埋める

#!/ bin / bash
#配列を宣言する
宣言-配列
#execコマンド #stdin(通常はキーボード)はこのファイルから作成されます。 これにより、
#ファイルの内容を1行ずつ、sedやawkで入力された各行を解析します。
exec 10 letcount = 0

LINEを読みながら<&10; do

ARRAY [$ count] = $ LINE
((count ++))
終わり

echo要素の数:$(#ARRAY [@])
#配列値を表示する
エコー$(ARRAY [@])
#ファイルを閉じる
exec 10>&-

コード:すべての$catbash.txtを選択します
Debian Linux
redhat linux
ubuntu
Linux
$ ./arrays.sh
要素数:4
Debian Linux Redhat Linux Ubuntu Linux

9.If-then-else条件
9.1。 「if-else」条件の簡単な使用
角かっこで囲まれたスペースに注意してください。スペースがないと、条件は機能しません。

#!/ bin / bash
directory = "./ BashScripting"

#ディレクトリが存在するかどうかを確認します
if [-d $ directory]; それから
echo"ディレクトリが存在します"
そうしないと
echo「ディレクトリが存在しません」
fi

コード:すべての$./if_else.shを選択します
ディレクトリが存在しません
$ mkdir BashScripting
$ ./if_else.sh
ディレクトリが存在します

9.2ネストされたif-else条件

#!/ bin / bash
#値4の変数を宣言します
choice = 4
# 画面
エコー"1。 bash」
エコー"2。 スクリプティング»
エコー"3。 チュートリアル"

#変数が4に等しいときに実行します
#ループ
while [$ choice -eq 4]; する

#ユーザー入力を読み取る
選択肢を読む
#ネストされた「if-else」条件
if [$ choice -eq 1]; それから

echo "あなたは単語を選択しました:Bash"

if [$ choice -eq 2]; それから
echo "あなたは単語を選択しました:スクリプト"
そうしないと

if [$ choice -eq 3]; それから
echo "あなたは単語を選択しました:チュートリアル"
そうしないと
echo「1〜3から選択してください!」
エコー"1。 bash」
エコー"2。 スクリプティング»
エコー"3。 チュートリアル"
echo -n "単語を選択してください? »»
choice = 4
fi
fi
fi
終わり

コード:すべての$./nested.shを選択します
1.bash
2.スクリプティング
3.チュートリアル

5

1.bash
2.スクリプティング
3.チュートリアル
単語を選択してください
4
1〜3からお選びください!
1.bash
2.スクリプティング
3.チュートリアル
単語を選択してください
3
あなたは単語を選択しました:チュートリアル

したがって、最初に「while」ループの本体が実行されます。 選択変数は最初は4に設定されています。 次に、ユーザー入力を読み取り、入力が1.2または3に等しくない場合は、変数を再び4に等しくします。これに関連して、ループ本体が繰り返されます(1.2または3を再度入力する必要があります)。

10.比較
10.1算術比較

Lt<
-gt>
-le<=
-ge> =
-eq ==
-ne!=

#!/ bin / bash

NUM1 = 2
NUM2 = 2
if [$ NUM1 -eq $ NUM2]; それから
エコー「両方の値が等しい」
そうしないと
エコー「値は等しくありません」
fi

コード:すべての$./equals.shを選択します
両方の値は等しい

#!/ bin / bash
#整数値で変数を宣言します
NUM1 = 2
NUM2 = 3
if [$ NUM1 -eq $ NUM2]; それから
エコー「両方の値が等しい」
そうしないと
エコー「値は等しくありません」
fi

コード:すべての$./equals.shを選択します
値は等しくありません

#!/ bin / bash
#整数値で変数を宣言します
NUM1 = 2
NUM2 = 1
if [$ NUM1 -eq $ NUM2]; それから
エコー「両方の値が等しい」
elif [$ NUM1 -gt $ NUM2]; それから
echo"$NUM1は$NUM2より大きい"
そうしないと
echo"$NUM2は$NUM1"より大きい
fi

コード:すべての$./equals.shを選択します
2は1より大きい

10.2文字とテキストの比較

同じ
!=同じではありません
< меньще чем
>以上
-ns1変数s1は空ではありません
-zs1変数s1が空です

#!/ bin / bash

S1 = "Bash"

S2="スクリプト"
if [$ S1 = $ S2]; それから

そうしないと
echo"文字列は等しくありません"
fi

コード:すべての$./statement.shを選択します
文字列が等しくない

#!/ bin / bash
#シンボリック変数S1を宣言します
S1 = "Bash"
#シンボリック変数S2を宣言します
S2 = "Bash"
if [$ S1 = $ S2]; それから
echo"両方の文字列が等しい"
そうしないと
echo"文字列は等しくありません"
fi

コード:すべての$./statement.shを選択します
両方の文字列は等しい

11.ファイルの確認

Bファイル名ブロック特殊ファイル
-cfilename特殊文字ファイル
-ddirectorynameディレクトリの存在を確認します
-efilenameファイルの存在を確認します
-ffilenameディレクトリではなく通常のファイルが存在するかどうかを確認します
-G filenameファイルが存在し、有効なグループIDによって所有されているかどうかを確認します。
-g filenameファイルが存在し、set-group-idの場合はtrue。
-kファイル名スティッキービット
-Lファイル名シンボリックリンク
-O filenameファイルが存在し、有効なユーザーIDによって所有されている場合はTrue。
-rfilenameファイルが読み取り可能かどうかを確認します
-Sファイル名ファイルがソケットかどうかを確認します
-sfilenameファイルのサイズがゼロ以外かどうかを確認します
-ufilenameファイルset-ser-idビットが設定されているかどうかを確認します
-wfilenameファイルが書き込み可能かどうかを確認します
-xfilenameファイルが実行可能かどうかを確認します

#!/ bin / bash
file ="./file"
if [-e $ file]; それから
echo"ファイルが存在します"
そうしないと
echo「ファイルが存在しません」
fi

コード:すべての$lsを選択します
file.sh
$ ./file.sh
ファイルが存在しません
$タッチファイル
$ ls
ファイルfile.sh
$ ./file.sh
ファイルが存在しています

同様に、この例では、「while」ループを使用して、ファイルが存在しないかどうかを確認できます。 このスクリプトは、ファイルが存在するまでスリープします。 バッシュネガティブ「!」に注意してください これは-eオプションを無効にします(反転します)。

12.サイクル
12.1。 Forループ

#!/ bin / bash
#forループ
$(ls / var /);のfの場合 する
エコー$f
終わり

bashコマンドラインからforループを実行します。

コード:$(ls / var /);のfのすべての$を選択します。 $fをエコーし​​ます。 完了コード:$(ls / var /);のfのすべての$を選択します。 $fをエコーし​​ます。 終わり
バックアップ
キャッシュ
クラッシュ
ゲーム
lib
ローカル
ロック
ログ
郵便物
オプト
走る
スプール
tmp
www

12.2。 whileループ

#!/ bin / bash
COUNT = 6
#whileループ
while [$ COUNT -gt 0]; する

COUNT=COUNT-1とします
終わり

コード:すべての$./while_loop.shを選択します
カウントの値は次のとおりです:6
カウントの値は次のとおりです:5
カウントの値は次のとおりです:4
countの値は次のとおりです:3
countの値は次のとおりです:2
countの値は次のとおりです:1

12.3。 ループするまで

#!/ bin / bash
COUNT = 0
#untilループ
[$ COUNT-gt5]まで; する
echoカウントの値は次のとおりです:$ COUNT
COUNT = COUNT+1とします
終わり

コード:すべての$./until_loop.shを選択します
countの値は次のとおりです:0
countの値は次のとおりです:1
countの値は次のとおりです:2
countの値は次のとおりです:3
カウントの値は次のとおりです:4
カウントの値は次のとおりです:5

12.4。 暗黙の条件を持つループ
次の例では、whileループの条件は標準入力の存在です。
ループの本体は、標準出力から読み取りコマンドにリダイレクトされるものがある限り実行されます。

#!/ bin / bash
#このスクリプトはスペースを見つけて削除します
#ファイル内で、アンダースコアに置き換えます
DIR="。"
ループ内の出力をリダイレクトすることにより、readコマンドでループを制御します。
$ DIR-typefを検索| ファイルの読み取り中。 する
#POSIXクラス[:space:]を使用して、ファイル名のスペースを検索します
if [["$ file" = * [[:space:]] *]]; それから
#スペースをアンダースコアに置き換えます
mv "$ file" `echo $ file | tr‘‘‘_’`
fi;
終わり

コード:すべての$ls-1を選択します
script.sh
$touch「スペースのあるファイル」
$ ls -1
スペースのあるファイル
script.sh
$ ./script.sh
$ ls -1
file_with_spaces
script.sh

13.機能

#!/ bin / bash
#関数は任意の順序で宣言できます
関数function_B(
エコー機能B。
}
関数function_A(
エコー$1
}
関数function_D(
エコー機能D。
}
function_C(
エコー$1
}
#関数を呼び出す
#パラメータを関数Aに渡す
function_A"関数A。"
function_B
#パラメータを関数C関数に渡す
function_C"関数C。"
function_D

コード:すべての$./functions.shを選択します
関数A。
関数B。
関数C。
関数D。

14.演算子の選択-選択

#!/ bin / bash
PS3 ='1つの単語を選択してください:'
# 選択する
「linux」「bash」「scripting」「tutorial」で単語を選択
する
echo "選択した単語は次のとおりです:$ word"
#中断しないと、ループが無限になります。
壊す
終わり
出口0

コード:すべてを選択$ ./select.sh
1)Linux
2)bash
3)スクリプト
4)チュートリアル
1つの単語を選択してください:4
選択した単語は次のとおりです。チュートリアル

15.選択演算子-ケース

#!/ bin / bash
echo"お好みのプログラミング/スクリプト言語は何ですか"
エコー「1)bash」
エコー「2)perl」
エコー「3)フィトン」
エコー「4)c++」
エコー「5)わからない!」
ケースを読む;
#単純なケース選択構造
#この例では、$caseは単なる変数であることに注意してください
#そしてそれと呼ばれる必要はありません。 これは単なる例です
$ case in
1)echo"あなたはbashを選択しました";;
2)echo"あなたはperlを選択しました";;
3)echo"あなたはフィトンを選択しました";;
4)echo"あなたはc++を選択しました";;
5)終了
esac

コード:すべての$./case.shを選択します
好みのプログラミング/スクリプト言語は何ですか
1)bash
2)perl
3)フィトン
4)c ++
5)わからない!
4
c++を選択しました

———————————————————————————-

より詳細な情報は、さまざまなソースから入手できます。たとえば、ここにあります。
オリジナル:https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin…-book.html

https://ubuntologia.ru/forum/viewtopic.php?f=109&t=2296

今日はbashスクリプトについてお話します。 これらは、bashシェル用に作成されたコマンドラインスクリプトです。 zsh、tcsh、kshなどの他のシェルもありますが、ここではbashに焦点を当てます。 この資料はすべての人を対象としています。唯一の条件は、Linuxコマンドラインで作業できることです。



コマンドラインスクリプトは、キーボードから入力し、ファイルに収集して、いくつかの共通の目的で統合できる同じコマンドのセットです。 同時に、チームの作業の結果は、独立した価値があるか、他のチームへの入力として機能する可能性があります。 スクリプトは、頻繁に実行されるアクションを自動化するための強力な方法です。

したがって、コマンドラインについて説明すると、セミコロンを使用して複数のコマンドを一度に実行できます。

pwd; 私は誰
実際、ターミナルでこれを試した場合、2つのコマンドを使用する最初のbashスクリプトはすでに作成されています。 それはこのように動作します。 pwdコマンドは、最初に現在の作業ディレクトリに関する情報を表示し、次にwhoamiコマンドは、ログインしているユーザーに関する情報を表示します。

このアプローチを使用すると、1行に必要な数のコマンドを組み合わせることができます。制限は、プログラムに渡すことができる引数の最大数のみです。 この制限は、次のコマンドで定義できます。

Getconf ARG_MAX
コマンドラインは優れたツールですが、必要なときに毎回コマンドを入力する必要があります。 一連のコマンドをファイルに書き込み、そのファイルを呼び出すだけでそれらを実行するとどうなりますか? 実際、私たちが話しているファイルはコマンドラインスクリプトと呼ばれています。

bashスクリプトのしくみ

touchコマンドを使用して空のファイルを作成します。 最初の行で、使用するシェルを指定する必要があります。 bashに関心があるので、ファイルの最初の行は次のようになります。

#!/ bin / bash
このファイルの他の場所では、シェルが処理しないコメントを示すためにハッシュ記号が使用されています。 ただし、最初の行は特殊なケースであり、ハッシュマークの後に感嘆符(シバンと呼ばれる)とbashパスが続き、スクリプトがbash専用に作成されたことをシステムに示します。

シェルコマンドは改行で区切られ、コメントはポンド記号で区切られます。 外観は次のとおりです。

#!/ bin / bash#これはコメントpwd whoami
ここでは、コマンドラインと同様に、コマンドを1行に記述し、セミコロンで区切ることができます。 ただし、コマンドを別の行に書き込むと、ファイルが読みやすくなります。 いずれにせよ、シェルはそれらを処理します。

スクリプトファイルへのアクセス許可の設定

ファイルを保存し、myscriptという名前を付ければ、bashスクリプトはほぼ完成です。 あとは、このファイルを実行可能にするだけです。そうしないと、実行しようとすると、アクセス許可が拒否されたというエラーが発生します。


誤って構成された権限でスクリプトファイルを実行しようとしています

ファイルを実行可能にしましょう:

Chmod + x ./myscript
それを実行してみましょう:

./myscript
権限を設定すると、すべてが正常に機能します。


bashスクリプトを正常に実行する

メッセージ出力

echoコマンドは、Linuxコンソールにテキストを印刷するために使用されます。 この事実の知識を使用してスクリプトを編集し、すでに含まれているコマンドを出力するデータに説明を追加しましょう。

#!/ bin / bash#コメントはこちらecho "現在のディレクトリは次のとおりです:" pwd echo "ログインしているユーザーは次のとおりです:" whoami
更新されたスクリプトを実行した後、次のようになります。


スクリプトからのメッセージの出力

これで、echoコマンドを使用して説明ラベルを表示できます。 Linuxツールを使用してファイルを編集する方法がわからない場合、または以前にechoコマンドを実行したことがない場合は、この記事を参照してください。

変数の使用

変数を使用すると、他のコマンドで使用するコマンドの結果などの情報をスクリプトファイルに保存できます。

作業結果を保存せずに個々のコマンドを実行しても問題はありませんが、このアプローチの可能性は非常に限られています。

bashスクリプトで使用できる変数には次の2種類があります。

  • 環境変数
  • ユーザー変数

環境変数

シェルコマンドが一部のシステムデータを処理する必要がある場合があります。 たとえば、現在のユーザーのホームディレクトリを表示する方法は次のとおりです。

#!/ bin / bash#display user home echo "現在のユーザーのホームは:$ HOME"
$ HOMEシステム変数は二重引用符で囲むことができることに注意してください。これにより、システムがそれを認識できなくなることはありません。 上記のスクリプトを実行すると、次のようになります。


スクリプトでの環境変数の使用

しかし、ドル記号を表示したい場合はどうでしょうか。 これを試してみましょう:

エコー「ポケットに1ドル持っている」
システムは、引用符で区切られた文字列のドル記号を検出し、変数を参照したと想定します。 スクリプトは、未定義の変数$1の値を表示しようとします。 これは私たちが必要としているものではありません。 何をすべきか?

このような状況では、ドル記号の前に円記号の制御文字を使用すると、次のようになります。

エコー「ポケットに\$1あります」
これで、スクリプトは期待どおりの結果を正確に出力します。


エスケープシーケンスを使用してドル記号を出力する

ユーザー変数

環境変数に加えて、bashスクリプトを使用すると、スクリプトで独自の変数を設定して使用できます。 このような変数は、スクリプトが終了するまで値を保持します。

システム変数と同様に、ユーザー変数にはドル記号を使用してアクセスできます。
TNW-CUS-FMP-7日以内にアクティベーションが可能な当社のサービスの10%割引のプロモーションコード
#!/ bin / bash#テスト変数grade = 5 person = "Adam" echo "$ personはいい子です、彼はグレード$gradeです"
このようなスクリプトを実行すると、次のようになります。


スクリプトのカスタム変数

コマンド置換

bashスクリプトの最も便利な機能の1つは、コマンドの出力から情報を抽出して変数に割り当てる機能です。これにより、スクリプトファイル内の任意の場所でこの情報を使用できます。

これは2つの方法で行うことができます。

  • バックティック文字「`」付き
  • $()構造を使用
最初のアプローチを使用するときは、バックティックの代わりに一重引用符を使用しないように注意してください。 コマンドは、次の2つのアイコンで囲む必要があります。

mydir = `pwd`
2番目のアプローチでは、同じことが次のように記述されます。

mydir = $(pwd)
そして、スクリプトは、最終的には次のようになります。

#!/ bin / bash mydir = $(pwd)echo $ mydir
その作業の過程で、pwdコマンドの出力はmydir変数に格納され、その内容はechoコマンドを使用してコンソールに送られます。


コマンドの結果を変数に保存するスクリプト

数学演算

スクリプトファイルで数学演算を実行するには、$((a + b))のような構文を使用できます。

#!/ bin / bash var1 = $((5 + 5))echo $ var1 var2 = $(($ var1 * 2))echo $ var2


スクリプトでの数学演算

if-then制御構造

一部のシナリオでは、コマンド実行のフローを制御する必要があります。 たとえば、特定の値が5より大きい場合は、1つのアクションを実行する必要があり、そうでない場合は別のアクションを実行する必要があります。 これは多くの状況に当てはまり、if-then制御構造がここで役立ちます。 最も単純な形式では、次のようになります。

コマンドの場合、コマンドfi
そして、ここに実際の例があります:

#!/ bin / bash if pwd then echo "It Works" fi
この場合、pwdコマンドが正常に完了すると、「itworks」というテキストがコンソールに出力されます。

私たちが持っている知識を使用して、より複雑なシナリオを書いてみましょう。 / etc / passwdでユーザーを検索したいとします。ユーザーが見つかった場合は、そのユーザーが存在することを報告します。

#!/ bin / bash user = likegeeks if grep $ user / etc / passwd then echo "The user $ user Exists" fi
これは、このスクリプトを実行した後に発生することです。


ユーザー検索

ここでは、grepコマンドを使用して、/ etc/passwdファイルでユーザーを検索しました。 grepコマンドに慣れていない場合は、ここでその説明を見つけることができます。

この例では、ユーザーが見つかった場合、スクリプトは適切なメッセージを表示します。 ユーザーが見つからなかった場合はどうなりますか? この場合、スクリプトは何も通知せずに実行を完了するだけです。 これについても教えてもらいたいので、コードを改良していきましょう。

if-then-else制御構造

プログラムが検索の成功と失敗の両方の結果を報告できるようにするために、if-then-else構文を使用します。 設定方法は次のとおりです。

ifコマンドthenコマンドelseコマンドfi
最初のコマンドがゼロを返した場合、つまり成功した場合、条件はtrueになり、実行はelseブランチに移動しません。 それ以外の場合、ゼロ以外のものが返された場合、つまり失敗または誤った結果が返された場合、elseの後のコマンドが実行されます。

次のスクリプトを書いてみましょう。

#!/ bin / bash user = anotherUser if grep $ user / etc / passwd thenecho"ユーザー$userが存在します"elseecho"ユーザー$userが存在しません"fi
その実行はelseブランチに沿って行われました。


if-then-else構文を使用してスクリプトを実行する

さて、先に進んで、もっと難しい状況について自問してみましょう。 1つの条件ではなく、複数の条件をチェックする必要がある場合はどうなりますか? たとえば、必要なユーザーが見つかった場合は1つのメッセージを表示し、他の条件が満たされた場合は別のメッセージを表示する必要があります。 このような状況では、ネストされた条件が役立ちます。 次のようになります。

command1の場合はelifcommand2をコマンドし、次にfiをコマンドします
最初のコマンドが成功を示すゼロを返す場合、最初のthenブロックのコマンドが実行されます。それ以外の場合、最初の条件がfalseで、2番目のコマンドがゼロを返す場合、2番目のコードブロックが実行されます。

#!/ bin / bash user = anotherUser if grep $ user / etc / passwd then echo "The user $ user Exists" elif ls / home then echo "ユーザーは存在しませんが、とにかく/homeの下にディレクトリがあります"fi
このようなスクリプトでは、たとえば、検索で結果が返されない場合にuseraddコマンドを使用して新しいユーザーを作成したり、他の便利なことを実行したりできます。

数の比較

スクリプトでは、数値を比較できます。 以下は、関連するコマンドのリストです。
n1 -eqn2n1がn2と等しい場合にtrueを返します。
n1 -gen2n1がn2以上の場合にtrueを返します。
n1 -gtn2n1がn2より大きい場合にtrueを返します。
n1 -len2n1がn2以下の場合にtrueを返します。
n1 -ltn2n1がn2より小さい場合にtrueを返します。
n1 -nen2n1がn2と等しくない場合はtrueを返します。

例として、比較演算子の1つを試してみましょう。 式は角括弧で囲まれていることに注意してください。

#!/ bin / bash val1 = 6 if [$ val1 -gt 5] thenecho"テスト値$val1は5より大きい"elseecho"テスト値$val1は5以下"fi
このコマンドが出力する内容は次のとおりです。


スクリプト内の数値の比較

変数val1の値が5より大きいため、比較演算子のthenブランチが実行され、対応するメッセージがコンソールに表示されます。

文字列の比較

スクリプトは文字列値を比較することもできます。 比較演算子は非常に単純に見えますが、文字列比較演算子には特定の特性があります。これについては、以下で説明します。 演算子のリストは次のとおりです。
str1 = str2文字列が等しいかどうかをテストし、文字列が同一の場合はtrueを返します。
s tr1!=str2文字列が同一でない場合はtrueを返します。
str1< str2 Возвращает истину, если str1 меньше, чем str2 .
str1>str2str1がstr2より大きい場合にtrueを返します。
-nstr1str1の長さがゼロより大きい場合にtrueを返します。
-zstr1str1の長さがゼロの場合にtrueを返します。

スクリプトでの文字列比較の例を次に示します。

#!/ bin / bash user = "likegeeks" if [$ user = $ USER] thenecho"ユーザー$userは現在ログインしているユーザーです"fi
スクリプトを実行した結果、次のようになります。


スクリプトでの文字列の比較

言及する価値のある文字列比較の機能の1つを次に示します。 つまり、演算子">"と"<» необходимо экранировать с помощью обратной косой черты, иначе скрипт будет работать неправильно, хотя сообщений об ошибках и не появится. Скрипт интерпретирует знак «>'出力リダイレクトコマンドとして。

これらの演算子の操作はコードでどのように見えるかを次に示します。

#!/ bin / bash val1 = text val2 = "another text" if [$ val1 \>
スクリプトの結果は次のとおりです。


文字列の比較、警告がスローされます

スクリプトは実行中ですが、警告を出すことに注意してください。

./myscript:5行目:[:引数が多すぎます
この警告を取り除くには、$val2を二重引用符で囲みます。

#!/ bin / bash val1 = text val2 = "another text" if [$ val1 \> "$ val2"] then echo"$val1は$val2より大きい"elseecho"$val1は$val2より小さい"fi
これで、すべてが正常に機能します。


文字列の比較

">"と"のもう1つの機能<» заключается в том, как они работают с символами в верхнем и нижнем регистрах. Для того, чтобы понять эту особенность, подготовим текстовый файл с таким содержимым:

Likegeeks likegeeks
myfileという名前で保存し、ターミナルで次のコマンドを実行します。

myfileを並べ替える
次のようにファイルの行を並べ替えます。

Likegeeks Likegeeks
sortコマンドは、デフォルトで、文字列を昇順でソートします。つまり、この例の小文字は大文字よりも小さくなります。 次に、同じ文字列を比較するスクリプトを準備しましょう。

#!/ bin / bash val1 = Likegeeks val2 = likegeeks if [$ val1 \> $ val2] then echo"$val1は$val2より大きい"elseecho"$val1は$val2より小さい"fi
これを実行すると、逆のことがわかります。小文字の文字が大文字の文字よりも大きくなります。


スクリプトファイル内の並べ替えコマンドと文字列の比較

比較コマンドで 大文字文字列が少なくなります。 ここでの文字列の比較は、ASCII文字コードを比較することによって行われます。したがって、ソート順は文字コードに依存します。

次に、sortコマンドは、システム言語設定で指定されたソート順を使用します。

ファイルチェック

おそらく、以下のコマンドはbashスクリプトで最も頻繁に使用されます。 ファイルに関するさまざまな条件を確認できます。 これらのコマンドのリストは次のとおりです。
-dfileファイルが存在してディレクトリであるかどうかを確認します。
-efileファイルが存在するかどうかを確認します。
-ffileファイルが存在してファイルであるかどうかを確認します。
-r fileファイルが存在し、読み取り可能かどうかを確認します。
-sfileファイルが存在して空でないかどうかを確認します。
-wfileファイルが存在して書き込み可能かどうかを確認します。
-xfileファイルが存在して実行可能かどうかを確認します。
file1 -ntfile2file1がfile2よりも新しいかどうかを確認します。
file1 -otfile2file1がfile2より古いかどうかを確認します。
-O fileファイルが存在し、現在のユーザーが所有しているかどうかを確認します。
-G fileファイルが存在するかどうか、およびそのグループIDが現在のユーザーのグループIDと一致するかどうかを確認します。

これらのコマンドは、今日説明されている他の多くのコマンドと同様に、覚えやすいものです。 それらの名前は、さまざまな単語の略語であり、実行するチェックを直接示しています。

実際にコマンドの1つを試してみましょう。

#!/ bin / bash mydir = / home / likegeeks if [-d $ mydir] then echo"$mydirディレクトリが存在します"cd$ mydir ls else echo"$mydirディレクトリが存在しません"fi
このスクリプトは、既存のディレクトリの場合、その内容を表示します。


ディレクトリの内容を一覧表示する

残りのコマンドは自分で試すことができると信じています。これらはすべて同じ原則に従って適用されます。

結果

今日は、bashスクリプトの作成を開始する方法について話し、いくつかの基本的なことを取り上げました。 実際、bashプログラミングのトピックは巨大です。 この記事は、11の資料の大規模なシリーズの最初の部分の翻訳です。 今すぐ続行したい場合は、これらの資料のオリジナルのリストを以下に示します。 便宜上、あなたが今読んだ翻訳のものがここに含まれています。

どんなにシンプルでも GUI Linuxでは、関数がいくつあっても、ターミナルを介して解決する方が便利なタスクがあります。 第一に、高速であるため、第二に、すべてのマシンがグラフィカルインターフェイスを備えているわけではありません。たとえば、サーバー上では、コンピューティングリソースを節約するために、すべてのアクションが端末を介して実行されます。

すでに経験豊富なユーザーの場合は、ターミナルを介してさまざまなタスクを実行することがよくあります。 多くの場合、いくつかのコマンドを順番に実行する必要があるタスクがあります。たとえば、システムを更新するには、最初にリポジトリを更新してから、新しいバージョンのパッケージをダウンロードする必要があります。 これは単なる例であり、そのようなアクションはたくさんあります。バックアップを取り、コピーしたファイルをにアップロードすることもできます。 リモートサーバー。 したがって、同じコマンドを複数回入力しないようにするために、スクリプトを使用できます。 この記事では、Bashでのスクリプトの記述、基本的な演算子、およびそれらがどのように機能するか、いわば、bashスクリプトを最初から見ていきます。

スクリプト、またはスクリプトとも呼ばれるスクリプトは、インタープリタープログラム(この場合はコマンドラインプログラム)(bash)によって順番に読み取られ、実行される一連のコマンドです。

スクリプトは、手動で入力するのに慣れている通常のコマンドと、それらを実行するプログラムをリストしたプレーンテキストファイルです。 スクリプトを実行するローダーは環境変数の操作方法を知らないため、起動するプログラムに正確なパスを渡す必要があります。 次に、スクリプトがこのプログラムに渡され、実行が開始されます。

のスクリプトの最も簡単な例 コマンドシェルバッシュ:

!/ bin / bash
echo "Hello world"

echoユーティリティは、渡された文字列をパラメータとして画面に出力します。 最初の行は特別で、コマンドを実行するプログラムを指定します。 一般的に言えば、他のプログラミング言語でスクリプトを作成し、たとえばpythonで目的のインタープリターを指定できます。

!/ usr / bin / env python
print( "Hello world")

またはPHPの場合:

!/ usr / bin / env php
echo "Hello world";

最初のケースでは、コマンドを実行するプログラムを直接ポイントしました。次の2つでは、プログラムの正確なアドレスがわからないため、envユーティリティに名前で検索して実行するように依頼します。 このアプローチは、多くのスクリプトで使用されています。 しかし、それだけではありません。 の Linuxシステム、システムがスクリプトを実行できるように、ファイルに実行可能フラグを設定する必要があります。

このフラグはファイル自体の内容を変更しません。これは単なるテキストファイルではなくプログラムであり、実行する必要があることをシステムに通知するだけです。ファイルを開き、インタプリタを見つけて実行する必要があります。 インタプリタが指定されていない場合、デフォルトでユーザーのインタプリタが使用されます。 ただし、すべての人がbashを使用するわけではないため、これを明示的に指定する必要があります。

走る:

chmod ugo + x script_file

次に、最初の小さなプログラムを実行します。

./script_file

すべてが機能します。 たとえば、更新用の小さなスクリプトを作成する方法はすでに知っています。 ご覧のとおり、スクリプトにはターミナルで実行されるのと同じコマンドが含まれており、非常に簡単に記述できます。 しかし、今度はタスクを少し複雑にします。 スクリプトはプログラムであるため、スクリプト自体でいくつかの決定を行い、コマンド実行の結果を保存し、ループを実行する必要があります。 これはすべて、Bashシェルを使用して実行できます。 確かに、ここではすべてがはるかに複雑です。 簡単に始めましょう。

スクリプト内の変数

Bashでのスクリプトの記述は、一時データを保存せずに完了することはめったにありません。つまり、変数を作成することを意味します。 単一のプログラミング言語が変数なしで実行できるわけではなく、私たちのプリミティブシェル言語もそうです。

以前に環境変数に遭遇したことがあるかもしれません。 したがって、これらは同じ変数であり、同じように機能します。

たとえば、文字列変数を宣言しましょう。

string = "Hello world"

文字列の値は引用符で囲まれています。 しかし実際には、引用符は必ずしも必要ではありません。 ここでは、bashの主な原則が保持されています-スペースは 特殊文字、区切り文字。したがって、引用符を使用しない場合、worldはすでに別のコマンドと見なされます。同じ理由で、等号の前後にスペースを入れません。

$記号は、変数の値を表示するために使用されます。 例えば:

スクリプトを変更してみましょう。

!/ bin / bash
string1 = "hello"
string2 = world
string = $ string1 $ string2
エコー$文字列

そして私達はチェックします:

Bashは、言語のように変数タイプを区別しません 上級、C ++と同様に、変数に数値と文字列の両方を割り当てることができます。 同様に、これはすべて文字列と見なされます。 シェルは文字列のマージのみをサポートします。これを行うには、変数名を行に書き込むだけです。

!/ bin / bash
string1 = "hello"
string2 = world
string = $ string1 $ string2 \ and \ me
string3 = $ string1 $string2"と私"
エコー$string3

チェックします:

私が言ったように、文字列に特殊文字がない場合、引用符はオプションであることに注意してください。 文字列をマージする両方の方法を詳しく見てみましょう。引用符の役割もここに示されています。 もっと必要な場合 難しい方法文字列処理または算術演算。これはシェルの機能には含まれていません。これには通常のユーティリティが使用されます。

変数とコマンド出力

ユーティリティの実行結果を格納できない場合、変数はそれほど有用ではありません。 これには、次の構文が使用されます。

$(指図 )

この構成では、コマンドの出力は、画面ではなく、呼び出された場所に直接リダイレクトされます。 たとえば、dateユーティリティは現在の日付を返します。 これらのコマンドは同等です。

わかりますか? helloworldとdateが表示されるスクリプトを書いてみましょう。

string1 = "hello world"
string2 = $(日付)

string = $ string1 $ string2

これで変数について十分に理解し、bashスクリプトを作成する準備が整いましたが、まだまだあります。 次に、パラメータと制御構造を見ていきます。 これらはすべて普通のことです bashコマンド、ファイルに保存する必要はなく、外出先ですぐに実行できます。

スクリプトオプション

ユーザー入力に依存しないbashスクリプトを作成できるとは限りません。 ほとんどの場合、実行するアクションまたは使用するファイルをユーザーに尋ねる必要があります。 スクリプトを呼び出すときに、パラメーターをスクリプトに渡すことができます。 これらのパラメーターはすべて、数値という名前の変数として使用できます。

1という名前の変数には、最初のパラメーターの値、変数2、2番目のパラメーターなどが含まれます。 このbashスクリプトは、最初のパラメーターの値を出力します。

!/ bin / bash
エコー$1

スクリプト内の制御構造

bashスクリプトを作成することは、特定の要因を分析し、それらに応じて必要なアクションを実行する機能がなければ、それほど有用ではありません。 これはかなり複雑なトピックですが、bashスクリプトを作成するためには非常に重要です。

Bashには、条件をチェックするためのコマンドがあり、その構文は次のとおりです。

command_conditionの場合
それから
指図
そうしないと
指図
fi

このコマンドは、条件コマンドの終了コードをチェックし、0(成功)がコマンドまたは単語の後にいくつかのコマンドを実行する場合、終了コードが1の場合、elseブロックが実行され、fiはのブロックの完了を意味します。コマンド。

ただし、ほとんどの場合、コマンドの戻りコードではなく、文字列と数値の比較に関心があるため、[[コマンドが導入されました。これにより、さまざまな比較を実行し、比較の結果に応じて戻りコードを発行できます。 その構文は次のとおりです。

[[parameter1演算子parameter2]]

比較のために、すでに使い慣れた演算子を使用します<,>、=、!=など。式がtrueの場合、コマンドは0を返し、そうでない場合は-1を返します。ターミナルでその動作を少しテストできます。 最後のコマンドの戻りコードは$?変数に格納されます。

これらすべてを組み合わせることで、条件式を含むスクリプトを取得できます。

!/ bin / bash
if [[$ 1> 2]]
それから
エコー$1"は2"より大きい
そうしないと
エコー$1"は2または2"未満です
fi

もちろん、この設計にはより強力な機能がありますが、この記事でそれらをカバーするには複雑すぎます。 多分それについては後で書きます。 とりあえず、サイクルに移りましょう。

スクリプトのループ

プログラムの利点は、何回実行する必要があるアクションを複数行で指定できることです。 たとえば、数行だけで構成されているが、何時間も実行され、パラメーターを解析して必要なアクションを実行するbashスクリプトを作成することができます。

まず考えてみましょう forループ。 その構文は次のとおりです。

リスト内の変数の場合
する
指図
終わり

リスト全体を繰り返し、リストの値を変数に順番に割り当てます。各割り当ての後に、doとdoneの間にあるコマンドを実行します。

たとえば、5桁以上繰り返してみましょう。

1 2 345のインデックス用
する
エコー$index
終わり

または、現在のディレクトリ内のすべてのファイルを一覧表示できます。

$(ls -l);のファイルの場合 「$file」をエコーし​​ます。 終わり

ご存知のように、名前を表示するだけでなく、必要なアクションを実行することもできます。これは、bashスクリプトを作成するときに非常に役立ちます。

2番目のループはwhileループです。これは、conditionコマンドがコード0、successを返している間に実行されます。 構文について考えてみましょう。

コマンド条件中
する
指図
終わり

例を考えてみましょう。

!/ bin / bash
インデックス=1
while [[$ index< 5 ]]
する
エコー$index
「index=index+1」としましょう
終わり

ご覧のとおり、すべてが実行され、letコマンドは指定されたものを実行するだけです。 数学演算、この場合、変数の値を1つ増やします。

他に注意したいことがあります。 while、for、ifなどの構文は、複数行に書き込むように設計されており、1行に書き込もうとすると、エラーが発生します。 ただし、これには、改行があるはずの場所にセミコロン「;」を付けることができます。 たとえば、前のループは1行として実行された可能性があります。

index = 1; while [[$ index< 5 ]]; do echo $index; let "index=index+1"; done;

すべてが非常に単純です。私は、最も基本的なものだけで、追加のbash用語と機能で記事を複雑にしないようにしました。 場合によっては、bashスクリプトのGUIを作成する必要があります。その後、zenityやkdialogなどのプログラムを使用できます。これを使用すると、ユーザーにメッセージを表示したり、ユーザーに情報を求めたりするのに非常に便利です。

結論

これで、Linuxでのスクリプトの基本を理解し、たとえば、次のような必要なスクリプトを作成できます。 コピーを予約。 私はbashスクリプトを最初から見てみました。 したがって、すべての側面が考慮されているわけではありません。 おそらく、次の記事のいずれかでこのトピックに戻ります。

おそらく誰もがそれを知っています バッシュシェル/binまたは/usr/binフォルダーにない組み込みコマンドがあります。 それらはシェルに組み込まれ、関数として実行されます。 以前の記事の1つで、検討しました。 そこでは、スクリプトがどのように見えるか、条件、ループ、変数の使用についてほとんどすべてについて話し合いましたが、関数にとどまりませんでした。

今日の記事では、この欠点を修正します。 他のプログラミング言語と同様に、Bashには非常に便利な関数があります。 bash関数の使用方法、それらの記述方法、さらにはこれらの関数からライブラリを作成する方法についても見ていきます。

まず、コンテキスト内の関数が何であるかを理解する必要があります。 関数は、特定のタスクを実行する、1つの名前で統合されたコマンドのセットです。 関数はその名前で呼び出され、パラメーターを受け取り、作業の結果を返すことができます。 つまり、Bash関数は他のプログラミング言語と同じように機能します。

関数を作成するための構文は非常に単純です。

function_name()(コマンドリスト)

関数名は、既存のコマンドまたは関数のいずれとも一致してはならず、関数本体のすべてのコマンドは新しい行に書き込まれます。

シンプルな機能

画面に文字列を出力する小さな関数を書いてみましょう。

$ vi function.sh

#!/ bin / bash
printstr()(
echo "hello world"
}
printstr

bash関数の呼び出しは、他のコマンドと同様に、その名前を指定することによって行われます。 スクリプトを実行して実行します。その前に、実行権限を与える必要があることを忘れないでください。

chmod u + x function.sh

すべてが機能するので、タスクを複雑にして、関数に引数を渡してみましょう。

関数の引数

関数の引数は、呼び出すときに渡す必要があり、スクリプトの引数と同じ方法で読み取られます。 bashパラメーターを使用して関数を呼び出すための構文は次のとおりです。

function_name 引数1引数2...引数N

ご覧のとおり、すべてが非常に単純です。 パラメータはスペースで区切られます。 次に、指定した文字列を出力するように関数を改善しましょう。

!/ bin / bash
printstr()(
エコー$1
}
printstr "Hello world"

複数のオプションがあります。

!/ bin / bash
printstr()(
エコー$1
エコー$2
エコー$3
エコー$5
}
printstr "arg1" "arg2" "arg3" "arg4" "arg5"

Cのように、スタックを使用して引数を抽出する別の方法があります。 最初の引数をフェッチしてから、引数スタックポインタを1つ進めて、最初の引数を再度フェッチします。 等:

!/ bin / bash
printstr()(
エコー$1
シフト
エコー$1
シフト
エコー$1
シフト
エコー$1
}
printstr "arg1" "arg2" "arg3" "arg4"

関数の結果を返す

bashパラメーターで関数を使用できるだけでなく、そこから作業の結果を取得することもできます。 これにはreturnコマンドが使用されます。 関数を終了して戻ります 数値戻りコード。 0から255までの範囲で指定できます。

!/ bin / bash
printstr()(
134を返します。
}
printstr
エコー$?

ステータスコードではなくbash関数の戻り値を使用する必要がある場合は、echoを使用してください。 文字列はすぐには端末に出力されませんが、関数の結果として返され、変数に書き込んでから使用できます。

!/ bin / bash
printstr()(
エコー「テスト」
}
VAR = $(printstr)
エコー$VAR

エクスポート機能

次のdeclareコマンドを使用して、スクリプトの外部で関数を使用可能にすることができます。

!/ bin / bash
printstr()(
echo "hello world"
}
-x-fprintstrを宣言します

次に、sourceコマンドを使用してスクリプトを実行します。

ソースfunction.sh
$ printstr

再帰

関数をそれ自体の内部から呼び出して、再帰を実行できます。

!/ bin / bash
printstr()(
echo "hello world"
printstr
}
printstr

再帰を使って実験することができます。多くの場合、最初のBash関数呼び出しを行うことを忘れないでください。

関数内のローカル変数

関数で通常の変数を宣言すると、スクリプト全体で使用できるようになります。これは関数の値を返すのに便利ですが、ローカル変数にする必要がある場合もあります。 これにはローカルコマンドがあります。

!/ bin / bash
printstr()(
ローカルVAR=$ 1
エコー$(var)
}
printstr "Hello World"

関数ライブラリ

いくつかのbash関数を取得し、それらを1つのライブラリに結合して、これらの関数を1つのコマンドでインポートできるようにすることができます。 これは、関数のエクスポートと同様の方法で行われます。 まず、ライブラリファイルを作成しましょう。

test1()(
echo "Hello World from 1";
}
test2()(
echo "Hello World from 2";
}
test3()(
echo "Hello World from 3";
}

次に、関数を使用するスクリプトを作成しましょう。 sourceコマンドを使用するか、スクリプト名を指定するだけで、ライブラリをインポートできます。

!/ bin / bash
ソースlib.sh
test1
test2
test3

結論

この記事では、bash関数、それらの記述方法、適用方法、およびそれらをライブラリーに結合する方法について説明しました。 Bashでスクリプトを頻繁に作成する場合は、この情報が役立ちます。 各スクリプトで使用する独自の関数セットを作成して、作業を簡単にすることができます。

トピックの続き:
ソリューション

次の表に、.debファイル拡張子に関する有用な情報を示します。 次のような質問に答えます:.debファイルとは何ですか?開く必要のあるソフトウェアは何ですか...