4

⭐万字Linux shell详细教程⭐包教包会,学不会找我!

 2 years ago
source link: https://blog.csdn.net/weixin_46211269/article/details/120604267
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、环境准备

我们在这里就在本地测试学习,因此我在这里先不建议大家这么着急去买服务器来学,这样比较费钱,等我们学好这些基础之后,再去上手服务器,那将是手到擒来。
本地学习工具:虚拟机
如果你没有该工具,请按照这个操作安装:虚拟机安装配置教程
当然,如果你有钱,阿里云,腾讯云自己租一个也可以。

二、hello Linux

创建shell脚本,命名test,格式统一为.sh

touch test.sh

编辑脚本:

vim test.sh

如果你不了解vim用法,或者你的虚拟机没有安装vim,看这一篇文章前面部分:cat详细教程顺便你也可以学一下cat命令。这里大概演示一下:
先输入如下命令回车

vim test.sh

按一下字母i键,即可编辑,我就输入hello Linux,你也可以写别的内容,不一定为英文
在这里插入图片描述

编辑好内容后,按一下ESC键,再输入:wq! (表示强制保存退出的意思),回车即可。
在这里插入图片描述

如上则是保存成功。

三、运行shell脚本

首先赋予权限:

chmod 777 test.sh

执行脚本:

./test.sh

演示:
在这里插入图片描述

四、shell变量

1)普通变量

变量就很简单,比如我我要给变量a赋值为“川川帅哥“,则是:

a="川川帅哥"

使用打印变量呢?

echo $a

你可以在这里把echo理解为python的print,c语言的printf之类。

现在我们还是新建一个sh来进行测试

 touch test1.sh

编辑文件:

vim test1.sh

编辑内容如下:
在这里插入图片描述
操作界面如下:
在这里插入图片描述
你可以看到,我开始忘记给文件权限,所以执行的时候显示权限不够。所以不要忘记赋予权限。

2)只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。举个例子。
创建新的文件并编辑:
在这里插入图片描述

编辑内容如下:
在这里插入图片描述
执行则会报错:
在这里插入图片描述
实际上这样的变量,我们一般也不怎么用,个人认为了解一下就是。

3)删除变量

使用函数unset,跟上面操作一样,就不演示了,也是作为了解就行。

c="川川菜鸟"
unset c
echo $c

以上实例执行将没有任何输出。

五、Shell 字符串

1)单双引号

字符串可以用单引号,也可以用双引号,也可以不用引号。
创建内容为:

a='川川菜鳥'
b="川川帥哥"
echo $a
echo $b

演示:
在这里插入图片描述
完整演示:
在这里插入图片描述
单引号特点:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号特点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

2)字符串拼接

a="chuan"
b="chuan"
c=" $a$b"
echo $c

如下:
在这里插入图片描述

完整演示如下:
在这里插入图片描述

3)获取字符串长度

在上面的基础之上加上echo ${#c}即可:

a="chuan"
b="chuan"
c=" $a$b"
echo $c
echo ${#c}

完整演示:
在这里插入图片描述

4)字符串提取

我们在前面的基础之上加上一点即可,我们主要是用切片的方法来来获取,什么是切片?如果你跟我一起学过python那你不会不知道,就不讲解了。
编辑保存内容如下

a="chuan"
b="chuan"
c=" $a$b"
echo $c
echo ${#c}
echo ${a:1:3}

即:
在这里插入图片描述

完整演示:
在这里插入图片描述

六、Shell 数组

1)读取索引数组

Shell 数组用括号来表示,元素用空格符号分割开。
sh文件内容为:

a=(A B "C" D)
echo $a


在这里插入图片描述
完整演示为:
在这里插入图片描述
但是你是否在疑惑只输出的第一个,shell里我们不能像别的语言一样,直接输出全部,因此我们要修改一下。
改为这样:

a=(A B "C" D)
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}

在这里插入图片描述
保存再次运行:
在这里插入图片描述

2)获取数组中的所有元素

如果想一次性全部输出,并不想通过索引来输出怎么办?使用@ 或 * 可以获取数组中的所有元素,在上面的基础上我再编辑加两行:

a=(A B "C" D)
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}
echo "數組元素依次如下:${a[@]}"
echo "數組元素依次如下:${a[*]}"

完整演示:
在这里插入图片描述

3)获取数组的长度

在前面的基础之上加上:

echo "數組元素個數爲:${#a[@]}"
echo "數組元素個數爲:${#a[*]}"


在这里插入图片描述
演示如下:
在这里插入图片描述

七、shell运算符

算术运算符
在这里插入图片描述
演示其中一部分,其它则类似:

a=10
b=20

val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a \* $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

if [ $a == $b ]
then
   echo "a 等于 b"
fi
if [ $a != $b ]
then
   echo "a 不等于 b"
fi

在这里插入图片描述
完整演示如下:
在这里插入图片描述
注意事项:

  • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
  • 完整的表达式要被 两个反引号 包含,注意这个字符不是常用的单引号,在 Esc 键下边。
  • 乘号(*)前边必须加反斜杠()才能实现乘法运算;
  • if…then…fi 是条件语句,后续将会补充讲解。

其它运算符就不讲了,主要掌握下算数运算符。

八、Shell echo命令

你可以直接在终端输入这样的单行命令来测试学习,不用一直创建新的文件。

1)显示普通字符串

echo "hello world"

这里的双引号完全可以省略,以下命令与上面实例效果一致:

echo hello world

完整演示如下:
在这里插入图片描述

2)显示转义字符

echo "\"hello world\""

演示如下:
在这里插入图片描述

3)显示换行

使用\n换行:

echo -e "hello\n"

演示如下:
在这里插入图片描述

4)显示不换行

echo -e "chuan! \c" # -e 开启转义 \c 不换行

演示:
在这里插入图片描述

5)显示结果重定向至文件

定向至test7.sh文件:

 echo "hello world" >test7.sh

演示:
在这里插入图片描述

6)显示执行时间

echo `date`

演示:
在这里插入图片描述
这里又到了最后了,补充一下printf跟echo命令是一样的作用,因此我就不演示了,统一用echo来输出。

九、Shell test 命令

1)数值测试

参数和说明如下:

-eq	等于则为真
-ne	不等于则为真
-gt	大于则为真
-ge	大于等于则为真
-lt	小于则为真
-le	小于等于则为真

演示一个参数如下:

num1=200
num2=200
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi  

即:
在这里插入图片描述
完整演示如下:
在这里插入图片描述
到这里我先把前面创建的文件删了:

rm -rf test1.sh test2.sh test3.sh test4.sh test5.sh test6.sh test7.sh test8.sh 

演示:
在这里插入图片描述

代码中的 [] 执行基本的算数运算,例如:

a=10
b=10

result=$[a+b] # 注意等号两边不能有空格
echo "result結果为: $result"

在这里插入图片描述
完整演示如下(我新建了一个文件夹,免得打乱了):
在这里插入图片描述
我仅仅演示了加法,你也可以去尝试一些别的计算。

2)字符串测试

参数如下:

=	等于则为真
!=	不相等则为真
-z 字符串	字符串的长度为零则为真
-n 字符串	字符串的长度不为零则为真

演示一个如下:

num1="chuan"
num2="chuan"
if test $num1 = $num2
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi

即:
在这里插入图片描述
完整演示如下:
在这里插入图片描述

3)文件测试

-e 文件名	如果文件存在则为真
-r 文件名	如果文件存在且可读则为真
-w 文件名	如果文件存在且可写则为真
-x 文件名	如果文件存在且可执行则为真
-s 文件名	如果文件存在且至少有一个字符则为真
-d 文件名	如果文件存在且为目录则为真
-f 文件名	如果文件存在且为普通文件则为真
-c 文件名	如果文件存在且为字符型特殊文件则为真
-b 文件名	如果文件存在且为块特殊文件则为真

举一个例子:

if test -e ./test1.sh
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi

完整演示如下:
在这里插入图片描述
其它参数可以自行测试。

十、shell 控制流

1)if判断流

if else
fi

语法格式如下:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

举个例子:

-gt	大于则为真

测试代码如下:

a=5
b=6
if test [$a -gt]
then
        echo '大於'
else    
        echo '小於'
fi

完整演示如下:
在这里插入图片描述
再来进阶测试代码如下:

a=5
b=6
if test [$a==$b]
then
        echo '等於'
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

完整演示如下:
在这里插入图片描述

2)for 循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

写成一行则是:

for var in item1 item2 ... itemN; do command1; command2… done;

举例子如下:顺序输出当前列表中的数字

for a in 1 2 3 4 5
do
    echo "值依次爲: $a"
done

完整演示如下:
在这里插入图片描述
再例如:顺序输出字符串中的字符

for str in hello chuan chuan
do
    echo $str
done

完整演示如下:
在这里插入图片描述
我们再来个进阶:打印任意数的乘法表

echo "输入一个数:"
read num
for ((  i=1;i<=$num;i++  ))
do
   for ((  j=1;j<=$num;j++  ))
   do
      [  $j  -le  $i  ]  &&  echo -n "${i}*${j}=$((i*j))      "    #判断j是否小于i,当
j大于i时不输出,输出不换行,末尾加一个制表符
   done
   echo ""           #输出一个换行符                
done

完整演示如下:
在这里插入图片描述

3)while循环

语法格式:

while condition
do
    command
done

举例为:依次输出1到6

int=1
while(( $int<=6 ))
do
    echo $int
    let "int++"
done

完整演示如下:
在这里插入图片描述

4)until 循环

until 循环执行一系列命令直至条件为 true 时停止。until 循环与 while 循环在处理方式上刚好相反。
语法为:

until condition
do
    command
done

condition 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
举个例子:使用 until 命令来输出 0 ~ 6 的数字

a=0

until [ ! $a -lt 6 ]
do
   echo $a
   a=`expr $a + 1`
done

完整演示如下:
在这里插入图片描述

5)case … esac

case … esac 为多选择语句,与C语言中的 switch … case 类似,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行结束.
语法为:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

举例:提示输入 1 到 4,与每一种模式进行匹配

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read a
case $a in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

完整演示如下:
在这里插入图片描述

6)跳出循环

break
break命令允许跳出所有循环(终止执行后面的所有循环)。
测试代码如下:

do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            b

完整演示如下:
在这里插入图片描述
continue
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
测试代码为:

while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

完整演示如下:
在这里插入图片描述
是不是有人想问我怎么结束呢?ctrl+c强制结束即可。

十一、Shell 函数

花里胡哨的语言我就不说了,来看一个demo函数:

demoFun(){
    echo "測試一下我的函數!"
}
echo "函数开始执行"
demoFun
echo "-函数执行完毕"

如果你学过别的语言,你一定一眼就看懂了。
完整演示如下:
在这里插入图片描述

到这里我再插入一个例子:从键盘读入10个数,显示最大值和最小值
代码为:

printf "请输入十个数字: "  
read   
biggest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | head -n1)  
smallest=$(echo "$REPLY" |  tr ' ' '\n' | sort -rn | tail -n1)  
echo "最大的数字为:  $biggest"  
echo "最小的数字为:  $smallest"

完整演示如下:
在这里插入图片描述
下面定义一个带有return语句的函数:
代码为:

add(){
    echo "这个函数为求两个函数之和.."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read bNum
    echo "两个数字分别为 $aNum 和 $bNum !"
    return $(($aNum+$bNum))
}
add
echo "输入的两个数字之和为 $? !"

完整演示如下:
在这里插入图片描述

十二、Shell 输入/输出重定向

相关参数如下:

command > file	将输出重定向到 file。
command < file	将输入重定向到 file。
command >> file	将输出以追加的方式重定向到 file。
n > file	将文件描述符为 n 的文件重定向到 file。
n >> file	将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m	将输出文件 m 和 n 合并。
n <& m	将输入文件 m 和 n 合并。
<< tag	将开始标记 tag 和结束标记 tag 之间的内容作为输入。

做一些例子:

1)输出重定向

将输出重定向到wen文件夹
在这里插入图片描述
再比如我把test16.sh这个文件重定向到han这个文件
在这里插入图片描述
这样的重定向有一个缺点就是会覆盖原来的内容,如果你不想覆盖原来的内容,你可以使用:

command >> file	将输出以追加的方式重定向到 file。

完整演示如下:
在这里插入图片描述
如此我们可以看到已经追加进去了。

2)输入重定向

如果要数一下文件夹内有多少行:

 wc -l wen

在这里插入图片描述
如果我们用重定向的方式,将输入重定向到 wen文件:

 wc -l <  wen

演示为:
在这里插入图片描述

3)Here Document

Here Document 是 Shell 中的一种特殊的重定向方式,用来将输入重定向到一个交互式 Shell 脚本或程序。
语法为;

command << delimiter
    document
delimiter

举个例子:

 wc -l << EOF
   欢迎大家
   这里是川川菜鸟
   教程
EOF

演示:
在这里插入图片描述
也可以以脚本方式执行:

cat << EOF
    欢迎大家
   这里是川川菜鸟
   教程
EOF

演示如下:
在这里插入图片描述

4)/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
在这里插入图片描述

十三、实战练习

1)Linux例题

如果以下操作你看不懂的话,请看我这一篇文章,看完这一篇文章后,你就看得懂了:cat详细教程
输入输出重定向:
①新建文件file1,输入:
Hello,
Linux!
保存并退出。新建文件file2,输入:
World!
保存并退出。
将file1和file2的内容显示在终端上,并重定向到文件file3。
将file1的内容追加到文件file3。

操作步骤:
1.创建一个新的文件夹work

mkdir work

2.切换目录

cd work/

完整演示:
在这里插入图片描述

3.创建并编辑新文件

touch file1
vim file1

查看文件:

cat file

完整演示:
在这里插入图片描述
4.创建另一个文件
同样的道理,完整演示如下:
在这里插入图片描述
5.重定向到file3文件

cat file1 file2 >>file3

完整演示如下:
在这里插入图片描述
6.将file1的内容追加到文件file3

cat file1>>file3

完整演示如下:
在这里插入图片描述
②管道:
统计文件file3中出现“hello”的行数并显示

grep Hello file3 |wc -l

演示如下:
在这里插入图片描述
③管道和输入输出重定向:
进入目录/home/student,用ls –l长格式的方式列出当前目录下的文件和目录,并将其前5条信息保存到文件list中。
创建新文件夹,并编辑list.txt内容如下:

file1
file2
file3
file4
file5
file6
file7

完整演示:
在这里插入图片描述
查看一下:
在这里插入图片描述
查看当前目录下文件和目录

ls -al

演示:
在这里插入图片描述
筛选前5的数据加到file3中:

ls -l |head -n 5 >>list.txt

完整演示如下:
在这里插入图片描述

2)shell练习题

① 在/home目录中创建50个目录,目录名称依次为:a1,……,a50;
创建一个sh文件:

touch 1.sh
i=1

while [ $i -le 50 ]
 
do

mkdir a$i

i=$((i+1))

done

完整演示:
在这里插入图片描述
② 编写一个程序,它的作用是:先查看一下/root/test/logical这个名称是否存在。若不存在,则创建一个文件,使用touch来创建,创建完成后离开;如果存在,判断该名称是否为文件,若为文件,则显示其行数;如果不是文件,则离开;
创建2.sh

touch 2.sh
if [ ! -e /home/yifan/maying/shell/case5/logical ]  
then
    touch logical  
elif 
    [ -f /home/yifan/maying/shell/case5/logical ]  
then 
    rm -f /home/yifan/maying/shell/case5/logical && mkdir /home/yifan/maying/shell/case5/logical  
elif 
    [ -d /home/yifan/maying/shell/case5/logical ]  
then 
    rm -r /home/yifan/maying/shell/case5/logical  
fi 

演示如下:
在这里插入图片描述
查看一下:
在这里插入图片描述

③编写一个shell脚本,从键盘读入10个数,显示最大值和最小值

printf "请输入十个数字: "  
read   
biggest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | head -n1)  
smallest=$(echo "$REPLY" |  tr ' ' '\n' | sort -rn | tail -n1)  
echo "最大的数字为:  $biggest"  
echo "最小的数字为:  $smallest"

完整演示如下:
在这里插入图片描述
④ 编写一个脚本,打印任何数的乘法表。如:输入3,则打印
11=1
21=2 22=4
31=3 32=6 33=9
代码如下:

echo "输入一个数:"
read num
for ((  i=1;i<=$num;i++  ))
do
   for ((  j=1;j<=$num;j++  ))
   do
      [  $j  -le  $i  ]  &&  echo -n "${i}*${j}=$((i*j))      "    #判断j是否小于i,当
j大于i时不输出,输出不换行,末尾加一个制表符
   done
   echo ""           #输出一个换行符                
done

完整演示如下:
在这里插入图片描述

十四、粉丝福利

如果本篇文章上了热榜前十,我将会送出图灵书籍python进阶版的两本书:
在这里插入图片描述
如果你想购买,可以到如下京东链接购买:

https://u.jd.com/rCejGfI

参与方式:

  1. 扫描下方二维码进群
  2. 一键三连(包括点赞评论收藏)截图发给我(群主)

十五、总结

本篇文章写得很详细,不管你是不是零基础,相信你都能看懂,本文主要在一些基础知识讲解,并没有太多的进阶,本人主要是为了完成作业学习这个,这些内容已经足够我完成作业了。
这是私人小窝,进来请注明自己进群理由,我不希望不爱学习的人进来:
在这里插入图片描述
如果对你有帮助,希望你支持一下,本篇文章内容虽然不是非常多,写了我好久。操作系统必备知识,所以你一定要掌握。
如果你想要本篇文章的电子版,你可以关注公众号:川川菜鸟
发送:shell教程
演示:
在这里插入图片描述
最后希望大家能够好好学习,天天向上!

👇🏻 可通过搜索下方 川川菜鸟 公众号获取更多资料👇🏻


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK