このチュートリアルでは、シェルスクリプトと、最初のシェルスクリプトを作成する方法について説明します。これらは一般にシェルスクリプトと呼ばれますが、他のLinuxシェルの中でBashを使用するため、これらをBashスクリプトと呼びます。
zsh、tcsh、ksh、およびその他のシェルがあります。
以前の投稿では、Bashシェルの使用方法とLinuxコマンドの使用方法を見てきました。
Bashスクリプトの概念は、一連のコマンドを実行して作業を完了することです。
シェルから1つのステップで複数のコマンドを実行するには、コマンドを1行で入力し、セミコロンで区切ることができます。
pwd ; whoami
これはBashスクリプトです!!
pwdコマンドが最初に実行され、現在の作業ディレクトリが表示されます。次に、whoamiコマンドが実行され、現在ログインしているユーザーが表示されます。
複数のコマンドを好きなだけ実行できますが、制限があります。このコマンドを使用して、最大引数を決定できます。
getconf ARG_MAX
さて、コマンドをファイルに入れるのはどうですか。これらのコマンドを実行する必要がある場合は、そのファイルのみを実行します。これはBashスクリプトと呼ばれます。
まず、touchコマンドを使用して新しいファイルを作成します。 Linuxには多くのシェルがあるため、Bashスクリプトの最初に、使用するシェルを定義する必要があります。Bashシェルはその1つです。
シェルスクリプトシバン
Bashスクリプトを作成するときに最初に入力する行は、(#!)の後に使用するシェルです。
#! <===この標識はシバンと呼ばれます。
#!/bin/bash
シェルスクリプトの行の前にポンド記号(#)を使用すると、この行はコメントになり、処理されないことを意味しますが、上記の行は特殊なケースです。この行は、使用するシェル(この場合はBashシェル)を定義します。
シェルコマンドは、次のように1行に1つずつ入力されます。
#!/bin/bash # This is a comment pwd whoami
同じ行に複数のコマンドを入力できますが、セミコロンで区切る必要がありますが、コマンドは別々の行に書き込むことをお勧めします。これにより、後で読みやすくなります。
スクリプト権限を設定する
シェルスクリプトを作成したら、ファイルを保存します。
次に、そのファイルを実行可能に設定します。それ以外の場合は、許可が拒否されます。 chmodコマンドを使用して権限を設定する方法を確認できます。
chmod +x ./myscript
次に、シェルに入力するだけで実行してみてください:
./myscript
はい、実行されます。
最初のBashスクリプトを作成する
他の投稿からわかるように、テキストの印刷は
を使用していませんecho
コマンド。
ファイルを編集して、次のように入力します:
#!/bin/bash # our comment is here echo "The current directory is:" pwd echo "The user logged in is:" whoami
出力を見てください:
完全!これで、コマンドを実行してテキストを表示できます:
echo
echoコマンドやファイルの編集方法がわからない場合は、基本的なLinuxコマンドに関する以前の記事を参照することをお勧めします。
変数の使用
変数を使用すると、スクリプトで使用するための情報を保存できます。
シェルスクリプトでは、次の2種類の変数を定義できます。
- 環境変数
- ユーザー変数
環境変数
システム変数を操作する必要がある場合があります。これは、環境変数を使用して行うことができます。
#!/bin/bash # display user home echo "Home for the current user is: $HOME"
$ HOMEシステム変数を二重引用符で囲み、ホーム変数を正しく出力することに注意してください。
ドル記号自体を印刷したい場合はどうなりますか?
echo "I have $1 in my pocket"
変数$1が存在しないため、機能しません。では、それをどのように克服するのでしょうか?
次のように、ドル記号の前のバックスラッシュ\であるエスケープ文字を使用できます。
echo "I have \$1 in my pocket"
今では動作します!!
ユーザー変数
また、スクリプトでカスタム変数を設定して使用することもできます。
これと同じ方法でユーザー変数を呼び出すことができます:
#!/bin/bash # User variables grade=5 person="Adam" echo "$person is a good boy, he is in grade $grade"
chmod +x myscript ./myscript
コマンド置換
コマンド置換を使用して、コマンドの結果から情報を抽出できます。
次のいずれかの方法でコマンド置換を実行できます。
- バッククォート文字( `)。
- $()形式。
バッククォート文字を入力するときは、一重引用符ではないことを確認してください。
次のように、コマンドを2つのバッククォートで囲む必要があります。
mydir=`pwd`
またはその逆:
mydir=$(pwd)
したがって、スクリプトは次のようになります。
#!/bin/bash mydir=$(pwd) echo $mydir
コマンドの出力をmydir変数に保存できます。
数学の計算
$((2 + 2))形式を使用して基本的な数学計算を実行できます:
#!/bin/bash var1=$(( 5 + 5 )) echo $var1 var2=$(( $var1 * 2 )) echo $var2
とても簡単です。
if-thenステートメント
シェルスクリプトには条件文が必要です。値が10より小さい場合のように、それ以外の場合はこれを行います。好きなロジックを想像できます。
if-thenステートメントの最も基本的な構造は次のとおりです。
コマンドの場合;次に
何かをする
fi
次に例を示します:
#!/bin/bash if whoami; then echo "It works" fi
whoami
条件がtrueを返すようにユーザーを返し、メッセージを出力します。
もっと深く掘り下げて、私たちが知っている他のコマンドを使用しましょう。
ユーザーが存在するかどうかを確認します
ユーザーのファイルで特定のユーザーを検索している可能性があります
/etc/passwd
レコードが存在する場合は、メッセージで教えてください。
#!/bin/bash user=likegeeks if grep $user /etc/passwd; then echo "No such a user $user" fiをエコーします。
を使用します
/etc/passwd
ファイル。 grepコマンドに関するチュートリアルを確認できます。
ユーザーが存在する場合、シェルスクリプトはメッセージを出力します。
ユーザーが存在しない場合はどうなりますか?スクリプトは、ユーザーが存在しないことを通知せずに実行を終了します。 OK、スクリプトをさらに改善しましょう。
if-then-elseステートメント
if-then-elseステートメントは次の構造を取ります:
コマンドの場合;次に
何かをする
その他
別のことをする
fi
最初のコマンドが実行されてゼロが返された場合、つまり成功した場合、elseステートメントの後にコマンドがヒットすることはありません。それ以外の場合、ifステートメントがゼロ以外を返す場合。これは、ステートメント条件が失敗することを意味します。この場合、シェルはelseステートメントの後にコマンドをヒットします。
#!/bin/bash user=anotherUser if grep $user /etc/passwd; then echo "The user $user Exists" else echo "The user $user doesn’t exist" fi
私たちは今まで順調に進んでいます、動き続けてください。
では、elseステートメントがもっと必要な場合はどうでしょうか。
それは簡単です。次のようなifステートメントをネストすることでそれを実現できます:
条件1の場合;次に
コマンド
elif condition2;次に
コマンド
fi
最初のコマンドがゼロを返す場合。成功を意味します。それ以降はコマンドを実行します。2番目のコマンドがゼロを返す場合はその後のコマンドを実行します。それ以外の場合はいずれもゼロを返さない場合は最後のコマンドのみを実行します。
#!/bin/bash user=anotherUser if grep $user /etc/passwd; then echo "The user $user Exists" elif ls /home; then echo "The user doesn’t exist" fiをエコーします。
任意のシナリオを想像できます。ユーザーが存在しない場合は、
を使用してユーザーを作成します。useradd
コマンドまたは他のことをします。
テストの組み合わせ
AND(&&)またはOR(||)コマンドを使用して複数のテストを組み合わせることができます。
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] && [ -n $name ]; then echo "The name exists and the folder $dir exists." else echo "One test failed" fi
この例は、両方のテストが成功した場合にのみtrueを返します。そうしないと失敗します。
また、OR(||)も同じように使用できます:
#!/bin/bash dir=/home/likegeeks name="likegeeks" if [ -d $dir ] || [ -n $name ]; then echo "Success!" else echo "Both tests failed" fi
この例では、一方または両方が成功した場合に成功を返します。
両方が失敗した場合にのみ失敗します。
数値比較
次のような数値比較チェックを使用して、2つの数値間の数値比較を実行できます。
number1 -eqnumber2number1がnumber2と等しいかどうかを確認します。
number1 -genumber2number1がnumber2以上であるかどうかを確認します。
number1 -gtnumber2number1がnumber2より大きいかどうかを確認します。
number1 -lenumber2number1がnumber2以下かどうかを確認します。
number1 -ltnumber2number1がnumber2よりも小さいかどうかを確認します。
number1 -nenumber2number1がnumber2と等しくないかどうかをチェックします。
例として、そのうちの1つを試してみますが、残りは同じです。
示されているように、比較ステートメントは角括弧で囲まれていることに注意してください。
#!/bin/bash num=11 if [ $num -gt 10]; then echo "$num is bigger than 10" else echo "$num is less than 10" fi
numが10より大きいため、最初のステートメントが実行され、最初のエコーが出力されます。
文字列の比較
次のいずれかの方法で文字列を比較できます。
string1 =string2string1がstring2と同一であるかどうかをチェックします。
string1!=string2string1がstring2と同一でないかどうかをチェックします。
string1
string1>string2string1がstring2より大きいかどうかをチェックします。
-nstring1string1がゼロより長いかどうかをチェックします。
-zstring1string1の長さがゼロかどうかを確認します。
この例に文字列比較を適用できます:
より大きいおよびより小さいに関する1つの注意点 文字列を比較する場合は、必須 バックスラッシュでエスケープする 大なり記号のみを使用すると、間違った結果が表示されるためです。
したがって、次のようにする必要があります:
実行されますが、次の警告が表示されます:
これを修正するには、$ valsを二重引用符で囲み、次のように1つの文字列のままにします。
より大きいおよびより小さいに関する重要な注意事項 文字列の比較用。違いを理解するには、次の例を確認してください。
likegeeks
Likegeeks
テスト条件では、小文字が大文字よりも大きいと見なされます。
逆のソートコマンドとは異なります。
テスト条件はASCIIの順序に基づいています。
並べ替えコマンドは、システム設定からの番号付け順序に基づいています。
次の演算子を使用して、ファイルを比較および確認できます。
-dmy_fileフォルダかどうかを確認します。
-emy_fileファイルが使用可能かどうかを確認します。
-fmy_fileファイルかどうかを確認します。
-rmy_file読み取り可能かどうかを確認します。
my_file – ntmy_file2my_fileが新しいかどうかを確認します my_file2より。
my_file – otmy_file2my_fileが古いかどうかを確認します my_file2より。
-Omy_fileファイルの所有者とログに記録されたユーザーが一致するかどうかを確認します。
-Gmy_fileファイルとログに記録されたユーザーが同じグループを持っているかどうかを確認します。
それらが意味するように、あなたはそれらを決して忘れません。
それらの1つを選び、例として取り上げましょう:
例として、それらすべてを入力するつもりはありません。角かっこをそのまま入力して、スクリプトを正常に完了します。
他にも高度なif-then機能がいくつかありますが、別の投稿で作成しましょう。
今のところです。楽しんで、どんどん練習していきたいです。
ありがとうございます。#!/bin/bash
user="likegeeks"
if [ $user = $USER ]; then
echo "The user $user is the current logged in user"
fi
をエコーします。
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
./myscript: line 5: [: too many arguments
#!/bin/bash
v1=text
v2="another text"
if [ $v1 \> "$v2" ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
#!/bin/bash
v1=Likegeeks
v2=likegeeks
if [ $v1 \> $v2 ]; then
echo "$v1 is greater than $v2"
else
echo "$v1 is less than $v2"
fi
sort myfile
sort
sort
ファイルの比較
#!/bin/bash
mydir=/home/likegeeks
if [ -d $mydir ]; then
echo "Directory $mydir exists"
cd $mydir
ls
else
echo "NO such file or directory $mydir"
fi