Linux入门-shell编程-适合小白

推荐大家关注一个公众号

点击上方 "编程技术圈"关注, 星标或置顶一起成长

后台回复“大礼包”有惊喜礼包!

日英文

There are so many people out there who will tell you that you can't. What you've got to do is turn around and say:"Watch me."

总会有许多人对你指手画脚,告诉你“你做不到。”你所要做的就是转过头去对他们说:“看我的。”

每日掏心话

生命中请不要再畏惧,走坎坷,历风雨,生命,在冷暖交织中前行,人生,在悲欢离合中继续。
责编:乐乐 | 来自:土豆居士

编程技术圈(ID:study_tech)第 1306次推文

往日回顾:这才叫高颜值的Markdown编辑神器!

     

   正文   




一、变量的使用1. 变量命名定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="yikoulinux"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。中间不能有空格,可以使用下划线(_)。不能使用标点符号。不能使用bash里的关键字(可用help命令查看保留关键字)。变量名称一般习惯为大写有效的 Shell 变量名示例如下:
RUNOOB
LD_LIBRARY_PATH
_var
var2
无效的变量命名:
?var=123
user*name=runoob
2. 常用变量Linux Shell 中的变量分为:系统变量和用户自定义变量。
系统变量:、PWD、、USER 等等比如:echo $HOME 等等..
用户自定义变量:
定义变量:变量=值 2)显示当前 shell 中所有变量:set 3)撤销变量:unset 变量声明静态变量:readonly 变量,注意:不能 unset将命令的返回值赋给变量(重点)除了显式地直接赋值,还可以用语句给变量赋值,如:1) A=ls -la反引号,运行里面的命令,并把结果返回给变量 A 2)
A=$(ls -la)
$等价于反引号
3)
for file in `ls /etc`
或
for file in $(ls /etc)
以上语句将 /etc 下目录的文件名循环出来。
3. 举例例1:含义如下:
定义一个变量名为name的变量,值为一口linux输出变量name的值定义一个变量名为number的变量,初始值为22输出变量number的值直接输出带变量的字符串使用双引号输出带变量的字符串使用单引号输出带变量的字符串使用双引号输出带不存在的变量的字符串,不存在的变量默认为空使用双引号来声明字符串中的变量使用大括号{&变量名},声明字符串中的变量注意:上述变量是临时变量,当关闭终端后,变量就会消失。
例2:删除变量并查看指定变量
unset name  删除变量name查看name变量二、字符串的操作在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。
其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。
1. 字符串操作(长度,读取,替换)表达式含义

${#string}$string的长度${string:position}在 中从位置position开始提取子串${string:position:length}在中从位置position开始提取长度为$length的子串${string#substring}从变量的开头删除最短匹配substring的子串${string##substring}从变量的开头删除最长匹配substring的子串${string%substring}从变量的结尾删除最短匹配substring的子串${string%%substring}从变量的结尾删除最长匹配substring的子串${string/substring/replacement}使用来代替第一个匹配的substring${string//substring/replacement}使用代替所有匹配的substring${string/#substring/replacement}如果的前缀匹配substring, 那么就用来代替匹配到的substring${string/%substring/replacement}如果的后缀匹配substring, 那么就用来代替匹配到的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:\windows\boot.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编辑器。
搜索公众号Linux中文社区后台回复“私房菜”,获取一份惊喜礼包。
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 1 root root 4 Sep 21  2015 /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 script
#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. 知识点详解Linux Shell 中的变量分为:系统变量和用户自定义变量。系统变量:、PWD、、USER 等等比如:echo $HOME 等等..用户自定义变量:1) 定义变量:变量=值
2)显示当前 shell 中所有变量:set
3)撤销变量:unset 变量
4) 声明静态变量:readonly 变量,注意:不能 unset
定义变量的规则1) 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2) 等号两侧不能有空格
3) 变量名称一般习惯为大写
将命令的返回值赋给变量(重点)1)A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量 A
2)A=$(ls -la) 等价于反引号
设置环境变量的基本语法: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. 操作详解比较大小,只能对整数进行比较,需要加空格,linux 保留关键字要转义root@ubuntu:/home/peng/yikou# num1=30
root@ubuntu:/home/peng/yikou# num2=50
root@ubuntu:/home/peng/yikou# expr $num1 \> $num2
0
查看上一条命令有没有执行成功:返回0 成功,其他失败
小于、小于等于、大于等于expr $num1 \< $num2
expr $num1 \<= $num2
expr $num1 \>= $num2
运算 加、减、乘、除# 加
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)存储命令行输入的所有参数,包括程序名。其中,表示程序名,1表示第1个参数,表示第个参数,,9表示第9个参数。如果参数个数多于9个,必须如下表示变量:,{11},...
搜索公众号GitHub猿后台回复“小米”,获取一份惊喜礼包。
#!/bin/bash
# author:一口Linux
for((count = 1; count <= $1; count++))
do
    echo The number is $count.
done
执行结果:
修改脚本如下:
echo $1, $2, $3, $4
执行结果如下:
2 读取程序名首先想到的是利用,但是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
for param in "$*"
do
    echo "\$* parameter $count = $param"
    count=$[ $count + 1 ]
done

count=1
for param in "$@"
do
    echo "\$@ parameter $count = $param"
    count=$[ $count + 1 ]
done
4 基本的读取read命令接受从键盘或文件描述符中的输入数据,将其存储到一个指定变量中。
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。
-n:设置允许输入字符的个数
参数
变量:指定读取值的变量名
操作详解
例1#!/bin/bash
# author:一口Linux
# testing the read option

read -p "Please enter your name: " name
echo "Hello $name."
执行结果
例2 read命令中,可以根据需要将输入的数据保存在多个变量中,如果指定的变量比较少,那么最后一个变量将包含余下的所有输入,如下所示:#!/bin/bash
# author:一口Linux
# testing the read option

read -p "Enter the values: " val1 val2 val3
echo "$val1"
echo "$val2"
echo "$val3"
执行结果:
综合例子 提示用户输入一个正整数num,然后计算1+2+3+...+num的值;必须对num是否为正整数做判断,不符合应当运行再次输入思路:
expr只能对整数进行计算,直接用expr 和一个整数计算获取 $? 的值来判断是否为整数在使用 expr $num1 > 0 判断是否大于0#!/bin/bash
# author:一口Linux
while true
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
                        for i 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文件及目录常用操作的几个实例提取路径的目录和文件名 提取目录:dirname $path
提取文件名:
basename $path
批量重命名带有空格文件function processFilePathWithSpace(){ 
 find $1 -name "* *" | while read line
 do 
 newFile=`echo $line | sed 's/[ ][ ]*/_/g'`
 mv "$line" $newFile
logInfo "mv $line $newFile $?"
 done
} 
遍历文件内容cat /tmp/text.txt | while read line
do
 echo $line
done
文件不存在,则创建文件[ -f $logFile ] || touch $logFile
递归遍历目录function getFile(){
 for file in `ls $1`
 do
  element=$1"/"$file
     if [ -d $element ]
  then 
         getFile $element
     else
         echo $element
     fi  
 done
}
清空文件内容cat /dev/null > $filePath
你还有什么想要补充的吗?
PS:欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,欢迎转发分享给更多人。

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢!

欢迎加入后端架构师交流群,在后台回复“学习”即可。

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。在这里,我为大家准备了一份2021年最新最全BAT等大厂Java面试经验总结。
别找了,想获取史上最简单的Java大厂面试题学习资料
扫下方二维码回复「面试」就好了


猜你还想看
阿里、腾讯、百度、华为、京东最新面试题汇集
优雅的阅读框架源码
腾讯起诉腾迅,获赔30万

详解MQ消息队列及四大主流MQ的优缺点

嘿,你在看吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值