ホームページ >運用・保守 >Linuxの運用と保守 >シェルとは何ですか?一般的な種類のシェルの紹介

シェルとは何ですか?一般的な種類のシェルの紹介

零下一度
零下一度オリジナル
2017-06-30 15:50:187050ブラウズ
1. 概要
3. 操作ツール
5. for ループ
1. はじめに
1. シェルとは
シェルは、ユーザーがシステムと対話するためのインターフェイスです。シェルはコマンド インタプリタであり、高級プログラミング言語です
2. シェルの一般的な種類
Bourne Shell (/usr/bin/sh または /bin/sh)
Bourne Again Shell (/bin /bash)
C シェル (/usr/bin/csh)
K シェル (/usr/bin/ksh)
ルート用シェル (/sbin/sh)
その中で: Bash は日常業務で広く使用されています。
同時に、Bash はほとんどの Linux システムのデフォルトのシェルでもあります。
3. シェルの制限事項
1.1. 大量のリソースを必要とするタスク、特に高い実行速度を必要とするタスク1.2大量の数学的計算を伴う
1.3.、主要なアプリケーション(データベース、Webサイトなど)
1.4.、グラフィックスまたはGUIアプリケーションの設計
1.5.、ハードウェアへの直接アクセスを必要とする
1.6.、クローズドな開発ソース アプリケーション (オープン ソースとの比較)
4. 基本的な
ファイル システム: Linux ファイル システムは、ディレクトリとファイルを含む階層構造です。最上位のものはルート ディレクトリ (ルート ディレクトリ) と呼ばれます。斜体のバー/は、
ディレクトリ: ディレクトリエントリを含むファイルであり、各ディレクトリエントリにはファイル名が含まれます
ファイル名: ディレクトリの内容はディレクトリエントリと呼ばれ、ディレクトリエントリには次の内容が含まれますファイル名には、スラッシュとヌル文字 (ASCII 値は 0) の 2 文字のみを使用できます。スラッシュはパス内のファイル名を区切るために使用され、ヌル文字はパスの終わりを示すために使用されます。 。ファイル名の長さは通常 255 文字に達します
パス: スラッシュで区切られた一連のファイル名は、ファイルの場所を示すために使用されます。スラッシュは絶対パスと呼ばれます。それ以外の場合は、現在の作業ディレクトリからの相対パスです
戻り値: すべてのコマンドには 0 ~ 255 の整数で表される戻り値があります。スクリプトはコマンドであり、さらに、スクリプト内の関数にも戻り値があります
。スクリプトを終了する正式な方法 この方法は、次のように exit [code] コマンドを使用して終了します。 exit $?
2. read
1.これは、C 言語の scanf に似た、主にパラメーターの割り当てを完了する組み込みコマンドです。
変数だけでなく、配列も割り当てることができます
入力は画面だけでなくファイル記述子でもあります
2. 実際の操作
# read a - -Input a string and assign the string to variable a; # echo $a
hello world!!
# read name sex age -- で 3 つの変数に値を代入します同時に、入力区切り文字はデフォルトでスペース文字になります
zhangsan men 50
# unset name sex age -- 変数を削除します
# IFS=';' -- read の入力区切り文字を ';' に変更します
# vim test.sh
#!/bin/bash
prompt="名前を入力してください:"
read -p "$prompt" name
echo "Greetings $name"
3.操作ツール
1. 簡単な数学演算
# echo $((1+2**2-3*4/5%6)) -- 計算結果を画面に出力
# a=$ ((1+2**2-3*4/5%6) ) -- 計算結果を変数 a
#に代入します ((a=1+2**2-3*4/5%6) ) --上記と同じ
# echo "scale=3;10/3" | bc --bc calculator; 小数点以下 3 桁を維持します
# echo "2^10" bc --bc calculator; 10 乗
# awk 'BEGIN{print 1/3}' -- awk の計算
2. 乱数を取得します
# od -N4 -tu4 /dev/urandom | sed -n '1s/.* //p' --7桁の数値を取得
# od - Ad -w24 -tu4 /dev/urandom --乱数を取得
# od -tu8 /dev/urandom --乱数を取得
# od -tu8 /dev/urandom | sed -r 's/^[0-9]+s+//' |cut -b1-8 |sed -r -n '/^.{8}$/p' | sed 's/^/186/' |head -n5000 |vi - --10,000 件の電話番号を取得します
# od -N40000 -tu4 /dev/urandom | -r 's/^[0-9]+(s+)?//' | sed -r 's/s+/n/g' | grep -vE '^s*$' > 10,000 を生成乱数
# sed -r -n '/^.{8}$/p' 10k_random | sed 's/^/186/' > シーケンスを取得します。
# seq 10 --1 ~ 10 を取得します# seq 1 2 10 --1 ~ 10 を取得、ステップ サイズは 2 です
# seq 10 100 --10 ~ 100 を取得します
# seq 10 -1 1 - - 逆の順序、10 から 1
IV. if/then の例
1. 文字 "a" が "A" に等しいかどうかを判断します
# vim test.sh#!/ bin/ bash
if [[ "a" = "A" ]] then
if [ "a" = "A" ] then
echo "a = "A"else
echo " a no = A"
fi
2. /root/test/test.sh が存在し、実行権限があるかどうかを確認します
# vim test.sh#!/bin/bash
if test -x /root/test/test.sh;then
echo "/root/test/test.sh は実行可能です"
fi
3. システムに root ユーザーが存在するかどうかを確認します。
# vim test .sh
#!/bin/bash
if grep -E --color=auto ^root: /etc/passwd; then
echo "ユーザー root が存在します"
fi
4. ファイルの種類を決定します
# vim test.sh
#!/bin/bash
function isSymbolicLink() {
file=$1
flag=$(ls -ld $file |cut -b1)
test "$flag" = "1"
return $?
}
file=$1
if isSymbolicLink $ファイル; then
エコー「シンボリックリンク」
elif test -d $file; then
エコー「ディレクトリファイル」
elif test -f $file then
echo「通常のファイル」
elif test - b $file; then
echo "ブロック特別"
elif test -c $file; then
echo "文字特別"
elif test -p $file then
echo "名前付きパイプ"
elif test -S $file; then
echo "Socket"
else
echo "Unkown"
fi
5. vim test.sh
#!/bin /bash
num=$1
if test "$num" -lt 10 ;then
echo "小さい数値"
elif test "$num" -lt 20;then
echo "中程度の数値"
elif test " $num" -lt 30;then
echo "大きな数値"
else
echo "非常に大きな数値"
fi
6に従って、標準入力から数値を取得し、指定された文字列を出力します。そのサイズ
# vim test.sh
#!/bin/bash
echo -n "数字を入力してください: "
read num
if [ "$num" -lt 100 ]; then
echo "100 未満"
elif [ "$num" -ge 100 -a "$num" -lt 200 ]; then
echo "より大きい100 以上 200 未満"
elif [ "$num" -ge 200 -a "$num" -lt 300 ]; then
echo "200 以上 300 未満"
else
echo "その他の数値"
fi
5. wihle ループ
1.
を理解する 条件が true の場合、プログラムはコマンドのリターン コードをテストします。 while ループ本体の命令 0 は true です。ループ本体は次のとおりです。
while [] --while そして [ ] コマンドを実行し、[ ] コマンドの戻りコードをテストします
cat /filename while read line --while and then読み取りコマンドを実行し、読み取りコマンドのリターン コードをテストします。 リターン コード
do
....
done
2. ループ制御ステートメント
continue -- 現在のループを終了し、次のループを開始します。 one
break -- 現在のループを終了して終了します ループ本体
exit -- 現在のスクリプトを終了します
3. 例
# vim test.sh -- continue と Break の違いを区別します
#!/bin/bash
while true
do
sleep 1
echo test
continue/break
echo
done
# vim test.sh --break と の違いを区別するexit
#!/bin/bash
while test - e /data/test/test.sh
do
echo "exists"
sleep 1
break/exit
done
echo "loop end"
# vim test.sh -- 指定したパスが見つかるまで探します
# !/bin/bash
if test $# -ne 1;then
echo "wrong paraneter" >&2
exit
fi
path=$1
while test ! do
sleep 1
echo "don't found!!!"
done
echo "found"
# vim test.sh
-- スクリプトは指定された時間だけ実行され、時間が経過すると終了します; s
#!/bin/bash
if test $# -ne 1;then
echo "Usage: $(basename $0) TIME" >&2
exit 1
fi
timeLength =$1
beginTime=$(date +%s)
endTime=$(( $beginTime + $timeLength ))
--------------------- -- ----------------------------------
テスト中 $(date +%s) -lt " $endTime "
do
echo "処理中...."
スリープ1
完了
---------------------- - ----------------------------------
while true
do
if test $(date + %s) - ge "$endTime";then
break
fi
echo "processing...."
sleep 1
done
------------------------------------------------- --------
echo "time out"
# vim test.sh --ファイルの各行をループし、各行の文字数をカウントします
#!/bin/bash
file=$1
------------------------------------------ ------ ---------------
totalLines=$(wc -l < $file)
line=1
while test $line -le $totalLines
do
lineData= $(sed -n "${line}p" $file)
len=$(echo -n $lineData | wc -c)
echo "line ${line}: $len "
line=$( ( $line + 1 ))
完了
---------------------------- ---------- ------------------
line=1
while read lineData
do
len=$(echo $lineData | wc -c)
echo "line ${line}: $len"
line=$(( $line + 1 ))
done < $file
---------------------------------------------------- -
# vim test.sh -- hello world; <(seq 10) はプロセス置換
#!/bin/bash
の読み取り中に 10 行を出力します。
do
「hello world」をエコー
done <<(seq 10)
------------------------------------- -------- -----------------------
n=1
while [ $n -le 10 ]
do
「hello world」をエコーし​​ます
n=$((n+1))
完了
------------------------------------- -------- -----------------------
# vim test.sh -- 無限ループを作成し、1 分間実行した後にループが自動的に終了するように要求します
#!/bin/bash
start_time=$(date +%s)
while true
do
cur_time=$(date +%s)
test $((cur_time - start_time)) -ge 10 && Break
time=$((cur_time - start_time))
echo "時間は $time です。 . ...."
sleep 1
done
# vim test.sh -- まず while ループを使用して 100 個の .txt ファイルを作成し、次にすべてのファイルのサフィックスを .html
# に変更します。 /bin /bash
count=100
-------------------------------------- -- ----------------
seq $count | 読み取り中 i
do
${i}.txt
done
ls -1 *.txt | 読み取り中 oldname
do
newname=$(echo $oldname | sed 's/.txt$/.html/')
mv $oldname $newname
---- -------------------------------------------------- -- -
読みながら i
do
${i}.txt
done < <( seq $count )
読みながら oldname
do
newname=$(echo $ oldname | sed 's/.txt$/.html/')
mv $oldname $newname
done <(ls -1 *.txt )
# vim test.sh
--計算1000 パイプは num
do の読み取り中にサブプロセスを生成するため、パイプ内の偶数の合計は使用できません。
sum=$(( $sum + $num ))
done < <(seq 2 2 998)
echo "sum: $sum "
# vim test.sh --100 件のメールを一括追加ユーザー、ユーザー名は u1 ~ u100、パスワードは abc、ログイン シェルは /sbin/nologin、メール グループ
#!/bin/bash
password=abc
group=email
grep -Eq にのみ属します。 " ^${group}:" /etc/group || 読み取り中 i
do
useradd u${i} -N -g $group -s /sbin/nologin
passwd u$ { i} --stdin <<< "$password"
done < <(seq 100)
# vim test.sh
-- 作成した 100 人のメール ユーザーをバッチで削除します
# ! /bin/bash
while read i
do
userdel -r u${i}
done < 開いた文字列から一度に 1 つずつ取り出し、完了するとループが終了します。
毎回取り出した文字列は変数に保存され、ループ本体内で使用できます
区切り文字による分割された文字列は以下の方法で提供できます:
1. ループする文字列を手動で入力します。指定された回数
# vim test.sh
#!/bin/bash
for i in 1 2 3
do
echo $i
don
2。変数
# vim test.sh
#!/bin/bash
FILES="/bin/bash /bin /ls /bin/cat"
$FILES のファイル用
do
echo $ファイル
完了
3. プログラムで生成された文字列
# vim test.sh
#!/bin/bash
for n in $(seq 11)
echo $n
完了
4. シェル拡張によって生成され、ディレクトリ内のファイルをループします
# vim test.sh
#!/bin/bash
for f in /etc/init.d/*
do
echo $f
done
# vim test.sh
5. /dev
# vim test.sh
#!/bin/ bash
の下にあるloopで始まるすべてのファイルのファイル名を出力します。
for file in /dev/loop*
do
echo $(basename $file)
done
6. 1000以内の偶数の合計を計算します
# vim test.sh
#!/ bin/bash
sum=0
for number in $(seq 2 2 998)
do
sum=$(( $sum + $number ))
done
echo "total: $ sum"
7. 100 人の電子メール ユーザーを一括で追加します。ユーザー名は u1 から u10、パスワードは abc、ログイン シェルは /sbin/nologin で、電子メール グループのみに属します
# vim test.sh
#!/ bin/bash
function checkGid() {
gid=$1
if ! grep -qE "^$gid:" /etc/groupadd $gid
fi
}
関数 isRoot( ) {
id=$(id | awk -F "[=(]" '{print $2}')
if test "$id" -ne 0; then
echo "must be root" >&2
exit 1
fi
}
count=10
namePrefix=u
password=abc
shell=/sbin/nologin
gid=email
isRoot
checkGid $gid
$( の数値seq $count)
do
name=${namePrefix}${num}
useradd $name -s $shell -g $gid &> /dev/null
if test $?ne 0;
echo "$name の作成に失敗しました" >&2
else
echo "$name"
echo "$password --stdin $name" &> /dev/null
if テスト$? -ne 0; then
echo "$name のパスワードの変更に失敗しました" >&2
else
echo "パスワードが正常に変更されました -- $name"
fi
fi
完了
8 , LAN内のすべてのコンピューターのIPアドレスとMACアドレスの対応表を取得します
# vim test.sh
#!/bin/bash
ipPrefix=192.168.1.
startIp=1
endIp=254
for num in $(seq $startIp $endIp)
do
ip=${ipPrefix}$num
ping -W1 -c1 $ip &>/dev/null &
done
wait
arp - n '/incomplete/d' | awk '{print $1,$3}' '.' -k4,4 |
9. 乗算表を出力します
# vim test.sh
#!/bin/bash
for row in $(seq 9)
do
forcol in $(seq $row)
do
echo -n "${col}x${row}=$(( $col * $row )) "
done
echo
done | 簡単な計算 デバイス
#!/bin/bash
varnum=3
if test "$#" -ne "$varnum"; then
echo "間違った引数" >&2
exit 1
fi
num1 =$1
num2=$3
operator=$2
if test "$operator" = "x";then
operator="*"
fi
if test "$operator" = "/" - a "$num2" = 0; then
echo "0 による除算" >& 2
exit 1
fi
result=$(( $num1 $operator $num2 ))
echo "$result"
注: 乗算処理; 被除数が 0 の場合の処理​​
11. 指定されたディレクトリ内の特定のファイルを指定されたディレクトリにコピーします。 要件:
#1. コマンドラインから 2 つのパラメーターを受け取ります。ソース ディレクトリとターゲット ディレクトリをそれぞれ
#2。ソース ディレクトリが存在しない場合は、エラーが報告されます
#3。ターゲット ディレクトリが存在しない場合は、ターゲット ディレクトリを作成します
#4。ただし、ディレクトリではなく、単なるエラー レポートです
#5。通常のファイルとソフト リンク ファイルのみをコピーします
#6。通常のファイルの場合は、サイズが 1M 未満のファイルのみをコピーします
# vim /test.sh
# !/bin/bash
function displayHelp()
{
echo "使用法: $(basename $0) SRCDIR DSTDIR"
}
function getSize()
{
file=$1
size=$(ls -l $file | awk '{print $5}')
echo $size
}
if test $# -ne 2;次に
displayHelp >&2
exit 1
fi
srcdir=$1
dstdir=$2
if test! -d "$srcdir"; then
echo "$srcdir が存在しないか、ディレクトリではありません" >&2
exit 1
fi
if test ! -e "$dstdir"; then
mkdir "$dstdir"
fi
ifテスト! -d "$dstdir"; then
echo "$dstdir はディレクトリではありません" >&2
exit 1
fi
for file in $srcdir/*
do
if test -L $file; then
cp -a $file $dstdir/
elif test -f $file;それでは
----------------------------------------------- ----
size=$(getSize $file)
if test "$size" -lt 1048576; then
cp -a $file $dstdir/
fi
--------------------------------- ----------
find $file -type f -size -1024k -exec cp -a {} $dstdir/ ;
-------- ---------------------------------------
fi
完了

以上がシェルとは何ですか?一般的な種類のシェルの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。