Linux4:シェルプログラミング(シェルの概念、変数、入力と出力、演算子、式、条件付きテスト、フロー制御、配列、関数)

シェルプログラミング(シェル、変数、入力と出力、演算子、式、条件付きテスト、フロー制御、配列、関数の概念)

アプリケーションシェルコマンドインタープリター-カーネル-ハードウェア

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ソフトウェアを使用する必要があります

おすすめ

転載: blog.csdn.net/weixin_40734514/article/details/108947860