超适合小白!Linux 之 shell 编程入门
卖萌控的博客
点击这里进入电脑版页面!体验更好
超适合小白!Linux 之 shell 编程入门
2022-10-1 萌小白


来自:一口Linux






一、变量的运用1. 变量命名



界说变量时,变量名不加美元符号($,PHP言语中变量需求),如:



your_name= "yikoulinux"



留神,变量名和等号之间不能有空格,这或许和你了解的悉数编程言语都不相同。一同,变量名的命名须遵从如下规矩:




有用的 Shell 变量名示例如下:



RUNOOB



LD_LIBRARY_PATH



_var



var2



无效的变量命名:



?var= 123



user*name=runoob



2. 常用变量



Linux Shell 中的变量分为:体系变量和用户自界说变量。




  1. 体系变量: HOME、HOME、 HOME、 PWD、 SHELL、SHELL、 SHELL、 USER 等等比方:echo $HOME 等等..


  2. 用户自界说变量:




  1. 界说变量:变量=值



2)显现当时 shell 中悉数变量:set



3)吊销变量:unset 变量



4) 声明静态变量:readonly 变量,留神:不能 unset




  1. 将指令的回来值赋给变量(要害)



除了显式地直接赋值,还能够用句子给变量赋值,如:



1)



A= ls -la



反引号,作业里边的指令,并把作用回来给变量 A



2)



A=$(ls -la)



$等价于反引号



3)



forfile in `ls /etc`






forfile in $(ls /etc)



以上句子将 /etc 下目录的文件名循环出来。



3. 举例



例1:






意义如下:




  1. 界说一个变量名为name的变量,值为一口linux


  2. 输出变量name的值


  3. 界说一个变量名为number的变量,初始值为22


  4. 输出变量number的值


  5. 直接输出带变量的字符串


  6. 运用双引号输出带变量的字符串


  7. 运用单引号输出带变量的字符串


  8. 运用双引号输出带不存在的变量的字符串,不存在的变量默许为空


  9. 运用双引号来声明字符串中的变量


  10. 运用大括号{&变量名},声明字符串中的变量



留神:



上述变量是暂时变量,当关闭终端后,变量就会消失。



例2:



删去变量并检查指定变量




  1. unset name 删去变量name


  2. 检查name变量


二、字符串的操作


在做shell批处理程序时分,经常会涉及到字符串相关操作。有许多指令句子,如:awk,sed都能够做字符串各种操作。



其实shell内置一系列操作符号,能够抵达相似作用,我们知道,运用内部操作符会省掉主张外部程序等时刻,因而速度会非常的快。



1. 字符串操作(长度,读取,替换)






















































表达式

意义

${#string}

$string的长度

${string:position}

在 $string中, 从方位$position开端提取子串

${string:position:length}

在$string中, 从方位$position开端提取长度为$length的子串

${string#substring}

从变量$string的开端, 删去最短匹配$substring的子串

${string##substring}

从变量$string的开端, 删去最长匹配$substring的子串

${string%substring}

从变量$string的完毕, 删去最短匹配$substring的子串

${string%%substring}

从变量$string的完毕, 删去最长匹配$substring的子串

${string/substring/replacement}

运用$replacement, 来替代榜首个匹配的$substring

${string//substring/replacement}

运用$replacement, 替代悉数匹配的$substring

${string/#substring/replacement}

假定$string的前缀匹配$substring, 那么就用$replacement来替代匹配到的$substring

${string/%substring/replacement}

假定$string的后缀匹配$substring, 那么就用$replacement来替代匹配到的$substring


阐明:”* $substring”能够是一个正则表达式.



2. 字符串操作举例



a) 核算字符串长度



root@ubuntu:/home/peng # test= 'I love china'



root@ubuntu:/home/peng # echo ${#test}



12



${#变量名}得到字符串长度



b) 截取字串



root@ubuntu:/home/peng # test= 'I love china'



root@ubuntu:/home/peng # echo ${test:5}



e china



root@ubuntu:/home/peng # echo ${test:5:10}



e china



root@ubuntu:/home/peng #



root@ubuntu:/home/peng# echo ${test:4:10}



ve china



${变量名:开端:长度}得到子字符串



c) 字符串删去



root@ubuntu:/home/peng # test= 'c:/windows/boot.ini'



root@ubuntu:/home/peng # echo ${test#/}



c:/windows/boot.ini



root@ubuntu:/home/peng # echo ${test#*/}



windows/boot.ini



root@ubuntu:/home/peng # echo ${test##*/}



boot.ini



root@ubuntu:/home/peng # echo ${test% /*}



c:/windows



root@ubuntu:/home/peng# echo ${test%%/*}



c:






${变量名 #substring正则表达式}从字符串开端开端配备substring,删去匹配上的表达式。



${变量名%substring正则表达式}从字符串完毕开端配备substring,删去匹配上的表达式。



留神:



${test##*/},${test% /*} 分别是得到文件名,或许目录地址最简略办法。



d) 字符串替换



root@ubuntu:/home/peng # test= 'c:/windows/boot.ini'



root@ubuntu:/home/peng # echo ${test/ //}



c:windows/boot.ini



root@ubuntu:/home/peng # echo ${test ////}



c:windowsboot.ini



${变量/查找/替换值} 一个“/”标明替换榜首个,” //”标明替换悉数,当查找中出现了:”/”请加转义符”/”标明。



留神:



字符串的方位是从0开端,-1标明该字符串毕竟一个方位;



截取字符串的时分,是左闭右开的,从左面的方位开端,一直到右边的方位完毕,不包括右边的方位。



三、 脚本的创建和实施



shell脚本并不能作为正式的编程言语,因为它是在Linux的shell中作业的,所以称他为shell脚本。



事实上,shell脚本就是一些指令的集结。



我们一般把悉数的操作都记录到一个文档中,然后去调用文档中的指令,这样一步操作就能够完成了



一般shell脚本都是放在/usr/local/sbin的目录下。



1) shell脚本的树立



在linux体系中,shell脚本(bash shell程序)一般是在编辑器(如vi/vim)中编写,由unix/linux指令、bash shell指令、程序结构操控句子和注释等内容组成,举荐用vim编辑器。



2) 脚本开端(榜首行)



一个规范的shell脚本的榜首行会指出由哪个程序(阐冥具)来实施脚本中的内容,在linux bash编程中一般为:



#!/bin/bash






#!/bin/sh <== 255个字符以内



其间开端的”#!”又称为幻数,在实施bash脚本的时分,内核会根据”#!”后的阐冥具来承认该用哪个程序阐明脚本中的内容,



留神:



这一行有必要在每个脚本顶端的榜首行,假定不是榜首行则为脚本注释行,例如下面的比方。



root@ubuntu:/home/peng # cat test1.sh



#!/bin/bash



echo "scajy start"



#!/bin/bash <==写到这儿就是注释



#!/bin/sh



echo "scajy en:"



sh和bash的差异



root@ubuntu:/home/peng # ls -l /bin/sh



lrwxrwxrwx 1root root 4Sep 212015/bin/sh -> bash



提示:sh为bash的软联接,这儿举荐用标准写法#!/bin/bash



Bash是GNU/Linux默许的shell,和Bourne shell
(sh)兼容,Bash采用了Korn shell (Ksh)和C shell(csh)的特征。符合IEEE POISIX
P10003.2/ISO 9945.2 shell and tools 标准。



Centos和redhat linux 下默许的shell 均为bash
因而,在写shell脚本的时分,我们的脚本的开端也能够不加#!/bin/bash。但假定当时的shell非你默许的shell时,比方tcsh,那么久有必要要写#!了。不然脚本文件就只能实施一些指令的集结,不能够运用shell内建的指令了,主张读者养成习气,不管什么脚本最好都加上开端言语标识,这在后文的shell编程标准中会再次提到。



假定脚本的开端不指定解析器,那么,就要用对应的阐冥具来实施脚本。例如:bash test.sh



3) 脚本注释



在shell脚本中,跟在(#)#号后边的内容标明注释,用来对脚本进行注释阐明,注释部分不会被实施,仅仅是给人看的,注释可自一行,也能够跟在脚本指令后边与指令在同一行,开发脚本时,假定没有注释,其他人就很难理解脚本毕竟在做什么,时刻长了自己也会忘掉。因而,我们要尽量成为所做的作业(脚本等)书写注释的习气,不光是便当他人,也是便当自己。不然写完一个脚本后或许后就记不起脚本的用处了,在从头阅览也会糟蹋许多名贵时刻。关于团队的协作也晦气。



4) 举例



创建文件first.sh,并复制如下信息到文件:



#cd usr/local/sbin



# vim first.sh



#! /bin/bash



##this is my first shell



#wirten by 一口Linux 2021.5.3



date



echo"Hello world"



shell脚本一般以.sh为后缀名



实施脚本



以下几种办法都能够:



#sh first.sh



#bash first.sh



#./first.sh



#./first.sh



会报权限不行



能够:



#chmod +x first.sh



四、环境变量的运用1. 知识点详解




  1. Linux Shell 中的变量分为:体系变量和用户自界说变量。


  2. 体系变量: HOME、HOME、 HOME、 PWD、 SHELL、SHELL、 SHELL、 USER 等等比方:echo $HOME 等等..


  3. 用户自界说变量:


1) 界说变量:变量=值


2)显现当时 shell 中悉数变量: set



3)吊销变量:unset 变量



4) 声明静态变量:readonly 变量,留神:不能 unset




  1. 界说变量的规矩


1) 变量称谓能够由字母、数字和下划线组成,可是不能以数字开端。


2) 等号两头不能有空格



3) 变量称谓一般习气为大写




  1. 将指令的回来值赋给变量(要害)


1)A=`ls -la` 反引号,作业里边的指令,并把作用回来给变量 A


2)A=$(ls -la) 等价于反引号




  1. 设置环境变量的根本语法:


export变量名=变量值 (功用描绘:将 shell 变量输出为环境变量)


source 配备文件(功用描绘:让修改后的配备信息立即收效)



echo $变量名(功用描绘:查询环境变量的值)



2. 操作详解



检查环境变量HOME、PATH的值:



root@ubuntu:/home/peng # echo $HOME



/root



root@ubuntu:/home/peng # echo $PATH



/usr/ local/sbin:/usr/ local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/peng/toolchain/gcc-4.6.4/bin:/home/peng/toolchain/arm-cortex_a8/bin



检查windows体系中的环境变量






检查环境变量PATH中悉数的途径



脚本途径设备举例



办法1:



修改环境环境变量:在PATH中增加指定“软件设备”的目录:



root@ubuntu:/home/peng/yikou # pwd



/home/peng/yikou



root@ubuntu:/home/peng/yikou # ls



a.sh



root@ubuntu:/home/peng/yikou # sh a.sh



Sun May 2 17:00:14 PDT 2021



Hello world



root@ubuntu:/home/peng/yikou # export PATH=$PATH:/home/peng/yikou/



root@ubuntu:/home/peng/yikou # echo $PATH



/usr/ local/sbin:/usr/ local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/peng/toolchain/gcc-4.6.4/bin:/home/peng/toolchain/arm-cortex_a8/bin:/home/peng/yikou/



root@ubuntu:/home/peng/yikou # a.sh



bash: /home/peng/yikou/a.sh: 权限不行



root@ubuntu:/home/peng/yikou # chmod 777 a.sh



root@ubuntu:/home/peng/yikou # a.sh



Sun May 2 17:01:34 PDT 2021



Hello world






办法2:



修改环境变量配备文件的办法,使修改后的环境变量永久收效



vim /etc/bash.bashrc






source.bash.rc ,使配备文件从头收效



关闭终端,翻开并从头从头输入:a.sh依旧能够实施。



root@ubuntu:/home/peng/ # a.sh



Sun May 2 17:10:00 PDT 2021



Hello world



五、数学运算1. 知识点详解



运算符运用的语法:



expr操作符对照表






操作符意义






2. 操作详解




  1. 比较大小,只能对整数进行比较,需求加空格,linux 保存要害字要转义


root@ubuntu:/home/peng/yikou # num1=30


root@ubuntu:/home/peng/yikou # num2=50



root@ubuntu:/home/peng/yikou # expr $num1 > $num2



检查上一条指令有没有实施成功:



回来0 成功,其他失利




  1. 小于、小于等于、大于等于


expr $num1 < $num2


expr $num1 <= $num2



expr $num1 >= $num2







  1. 运算 加、减、乘、除


# 加


num1= 17



num2= 5



expr $num1 + $num2



# 减



num3=`expr $num1 + $num2`



echo $num3



expr $num1 - $num2



# 乘



expr $num1 * $num2



expr $num1 / $num2



# 取余数



expr $num1 % $num2






需求留神事项:



两个小括号的核算办法,要赋值,不然会报错



六、脚本与用户交互操作指令行参数1. 读取参数



bash shell用方位参数变量(positional parameter)存储指令行输入的悉数参数,包括程序名。



其间, 0标明程序名,0标明程序名, 0表示程序名,1标明第1个参数, 2标明第2个参数,…,2标明第2个参数,…, 2表示第2个参数,...,9标明第9个参数。假定参数个数多于9个,有必要如下标明变量: 10,{10}, 10{11},…



#!/bin/bash



# author:一口Linux



for((count = 1; count <= $ 1; count++))



do



echo The number is $count.



done



实施作用:






修改脚本如下:



echo$1, $2, $3, $4



实施作用如下:



2 读取程序名



首要想到的是运用 0,可是0,可是 0,但是0获取的文件名包括./以及途径等前缀信息,如下:



echo The command entered is: $ 0



# 作业:./



# 输出:The command entered is: ./ 14.sh



假定想仅得到文件名,而不包括./,能够运用basename指令:



name=`basename $ 0`



echo The command entered is: $name



# 作业:./



# 输出:The command entered is: 14.sh



3 特别变量$#标明指令行参数的个数:



#!/bin/bash



# author:一口Linux



params=$ #



echo The number of params is: $params



for((i = 1; i <= params; i++))



do



echo The param is: $i



done



实施作用



假定想获取悉数的参数,当然能够运用 #和循环逐个遍历。也能够运用如下两个特别变量:*将悉数的指令行参数看作一个整体存储,而$@将指令行中以空格距离的参数单独存储,如下:



#!/bin/bash



# author:一口Linux



count= 1



forparam in "$*"



do



echo "$* parameter $count = $param"



count=$[ $count + 1]



done



count= 1



forparam in "$@"



do



echo "$@ parameter $count = $param"



count=$[ $count + 1]



done



4 底子的读取



read指令承受从键盘或文件描绘符中的输入数据,将其存储到一个指定变量中。



选项:



-p:指定读取值时的提示符;



-t:指定读取值时等候的时刻(秒),假定没有在指定的时刻内输入,就不再等候了。。



-n:设置答应输入字符的个数



参数



变量:指定读取值的变量名



操作详解




  1. 例1


#!/bin/bash


# author:一口Linux



# testing the read option



read -p "Please enter your name: "name



echo "Hello $name."



实施作用




  1. 例2



read指令中,能够根据需求将输入的数据保存在多个变量中,假定指定的变量比较少,那么毕竟一个变量将包括余下的悉数输入,如下所示:



#!/bin/bash



# author:一口Linux



# testing the read option



read-p "Enter the values: "val1 val2 val3



echo" $val1"



echo" $val2"



echo" $val3"



实施作用:




  1. 归纳比方



提示用户输入一个正整数num,然后核算1+2+3+…+num的值;有必要对num是否为正整数做判别,不符合应当作业再次输入



思路:




  • expr只能对整数进行核算,直接用expr 和一个整数核算获取 $? 的值来判别是否为整数


  • 在运用 expr $num1 > 0 判别是否大于0


#!/bin/bash


# author:一口Linux



whiletrue



do



read-p "please input a positive number: "num



# 判别数是否是整数



expr $num+ 1 &> /dev/null



if[ $? -eq 0 ]; then



# 判别这个整数是否大于0,大于0回来1



if[ `expr $num> 0` -eq 1 ]; then



#echo "yes,positive number"



# $sum没有赋值,默许为0



fori in`seq 0 $num`



do



sum=`expr $sum+ $i`



done



echo"1+2+3+...+ $num= $sum"



# 实施核算需求退出



exit



fi



fi



echo"error,input enlegal"



continue



done



测验:






七、联络运算符



有时分我们需求比较两个数字的大小联络,这时分就要用到联络运算符。联络运算符只支撑数值运算,不支撑字符运算。



1. 知识点详解



Shell 言语支撑下面这些联络运算符:



-eq:检测两个数是否持平,持平回来 true



-ne:检测两个数是否不持平,持平回来 true



-gt:检测左面的数是否大于右边的,假定是回来 true



-lt:检测左面的数是否小于右边的,假定是回来 true



-ge:检测左面的数是否大于等于右边的,假定是回来 true



-le:检测左面的数是否小于等于右边的,假定是回来 true



2. 操作详解#!/bin/bash



# author:一口Linux



a= 10



b= 20



if[ $a -gt $b ]



then



echo "a great than b"



else



echo "a not great than b"



fi



实施作用!如下:



八、字符串运算符1. 知识点详解= 比较两个字符串是否持平



!= 比较两个字符串是否不持平



-z 检测字符串的长度是否为零



-n 检测字符串的长度是否不为零



$字符名 变量是否有负值(为空),有回来True,没有回来False



2. 操作详解#!/bin/bash



# author:一口Linux



###本脚本首要用于字符串运算符



if[ ! $1]



then



echo"榜首个参数为空"



echo"****************************************************************"



echo"****************************************************************"



echo"**************实施用例的格式为:sh $0变量1 变量2***************"



echo"****************************************************************"



echo"****************************************************************"



break



else



if[ ! $2]



then



echo"第二个参数为空"



echo"****************************************************************"



echo"****************************************************************"



echo"**************实施用例的格式为:sh $0变量1 变量2***************"



echo"****************************************************************"



echo"****************************************************************"



break



else



###1、检测两个字符串是否持平;



if[ $1= $2]



then



echo"这是榜首个判别句子"



echo"变量1等于变量2"



else



echo"这是榜首个判别语句"



echo"变量1不等于变量2"



fi



###2、检测两个字符串是否不持平;



if[ $1!= $2]



then



echo"这是第二个判别句子"



echo"变量1不等于变量2"



else



echo"这是第二个判别句子"



echo"便量1等于变量2"



fi



###3、检测字符串长度是否为0



if[ -z $1]



then



echo"这是第三个判别段句子"



echo"变量1字符串长度为0"



else



echo"这是第三个判别段句子"



echo$1



fi



###4、检测字符串长度是否不为0



if[ -n $2]



then



echo"这是第四个判别句子"



echo"变量2字符串长度不为0"



echo$2



else



echo"这是第四个判别句子"



echo"变量2字符串长度为0"



fi



###5、检测字符串是否不为空



if[ $1]



then



echo"这是第五个判别句子"



echo"变量1不为空"



else



echo"这是第五个判别句子"



echo"变量1为空"



fi



fi



fi



测验作用:






九、shell文件及目录常用操作的几个实例




  1. 提取途径的目录和文件名



提取目录:



dirname $path



提取文件名:



basename $path




  1. 批量重命名带有空格文件


functionprocessFilePathWithSpace{


find $1-name "* *"| whilereadline



do



newFile=` echo$line| sed 's/[ ][ ]*/_/g'`



mv " $line" $newFile



logInfo "mv $line$newFile$?"



done



}




  1. 遍历文件内容


cat /tmp/text.txt | whilereadline


do



echo$line



done




  1. 文件不存在,则创建文件


[ -f $logFile] || touch $logFile


  1. 递归遍历目录


functiongetFile{


forfile in`ls $1`



do



element= $1"/"$file



if[ -d $element]



then



getFile $element



else



echo$element



fi



done



}




  1. 清空文件内容


cat /dev/null > $filePath


END



发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容