シェルプログラミング(シェル、変数、入力と出力、演算子、式、条件付きテスト、フロー制御、配列、関数の概念)
アプリケーションシェルコマンドインタープリター-カーネル-ハードウェア
1.シェルの概念:
シェルは解釈されたスクリプト言語です。スクリプトはコンパイルする必要がなく、コマンドをバッチで処理できる言語です。
定義:
解釈スクリプト言語、バッチ処理コマンドの使用。Windowsの下の.datファイルと同様に、Linuxカーネルの外部保護ツールであり、ユーザーとカーネル間の対話を担当します。
ルール:
シェルファイルを作成する:
Vim gedit touch…
シェルファイルのサフィックスは次のとおりです。.sh
シェルは、独自の書き込みルールを持つ言語です。
動作環境設定:
第一行
#!/bin/bash //声明shell类型 bash shell
或者
#!/bin/sh
スクリプトステートメントの記述:
シェルコマンド(if-else)+システムコマンド(ls cd cp…)
コメント行は#で始まります
実行可能セット:
作成するシェルスクリプトにはデフォルトで実行権限がないため、設定する必要があります
chmod + x xx.sh
分析方法xx.sh
スクリプトファイルを実行する:
./xx.sh
.xx.shに
は、実行権限が必要です
2.変数について
シェル内の変数はタイプに分割されず、直接定義され、直接使用されます。
使用する場合は、次を追加します。$
変数定義:
直接定义 str=hello //等号两端不能有空格
双引号定义 str="hello"//保留特殊字符的含义
单引号定义 str = 'hello' //去除特殊字符的含义
vim 1.sh
#!/bin/bash
str1="hello"
str=hello
echo str
echo "$str1"
echo '$str1'
chmod 777 1.sh
./1.sh
動作結果: *
説明:$:参照。二重引用符で囲んだ場合でも引用符として機能し、一重引用符で囲んだ場合は削除することを意味します。
小飘号定义str=`date` 或则 str=$(date)
:用来引用系统指令
#!/bin/bash
str1="hello"
str=hello
str2=$(date)
echo "$str2"
echo str
echo "$str1"
echo '$str1'
ls
pwd
動作結果:
**变量的引用**
类似于命令的重定向(命令运行结果重定向到变量内)
命令重定向
>输出重定向(覆盖原内容)
echo hello >1.txt
>>输出重定向(不覆盖原内容,追加)
echo world >>1.txt
変数の分類
自定义变量
自己定义,自己使用
特殊变量
$0 命令本身
$1 $2 ....$n //取命令行参数
$@//取所有的参数
不包括第0个
$? //判断上一条命令是否执行成功,成功打印0 失败打印非0
$#//传递参数的个数
$$//显示当前的进程号
#!/bin/bash
echo "$0" #显示命令本身
echo "$1" #取命令行参数
echo "$2" #取命令行参数
echo "$@" #取所有参数,不包括第0个
echo "$?" #判断上一条命令是否执行成功,成功打印0
echo "$#" #传递参数的个数
echo "$$" #显示当前的进程号
結果を表示:
环境变量
定义
由系统维护,用于设置系统的shell工作环境,极少数用户可以修改
示例
执行命令的时候,就会去指定的目录(bin、sbin、usr/bin)去寻找是否有这个命令
运行程序的时候去指定的路径(lib、usr/lib)加载库文件
操作
env //显示所有环境变量
HOSTNAME:当前主机名
SHELL:shell类型
QTDIR:qt安装路径
USER:当前用户
PATH:指定当前命令寻找路径
==========================================================
设置环境变量
export PATH=$PATH:/root //将root路径添加PATH环境变量里面(重启后失效)(设置shell脚本路径)
将这句话加入到开机自启动的文件里面即可永久生效
/root/.bashrc
/etc/profile(推荐)
/etc/inittab
/etc/rcs
修改
export LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH(设置动态库路径,这样就不用将动态库复制到/usr/lib里了 LD_LIBRARY_PATH: 动态库的查找路径)
注意
变量都是字符串,没有类型之分,不用声明
3.入力と出力
入力
読み取りNUM //入力NUM
読み取り専用NUM = 5 //定義読み取り専用変数numと
出力
エコーコマンド
のprintf
参照コード:
#!/bin/bash
echo "qing shu ru shu:\n"
read num
echo $num
readonly n=100
echo $n
結果を表示:
3.演算子と式
演算子
算術演算子、論理演算子、割り当て演算子など。
加算、減算、乗算、除算、およびNOR
式を計算する4つの方法
var = $((1 + 2))
var = $ [1 + 2]
var = 1 +2とします
var = $(expr 1 + 2)
注:演算子の前後にスペースを追加してください
4.状態テスト
文法
テスト条件式:
テスト式1 =式2
等符号の両側にスペースが必要です
teststring1 = string2
[条件式]
[string1 = string2]
注意
条件式の値がtrueの場合、0を返し、falseの場合、ゼロ以外の
エコーを返します$?
ゼロ以外の場合、0はtrue
です。条件式の両側にスペースが必要です。
整数を
判断します-gt:
テスト1よりも大きい-gt2または1と省略されます-gt2
echo $?
1は偽、0は真です
-ge:以上
-eq:等しい
-le:以下
-lt:より小さい
-ne:等しくない
判定式
-a:両方の条件が満たされている
----------および
-o:一方の条件のみが満たされている
----------または
文字列の比較
[[-z $ str]] //長さは0、戻り値0
[[$ str1 == $ str2]] //等しいかどうかの判断
[[$ str1!= $ str2]]
ファイル状態テスト
-f-L -d -e
-w -r -x
5.プロセス制御
その後、他の場合は
、[条件1]があれば
、その後
1つのコマンド
のelif [条件2]を
、その後
2命じる
...
他の
コマンドのn
Fiを提供して
#!/bin/bash
echo "请输入1-7的整数"
read num
if [ $num == 1 ]
then
echo "今天星期一"
elif [ $num == 2 ]
then
echo "今天星期二"
else
echo "输入错误"
fi
case
case $ variable in
“ 1”)
command 1
;;
“ 2”)
command 2
;;
esac
#!/bin/bash
echo "请输入1-7的整数"
read num
case $num in
"1")
echo "今天星期一"
;;
"2")
echo "今天星期二"
;;
*)
echo "输入错误"
;;
esac
以下のための
フォーム1
、リスト内のxの
ない
コマンドが
行われ
#!/bin/bash
for x in 1 2 3 4 5
do
echo "hello world"
done
seqコマンド:
`seq 1 10` #执行10次
フォーム2for
((i = 0; i <5; i ++))
do
ステートメント
done
#!/bin/bash
for x in `seq 1 10` #小撇号作用:引用系统指令
do
echo "hello world"
done
別の書き方:
#!/bin/bash
for((i=0;i<5;i++))
do
echo "hello world"
done
while
[loop condition]
do
command
done
#!/bin/bash
echo "请输入整数"
read num
while [ $num -lt 10 ]
do
echo "hello"
num=$(($num+1))
done
補足:
無限ループを終了する
方法:方法1:
ctrl+c
方法2:
ps -ef //查看当前进程
找到进程号
kill -9 30312 //杀死进程
条件付き
do
コマンドが
完了するまで
#!/bin/bash
echo "请输入整数" //大于10
read num
until [$num -lt 10]
do
echo "hello"
num=$(($num-1))
done
休憩続行
#!/bin/bash
for ((i=0;i<5;i++))
do
echo "hello world" //打印4次
if (($i==3))
then
break //continue打印5次
fi
done
6.アレイ
定義
定義1:a =(1 2 3 4 5)添え字は0から始まり、各データはスペースで区切られます。
定義2:a [0] = 1; a [1] = 2; a [2] =
3定義3 :A =([1] = 1 [2] = 2)
見積もり
値:$ {a [0]}
$ {a [@]} //配列内のすべての値を取得
$ {#a [@]} //配列の長さを取得
$ {a [@]:2} //インターセプトすべての要素添字2とし、後
$ {[@]:2:2} //インターセプト2つの要素添字2とし、後
#!/bin/bash
a=(1 2 3 4 5 6)
echo ${
a[0]} //打印1
echo ${
a[@]} //1 2 3 4 5 6
echo ${
#a[@]} //6
echo ${
a[@]:2} // 3 4 5 6
echo ${
a[@]:2:2} // 3 4
7.機能
コードをカプセル化するために、呼び出すときに関数名を書き込むだけで、戻り値もパラメーターもありません。function_name
()
{}
#!/bin/bash
fun()
{
echo "hello"
}
fun
8.シェルプログラミングの適用:
8.1、現在のパスにあるすべての.cファイルを検索します。
#!/bin/bash
#简化版的查找.c文件的shell脚本
#寻找.c文件的函数(function )
findcfile()
{
#找到以.c结尾的文件,文件名列表存放在变量cfilelist里边
cfilelist=$(ls | grep '.c$')
#通过for循环显示文件路径以及文件名
for cfilename in $cfilelist
do
echo $(pwd)/$cfilename
done
}
#调用函数实现查找
echo "当前路径下的.c文件有:"
findcfile
現在のパスにあるすべての.cファイルを見つけることができます。
8.2。現在のパスとフォルダーにあるすべての.cファイルを見つけます。
#!/bin/bash
#完整版的查找.c文件的shell脚本,可以进入文件夹
#判断通过参数传递的文件夹是否存在,是否为空
if [[ -z $1 ]] || [[ ! -e $1 ]]
then
#如果没有传递文件夹,就在当前目录下寻找
echo "The directory is empty or not exist!"
echo "It will use the current directory."
newdir=$(pwd) //引用当前路径给变量
echo "当前所在路径是:"
echo $newdir
echo "这个路径下.c文件有:"
else
#如果传递的有文件夹,进入传递的文件夹,开始寻找
cd $1
newdir=$(pwd)
echo "当前所在路径是:"
echo $newdir
echo "这个路径下.c文件有:"
fi
#递归寻找.c文件的函数
findcfile()
{
#找到以.c结尾的文件,文件名列表放存在变量cfilelist里边
cfilelist=$(ls | grep '.c$')
#通过for循环显示文件路径以及文件名
for cfilename in $cfilelist
do
echo $(pwd)/$cfilename
done
#遍历该目录,当判断其为目录的时候,进入目录,调用该函数,实现递归
dirlist=$(ls)
for dirname in $dirlist
do
if [ -d $dirname ]
then
cd $dirname
findcfile
cd .. //返回上层目录
fi
done
}
#调用递归函数实现查找
findcfile
すべての.cファイルを印刷できます。
参照構造のフローチャート:
シェルプログラミング
注:表示するには、xmindソフトウェアを使用する必要があります