day30 Linux 03 shell编程


I know, i know
地球另一端有你陪我




shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

Shell是用户与Linux操作系统沟通的桥梁

1、脚本

如何创建
执行文件后缀为 .sh

	vim fgh.sh

文件头为:#!/bin/bash
或:#!/bin/sh

如何运行
1、bash fgh.sh

2、sh fgh.sh

3、文件修改为可执行文件后(不可直接执行)
    ./fgh.sh

2、命令

1、输出

      echo “输出内容”

	echo "helloworld"
	输出结果:helloworld

2、普通变量

变量不需要声明,初始化不需要指定类型,均为 String 类型
变量命名
1:只能使用数字,字母和下划线,且不能以数字开头
2:变量名区分大小写
3:建议变量的名称要通俗易懂
注意:变量赋值是通过等号(=)进行赋值,在变量、等号和值之间不能出现空格
显示变量值使用echo命令,加上$变量名,也可以使用${变量名}

	f=1 g=2 h=3
	echo fgh
	echo $fgh
	echo $f$g$h
	echo ${
    
    f}${
    
    g}${
    
    h}
	echo ${
    
    f}and${
    
    g}or${
    
    h}
	输出结果:fgh        //无法直接识别变量名
					   //此处会匹配变量 fgh,但实际上并无
			123        //正确格式
			123        //正确格式
			1and2or3   //混合显示格式

3、位置变量

是 shell 中预置的变量,类似函数中的形参,可以在调用函数时赋值
$1,$2,…${10}…
赋值方法:fgh.sh 1 2 3 …
$0:固定脚本自身,类似静态变量
$1:脚本的第一个参数
$2:脚本的第二个参数

	echo "$0"
	echo "$1"
	echo "$2"
	echo "$3"
	echo "$10"
	echo "${10}"
	echo "${*}"
	echo "${#}"
 sh fun3.sh a b c d e f g h i j k l
	输出结果:fun3.sh                         //$0 的结果
			a                               //$1
			b                               //$2
			c                               //$3    之后数据会被保存于对应位置变量
			a0                              //$10 = $1 + "0"
			j                               //想要正确对应,需要使用大括号
			a b c d e f g h i j k l         //* 输出全部变量
			12                              //# 显示个数,不包括 $0

4、字符串操作

单引号:变量,转义符等均转换为字符串
双引号:允许变量和转义符的存在
作为引用符号时,二者均必须成对存在

	fgh=123
	echo 'fgh' '${fgh}' '"'
	echo "fgh" "${fgh}" "'" "\"'${fgh}'\""
	输出结果:	fgh ${fgh} ' "'123'"
				fgh 123 " 

字符串长度

	fgh="abcd"
	echo ${
    
    #fgh}    
	输出结果:4

字符串截取

	${字符串:值1:值2}
	值1代表起始下标,值2代表截取长度
	fgh="abcd1234"
	echo ${
    
    fgh:2:4}
	输出结果:cd12

字符串替换

	${字符串/旧字符串1/新字符串2}     替换单个
	${字符串//旧字符串1/新字符串2}    替换多个
	替换后原字符串不会发生改变
	fgh=abcdabcd1234
	echo ${
    
    fgh/abcd/1234}
	echo ${
    
    fgh//abcd/1234}
	a=${
    
    fgh/1234/abcd}
	echo ${
    
    fgh}
	echo ${
    
    a}
	输出结果:	1234abcd1234             //替换单个
				123412341234             //替换多个
				abcdabcd1234             //原字符串不改变
				abcdabcdabcd             //可以用新字符串接收

字符串删除

	${字符串#表达式}       从头开始匹配一次
	${字符串##表达式}      从头开始匹配最后一个
	${字符串%表达式}       从尾开始匹配一次
	${字符串%%表达式}      从尾开始匹配最后一次
    删除后原字符串不会发生改变
	fgh=abcabc123123
	echo 'fgh =' ${
    
    fgh}
	echo '#*abc:' ${
    
    fgh#*abc}
	echo "##*abc:" ${
    
    fgh##*abc}
	echo '%123*:' ${
    
    fgh%123*}
	echo '%%123*:' ${
    
    fgh%%123*}
	输出结果:	fgh = abcabc123123
				#*abc: abc123123       //左起匹配单个
				##*abc: 123123         //左起匹配最后一个
				%123*: abcabc123	   //右起匹配单个
				%%123*: abcabc         //右起匹配最后一个

5、基本运算符

	a=1 b=2
	echo '2+2 =' `expr 2+2`
	echo '2 + 2 =' `expr 2 + 2`
	echo 'b/a =' `expr ${
    
    b} / ${
    
    a}`
	echo '2+2 =' $[2+2]
	echo 'a+b =' $[a+b]

	echo '1>2' $[1>2]
	echo '1<2' $[1<2]

	echo '3>2 & 4>3' $[3>2 & 4>3]
	echo '![3>2 | 4>3]' $[!$[3>2 | 4>3]]

	输出结果:	2+2 = 2+2		// expr 运算符左右需要空格
				2 + 2 = 4		//正确结果
				b / a = 2		//变量需要 ${}
				2+2 = 4			// $[] 不需要考虑空格
				a+b = 3			// $[] 变量也可以知己使用
				1>2 0			//假为 0
				1<2 1			//真为 1 
				3>2 & 4>3 1		// and 	
				![3>2 | 4>3] 0	// or 需要整体括住

6、if 语句

a=3 b=2

if      [ 4 \< 3 ]
        then
                echo 'true'
        else
                echo 'false'
fi

if      [[ 4 < 3 ]]
        then
                echo 'true'
        else
                echo 'false'
fi

if      ((a>b))
        then
                echo 'true'
        else
                echo 'false'
fi
	输出结果:	false		// [] 中,字符之间需要隔开,比较符需要转义,变量需要${}
				false		// [[]] 中,字符之间需要隔开,变量需要${}
				true		// (()) 中,不需要隔开,不需要转义,变量可以直接引用

7、for 语句

jsum=0
osum=0
for ((i=1;i<=100;i++))
do
        if ((i%2==0))
                then
                        #osum=`expr $osum + $i`
                        #osum=$[osum+i]
                        let osum+=i
                else
                        jsum=`expr $jsum + $i`
        fi
done

echo $jsum
echo $osum

for ((i=1;i<=3;i++))
        do
        for ((j=1;j<=i;j++))
                do
                        echo -n '*'
                done
        echo ''
        done
	输出结果:	2500
				2550	//let 后可以使用 java 语句逻辑
				*
				**
				***		//echo -n 不输出换行符

第二种写法

a=1 b=100
#for i in {1..100}
for i in `seq $a $b`
do
        echo $i
done

8、数组

sum=0
arr=(1 2 3 4 5 6)
echo $arr
echo ${
    
    arr[*]}
echo ${
    
    #arr[*]}
for((i=1;i<=${
    
    #arr[*]};i++))
        do
                let sum+=arr[i]
        done
echo $sum
	输出结果:	1				//	直接输出变量会输出首元素
				1 2 3 4 5 6		// * 输出全部
				6				// # 输出长度
				20				// 输出和

9、键盘录入

read a b c d
echo $a
echo $b
echo $c
echo $d
	录入:1 2 3 4 5   (空格分开)
	输出结果:1
			2
			3
			4 5		//最后输入的值会一并赋予最后的变量

10、函数

	[ function ] funname [()]
	{
		action;
	[return int;]
	}
	1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
	2、必有参数返回,可以显示加:return n(0-255,超过会从0重新计算,补码
	   如果不加,将以最后一条命令运行结果,作为返回值
fun(){
    
    
        a=1
        b=2
        x=$[a+b]
        return $x;
}
fun
echo $?
echo $?
	输出结果:	3		// $? 可以接收返回值
				0	    //第二个将继续向上接收,此处是 fun 方法运行是否成功,成功为 0
fun(){
    
    
        a=$1
        b=$2
        x=$[a+b]
        echo $0
        echo $x
}
fun 1 2
	输出结果:	funfun2.sh		// $0 可以理解为静态变量,无论何时都是脚本的输出
				3		        //此处的位置变量是 fun 的,需要在内部分配值

11、日期

获取当前日期时间

	date +"%Y-%m-%d %H:%M:%S"

格式化日期时间:

	date -d today +"%Y-%m-%d %H:%M:%S"

关于如何通过编号按照周分组的
可以通过编号的集体 -1,再对7获得商

12、重定向

正常情况下,shell 中的输入来自键盘录入的指令,输出的位置是用户的控制台(屏幕)
通过特定的符号,可以将输出位置选择为特定的其他位置

当执行shell命令时,会默认打开3个文件:

标准输入    描述符:0    从键盘获得输入
标准输出    描述符:1    输出到屏幕(即控制台)
错误输出    描述符:2    输出到屏幕(即控制台)

命令 介绍
command > filename 把标准输出重定向到新文件中
command 1> filename 同上
command >> filename 把标准输出追加到文件中
command 1>> filename 同上
command 2> filename 把标准错误重定向到新文件中
command 2>> filename 把标准错误追加到新文件中
command > filename 2>&1 把标准输出和错误输出重定向到新文件中

控制台录入

	touch aaa
	touch ccc
1、	ll aaa bbb > ccc                 
2、	ll aaa bbb 1> ccc
3、	ll aaa bbb 2> ccc
4、	ll aaa bbb > ccc 2>&1
	输出结果:	1、ls: 无法访问bbb: 没有那个文件或目录               标准输出重定向 
				2、ls: 无法访问bbb: 没有那个文件或目录				标准输出重定向 
				3、-rw-r--r--. 1 root root 0 11月  4 19:36 aaa   错误输出重定向
				4、(空)                                    标准和错误输出重定向

13、定时器

定义 write.sh

	'helloworld'>>/tmp/fgh/fun/test.txt

控制台输入

	crontab -e
	* * * * * sh /tmp/fgh/fun/write.sh

五个 * 分别代表

	分钟		小时		几号		月份 	星期

* * * * * 代表每分钟
1 * * * * 代表每小时的第1分钟
*/5 * * * * Command 每5分钟执行
0 */2 * * * Command 每2小时执行

Guess you like

Origin blog.csdn.net/qq_41464008/article/details/121089702