Java開発 - シェルプログラミング
シェルとは何ですか?
シェルとは、一般にシェル(コアと区別するために使われます)と呼ばれ、「ユーザーに操作インターフェースを提供する」ソフトウェア(コマンドインタープリタ、コマンドパーサー)を指します。これは、DOS の COMMAND.COM およびそれ以降の cmd.exe に似ています。ユーザーコマンドを受信し、対応するアプリケーションを呼び出します。
シェルは非常に強力なプログラミング言語でもあり、書きやすく、デバッグが簡単で、柔軟性があります。
簡単に言うと、シェルスクリプトはユーザーがカーネルを操作するためのインターフェースを提供すると同時に、コマンドにロジックを割り当てることもでき、プログラマーは任意のコマンドを実行するタイミングを設計できます。
なぜ Java プログラマーはシェルを学ぶのでしょうか?
1. 運用保守担当者が作成するシェルプログラムを理解する シェル
スクリプトは、基盤となるコマンドをカプセル化したものに相当します サービスの起動・保守時に、運用保守担当者は通常、コマンドを実行するためのシェルスクリプトを作成します。サービスを管理するためのバッチ。Java プログラマーは運用および保守担当者とコミュニケーションをとる必要があり、シェル プログラムを理解できることが最も基本的な前提条件となります。
2. 開発を容易にするために、時折、単純なシェル プログラムを作成する 一部の
複雑なプロセスについては、プログラマは単純なシェル スクリプトを使用して作業を容易にすることができます。開発プロセスでは通常、mysql、nacos、redis、rabbitMQ などのサードパーティ ツールを使用する必要がありますが、いちいち起動/終了するのは非常に面倒です。ワンクリックでサービスを開始/シャットダウンするスクリプト。さらに、開発を簡素化できる便利なシェルが他にもたくさんあります。
シェルパーサー
シェル パーサー コマンドを確認します: cat /etc/shells
シェル言語パーサーに sh、bash などが含まれていることがわかります。
ディレクトリの詳細を表示: cll /bin/ | grep bash
実際、sh は bash のソフトリンクです。つまり、sh パーサーを使用する場合、実際には bash パーサーが使用されます。
最初のシェルスクリプト
1. スクリプトを書く
my_sh ディレクトリを作成します: mkdir -p /home/my_sh/
hello.sh スクリプトを作成して書き込みます: vim /home/my_sh/hello.sh
次のように入力します:
#!/bin/bash
echo "hello world!"
Linux の基本はデフォルトで誰もが知っていますが、操作方法がわからない場合は、まず Linux の基本を学ぶことをお勧めします。
# はコメント #! の意味であり、
パーサーを指定する意味であり、ここでは区別する必要があります。
echo は print と同等で、印刷を意味します。
プログラム全体は helloworld! を出力することです。この文の意味
2. スクリプトを実行します
絶対パスを使用する
コマンド: sh /home/my_sh/hello.sh
コマンド: bash /home/my_sh/hello.sh
コマンド: /home/my_sh/hello.sh
/home/my_sh/hello.sh を直接使用して、権限が不十分であることを確認します。これは、ファイルに実行権限がないためです。これは、chmod を使用して権限を割り当てることで解決できます。
権限を割り当てるchmod 777 /home/my_sh/hello.sh
再度実行します。
相対パスを使用するには、
まず /home/my_sh ディレクトリに入る必要があります: cd /home/my_sh/
コマンド: sh hello.sh
コマンド: bash hello.sh
コマンド: ./hello.sh
./ は現在のパスを表します。相対パスを使用する場合は、hello.sh を直接使用する代わりに ./hello.sh を使用する必要があります。
シェル内の変数
1. システム環境変数
システム環境設定ファイル /etc/profile または /etc/profile.d/ 下のすべての xx.sh ファイルに設定されている環境変数は、 $xxx の形式で直接取得できます。 例: echo
$
HOME
echo $USER
echo $SHELL
echo $JAVA_HOME
JAVA_HOME は自分で設定した環境変数です
2. ユーザー定義変数
カスタム変数は = で直接代入でき、値は $xxx の形式で取得できます。
例: A=1
print: echo $A
注:等号の両側にスペースを使用することはできません。A = 1、A= 1、A =1 これらの形式は許可されません、間違っています
値に !&$、スペースなどの特殊文字が含まれる場合は、一重引用符で囲む必要があります
A=!&$ ggg
echo $A A
='!&$ ggg'
A='!&$ ggg'
エコー $A
注:エンコード上の理由により、上記の一重引用符を英語に変更する必要があります。コード ブロック内のコードをコピーしてください。
3. 特殊変数
(1) $n: n は数字、$0 はスクリプト名、$1 ~ $9 は最初から 9 番目のパラメータを表し、10 個を超えるパラメータは ${10} のように中かっこで囲む必要があります。実際にはすべてパラメータも同様に取得します ${n}ですが、0~9は$nに簡略化されています
param スクリプトを作成します: vim /home/my_sh/param.sh
次の情報を入力します。
#!/bin/bash
echo "$0 $1 $2 ${3} ${4}"
スクリプトを実行します: sh /home/my_sh/param.sh
スクリプトを実行します: sh /home/my_sh/param.sh パラメータ 1 パラメータ 2 パラメータ 3 パラメータ 4 パラメータ 5
以前のスクリプト名と前の 4 つのパラメータが正常に受信されたことがわかります。
(2) $#:すべての入力パラメータの数を取得し、そのパラメータはループに使用されます。
param スクリプトを編集します: vim /home/my_sh/param.sh
以下の情報を入力します。
#!/bin/bash
echo "$0 $1 $2 ${3} ${4}"
echo $#
スクリプトを実行します: sh /home/my_sh/param.sh
スクリプトを実行します: sh /home/my_sh/param.sh パラメータ 1 パラメータ 2 パラメータ 3 パラメータ 4 パラメータ 5
(3) $*、$@
$*:コマンドラインのすべてのパラメータを表します。$* はすべてのパラメータをまとめて表示します。 $
@:コマンドラインのすべてのパラメータを表します。$@ は各パラメータを個別に扱います。
param スクリプトを編集します: vim /home/my_sh/param.sh
次の情報を入力します。
#!/bin/bash
echo "$0 $1 $2 ${3} ${4}"
echo $#
echo $*
echo $@
スクリプトを実行します: sh /home/my_sh/param.sh
スクリプトを実行します: sh /home/my_sh/param.sh パラメータ 1 パラメータ 2 パラメータ 3 パラメータ 4 パラメータ 5
ここには違いはありませんが、ループ内で確認するのは簡単です。
param スクリプトを編集します: vim /home/my_sh/param.sh
次の情報を入力します。
#!/bin/bash
echo "$0 $1 $2 ${3} ${4}"
echo $#
for parm in "$*"
do
echo $parm
done
for parm in "$@"
do
echo $parm
done
スクリプトを実行します: sh /home/my_sh/param.sh パラメータ 1 パラメータ 2 パラメータ 3 パラメータ 4 パラメータ 5
(4)$? :最後に実行したコマンドの戻りステータス。この変数の値が 0 の場合、前のコマンドが正しく実行されたことを意味します。それ以外の場合、実行は失敗します (特定の数はコマンド自体によって決定されます)。
テスト:
sh /home/my_sh/hello.sh
echo $?
sh /home/my_sh/
echo $?
シェルオペレーター
シェル プログラムでは、すべてのデータ型はデフォルトで文字列です。データを操作する場合は、特定の操作パラダイムを使用する必要があります。
例:
コマンド: echo 1+1 は
計算を実行しません。
(1) expr +、-、*、/、% 加算、減算、乗算、除算、剰余
注: expr 演算子の間にはスペースが必要です
例:
expr 1 + 1
expr 1 \* 2
expr 5 % 2
括弧演算: (2+3)*6
コマンド: expr `expr 2 + 3` \* 6
(2) $((圧縮式)) または $[圧縮式]
2 つの計算方法は同じですが、形式が異なり、どちらも括弧演算を直接実行できます。
例如:
echo $((1+1))
echo $((1*2))
echo $((5%2))
echo $(((2+3)*6))
echo $[1+1]
echo $[1*2]
echo $[5%2]
echo $[(2+3)*6]
シェルの条件判断
1. 基本文法
[条件]
注:条件の前後にはスペースが必要です。条件は空でない場合は true、[ abc ] は true を返し、[] は false を返します。
2. 共通の判定条件
(1) 2 つの整数の比較
状態 | 説明 |
---|---|
-lt | 未満 (未満) |
- | 以下 (以下) |
-eq | 等しい(等しい) |
-gt | より大きい |
-ge | 以上 |
- は | 等しくない |
(2) ファイルのパーミッションに応じて判断する
状態 | 説明 |
---|---|
-r | 読み取り権限あり(読み取り) |
-w | 書き込み権限あり(書き込み) |
-バツ | 実行ファイル(実行) |
(3) ファイルの種類による判断
状態 | 説明 |
---|---|
-f | ファイルは存在し、通常のファイルです (読み取り) |
-e | ファイルが存在します (書き込み) |
-d | ファイルが存在し、ディレクトリである (実行) |
シェルのif文
1. 基本的な文法
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注: if と else if の後にはスペースが必要で、[条件] の前にもスペースが必要です
2. テスト
入力スコアが 90 以上の場合、印刷は良好です。スコアが 90 未満、60 以上の場合、印刷は合格、その他の出力は良すぎます。
if.sh スクリプトを作成します: vim /home/my_sh/if.sh
次のように入力します
#!/bin/bash
if [ $1 -ge 90 ]
then
echo 优秀
elif [ $1 -ge 60 ]
then
echo 及格
else
echo 太菜了
fi
プログラムを実行します:
sh /home/my_sh/if.sh 90
sh /home/my_sh/if.sh 70
sh /home/my_sh/if.sh 60
sh /home/my_sh/if.sh 50
シェルのケースステートメント
1. 基本的な文法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
"值3")
如果变量的值等于值1,则执行程序3
;;
*)
如果变量的值都不等于以上的值,则执行该程序
;;
esac
説明:
case が開始され、esac が終了します。
各ブランチは 2 つのセミコロンで終わります
2. テスト
パラメータを入力します
。パラメータが 1 の場合、こんにちは、Zhang San を印刷します。
パラメータが 2 の場合、こんにちは、Li Si を印刷します。
パラメータが 3 の場合、こんにちは、Wang Wu を
印刷します。パラメータがその他の場合、印刷します。あなたは誰ですか
case.sh スクリプトを作成します: vim /home/my_sh/case.sh
次のように入力します:
#!/bin/bash
case $1 in
1)
echo 你好,张三
;;
2)
echo 你好,李四
;;
3)
echo 你好,王五
;;
*)
echo 谁啊你
;;
esac
プログラムを実行します:
sh /home/my_sh/case.sh 1
sh /home/my_sh/case.sh 2
sh /home/my_sh/case.sh 3
sh /home/my_sh/case.sh 4
ステートメント用のシェル
1. 2種類のfor構文
#for循环方法1
for((初始值;循环控制条件;变量变化))
do
程序
done
#for循环方法2
for 变量名 in 集合名
do
程序
done
2.
2 種類の for ループをテストして、1+2+3+...+99+100 の値を見つけます。
for.sh スクリプトを作成します: vim /home/my_sh/for.sh
次のように入力します:
#!/bin/bash
#for循环方法1
sum1=0
sum2=0
for((i=1;i<=100;i++))
do
sum1=$[$sum1+$i]
done
#for循环方法2
for i in {
1..100}
do
sum2=$[$sum2+$i]
done
echo sum1=$sum1
echo sum2=$sum2
実行プログラム:sh /home/my_sh/for.sh
シェルのwhile文
1. 基本的な文法
while [ 条件判断式 ]
do
程序
done
2.
while ループをテストして、1+2+3+...+99+100 の値を見つけます。
while.sh スクリプトを作成します: vim /home/my_sh/while.sh
次のように入力します:
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ]
do
sum=$[$sum+$i]
i=$[$i+1]
done
echo sum=$sum
シェルコンソール入力
1. 基本的な文法
read (オプション) (引数)
オプション:
オプション | 説明 |
---|---|
-p | 値を読み取るときのプロンプトを指定します |
-t | 値を読み取るときに待機する時間を指定します |
パラメータ:
変数: 値を読み取る指定された変数名
2. 例
read.sh スクリプトを作成します: vim /home/my_sh/read.sh
次のように入力します:
#!/bin/bash
read -t 10 -p "请在10秒钟内输入您的姓名 " name
echo 您的名字为 $name
10 秒間入力しないと入力をスキップし、次のコードの実行が継続されることがわかります。
シェルシステムの機能
1. ベース名の基本的な使い方
ベース名 [文字列/パス名] [サフィックス]
注:
(1) Basename コマンドは、最後の '/' 文字を含むすべてのプレフィックスを削除し、文字列の形式で表示します。
(2) suffix はサフィックスです。suffix が指定されている場合は、basename が置き換えられます。パス名または文字列の接尾辞が削除されました
2.ベース名の例は、
/home/mysql/data.txt パスのファイル名をインターセプトします。
コマンド:
ベース名 /home/mysql/data.txt
ベース名 /home/mysql/data.txt .txt
3. dirnameの基本的な使い方
dirnameファイルの絶対パス
説明:
(1) dirname は、絶対パスを含む指定されたファイル名からファイル名を削除し、残りのパスを返します。
3. dirname の例
/home/mysql/data.txt ファイルのパス名をインターセプトします。
コマンド: dirname /home/mysql/data.txt
シェルカスタム関数
1. 基本的な文法
#方式1
function funname
{
Action
return int
}
#方式2
funname()
{
Action
return int
}
2. 説明
(1) 関数を呼び出す前に関数を宣言する必要があり、シェルスクリプトは 1 行ずつ実行されます。他の言語のように最初にコンパイルしません。
(2) 関数の戻り値はシステム変数 $? でのみ取得でき、return を表示できますが、追加しない場合は最後のコマンドの結果が使用されます(0 が正常実行、それ以外が実行エラー)戻り値として。return の後に値 n (0 ~ 255) を続けます
3. テスト
fun 関数は、任意の数のパラメーターを受け取り、パラメーターの合計を求めます。
my_fun.sh スクリプトを作成します: vim /home/my_sh/my_fun.sh
次のように入力します:
#!/bin/bash
function getsum
{
sum=0
for i in $@
do
((sum+=i))
done
return $sum
}
getsum 10 55 20
echo $?
スクリプトを実行します: sh /home/my_sh/my_fun.sh
emsp ; emsp;e m s p ; emsp;ここでは、 return キーワードを使用してすべての数値の合計を返し、 $? を使用してこの値を取得します。この解決策は他のプログラミング言語では問題ありませんが、 Shell では非常に間違っています。シェル関数の値は他のプログラミング言語とは大きく異なり、戻り値 0 はプログラムの実行に例外がなかったことを意味し、それ以外の場合はプログラムの実行が失敗したことを意味します。
emsp ; emsp;e m s p ; emsp; したがって、戻り値はこのように使用されるべきではなく、データは関数内で直接出力できます。
my_fun.sh スクリプトを編集します: vim /home/my_sh/my_fun.sh
次のように入力します:
#!/bin/bash
function getsum
{
sum=0
for i in $@
do
((sum+=i))
done
echo sum=$sum
}
getsum 10 55 20
echo 返回值=$?
スクリプトを実行します: sh /home/my_sh/my_fun.sh
シェルツール——カット
カットとは切るという意味で、データをカットするツールです。Cut コマンドは、ファイルの各行からバイト、文字、およびフィールドを切り取り、これらのバイト、文字、およびフィールドを出力します。
1. 基本的な使い方
cut[オプションパラメータ]ファイル名
パラメータ | 関数 |
---|---|
-f | シンボル、最初の数列を抽出 |
-d | 区切り文字、指定された区切り文字に従って列を分割します |
2. データの準備
data.txt データを作成します: vim /home/my_sh/data.txt
次のように入力します。
ni hao a
hello world !
shen zhen guan
3. テスト
コマンド:
cut -d " " -f 1 /home/my_sh/data.txt
Cut -d " " -f 1,2 /home/my_sh/data.txt
Cut -d " " -f 1,3 /ホーム/my_sh/data.txt
シェルツール - Sed
Sed はストリームエディタであり、一度に 1 行のコンテンツを処理します。処理中、現在処理されている行を「パターン スペース」と呼ばれる一時バッファに保存し、sed コマンドを使用してそのコンテンツを処理します。最後にバッファの内容を画面に送信します。次に、次の行を処理し、ファイルの終わりまで繰り返します。リダイレクトされたストレージ出力が使用されない限り、ファイルの内容は変更されません。
1. 基本的な使い方
sed [オプションパラメータ] 'コマンド' ファイル名
オプションパラメータ:
パラメータ | 関数 |
---|---|
-e | コマンドラインモードで直接編集する sed アクション |
コマンド機能の説明:
注文 | 機能説明 |
---|---|
ある | 新たに追加された文字列の後には a を付けることができ、その前に数字を接続することができます。つまり、何行目の後に文字列を追加することになります。 |
d | 消去 |
s | 見つけて置き換える |
2. テスト
(1) 2行目の後に「にをた」を追加
sed "2a ni wo ta" /home/my_sh/data.txt
(2) helloを含む行を削除
sed "/hello/d" /home/my_sh/data.txt
(3) テキスト内のすべての hello を hi に置き換えます。
sed "s/hello/hi/g" /home/my_sh/data.txt
g は global (グローバルを意味します)
(4) 最初の行を削除し、テキスト内のすべての hello を hi に置き換えます。
sed -e "1d" -e "s/hello/hi/g" /home/my_sh/data.txt
複数のストリーム コマンドを実行するには -e を使用します
シェルツール - Awk
ファイルを 1 行ずつ読み取り、デフォルトの区切り文字としてスペースを使用し、各行をスライスして、切り取られた部分を分析および処理する強力なテキスト分析ツールです。
1. 基本構文
awk [オプションパラメータ] 'pattern1{action1} pattern2{action2}…' ファイル名
pattern: AWK がデータ内で何を探しているかを示します。これは一致するパターンです。
action: 一致するコンテンツが見つかったときに実行される一連のコマンドです。
パラメータ | 関数 |
---|---|
-F | 入力ファイルの区切り文字を指定します |
-v | ユーザー定義変数に値を代入する |
2. テスト
(0) ファイル内の ni で始まるすべての行を検索し、その行の 1 列目と 3 列目を「,」で区切って出力します。
awk '/^ni/{print $1","$3}' /home/my_sh/data.txt
^ni は正規表現で、ni で始まることを意味します。
(2) 1行目と3行目を表示し、1行目に「へいへい」、最後の行に「はは」を追加します。
awk 'BEGIN{print "hei hei"} {print $1,$3} END{print "ha ha"}' /home/my_sh/data.txt
BEGIN、ENDは先頭行、最終行
3、awkの組み込み変数を指定可能
変数 | 説明する |
---|---|
ファイル名 | ファイル名 |
NR | 読み取られたレコードの数 |
NF | カット後の列数 |
(1) data.txtファイルのファイル名、行番号、列番号をカウントします。
awk '{print "文件名:" FILENAME ", 行号:" NR ", 列数:" NF}' /home/my_sh/data.txt
シェルツール——並べ替え
sort コマンドは非常に一般的に使用され、その機能はファイルの内容の出力を並べ替えることです。
1. 基本的な文法
ソート (オプション) ファイル名
オプション | 説明する |
---|---|
-n | 数値の小さいものから大きいものまで並べ替えます |
-r | 逆順に並べ替える |
-t | ソート時に使用する区切り文字を設定します |
-k | ソートする列を指定します |
2. テスト
(1) data.txt ファイルは、各行の最初の列によって小さいものから大きいものまでソートされます。
sort /home/my_sh/data.txt
デフォルトでは区切り文字はスペースです
(2) data.txt ファイルは、各行の 3 列目で大きいものから小さいものの順に並べ替えられます。
sort -rk 3 /home/my_sh/data.txt
分けて書くことも可能です
sort -r -k 3 /home/my_sh/data.txt
シェルのインタビューでの質問
(1) Linux コマンドを使用して、file.txt の空白行の行番号を問い合わせます。
awk '/^$/{print NR}' file.txt
(2) ファイル chengji.txt の内容は次のとおりです。
张三 20
李四 40
王五 40
統計の 2 番目の列の合計
cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'
(3) シェルスクリプトがファイルの存在を判定する
#!/bin/bash
if [ -f $1 ]
then
echo "文件存在"
else
echo "文件不存在"
fi
(4) 指定された文字列変数 = "User:123:321:/home/dir" の場合、echo コマンドのみで home_dir を取得するにはどうすればよいですか?
#方式1
echo ${variable#*:*:*:}
#方式2
echo ${variable##*:}
(5) 3の倍数(0 3 6 9 ...)を0~100の数値で出力するコマンドを記述します。
#方式1
for i in {
0..100..3}; do echo $i; done
#方式2
for (( i=0; i<=100; i=i+3 )); do echo $i;done
良いと思ったらいいね!