Linux学习笔记

42 篇文章 0 订阅
2 篇文章 2 订阅

市面上Linux学习资料太多,实在不用再多做介绍,所以这篇文章主要是做一些自己认为是比较重要的笔记记录,遇到的一些问题及解决办法,好的学习资源分享等等。

本人以菜鸟教程作为学习入门

本文只列出示例用法,更多用法自行搜索 或者man 命令例如man useradd
或者命令 --help 例如useradd --help

Linux简介

常用命令

查看进程:ps -ef|grep xx
查看当前版本:cat /etc/centos-release

用户和用户组管理

用户管理

最令我们熟知的应该就是root账户,其实Linux系统是一个多用户多任务的分时操作系统。
实现用户账号的管理,要完成的工作主要有如下几个方面:

  • 用户账号的添加、删除与修改。
  • 用户口令的管理。
  • 用户组的管理。

添加新用户

useradd -d /home/sam -m sam
此命令创建了一个用户sam,其中-d和-m选项用来为登录名sam产生一个主目录 /home/sam(/home为默认的用户主目录所在的父目录)。

切换用户

su sam
此命令切换当前用户为sam,如果想切回root使用同样的方法,不过要输入密码

修改用户

usermod -g L1 sam
此命令将sam用户组改为L1

用户口令(密码)的管理

初始创建用户是没有口令的,可以先用root账号给用户添加口令,有了密码后后续可以在当前账户操作
su root 输入密码
passwd sam 按照提示设置sam的密码

删除用户

userdel -r sam
此命令删除用户sam在系统文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的记录,同时删除用户的主目录。
如果有相关报错

user sam is currently used by process 219359

直接强制删除就好
userdel -rf sam

Linux系统用户组的管理

用户组的管理涉及用户组的添加、删除和修改。组的增加、删除和修改实际上就是对/etc/group文件的更新。

新增一个用户组

groupadd L1
此命令向系统中增加了一个新组L1,新组的组标识号是在当前已有的最大组标识号的基础上加1。组标识号也可以通过-g 组标识号来指定。

删除一个用户组

groupdel L1

修改用户组的属

groupmod -g 1002 -n L2 sam
此命令将组sam的标识号改为1002,组名修改为L2。

如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限。

useradd -G L1 a 添加一个新用户,用户组为L1
groupadd L2 添加一个新用户组为L2
usermod -G L2 a把用户a同时添加进L2组
su a切换到用户a
groups 显示当前用户所属组,应该是L1 L2

newgrp L2 由属组L1切换到属组L2

groups 显示当前用户所属组,应该是L2 L1

与用户账号有关的系统文件

  • /etc/passwd文件是用户管理工作涉及的最重要的一个文件
  • /etc/shadow中的记录行与/etc/passwd中的一一对应,它由pwconv命令根据/etc/passwd中的数据自动产生
  • 用户组的所有信息都存放在/etc/group文件中
  • 添加批量用户的应用

Linux 文件基本属性

教程的顺序本来是先介绍文件属性,不过我先把用户用户组给介绍一下,接下来再学习文件属性就好理解多了。
在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组,如:
-rw-r--r-- 1 a L1 22 Apr 2 13:39 hello.py

在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。

  • 当为 d 则是目录
  • 当为 - 则是文件;
  • 若是 l 则表示为链接文档(link file);
  • 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
  • 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。

后面依次是:文件数量,所属用户,所属组,大小,最后编辑时间,文件名,详情见图。
在这里插入图片描述
那么我们最常用的操作就是修改文件或目录的所属用户与权限:

更改文件属性

chgrp:更改文件属组

chgrp [-R] 属组名 文件名

chown:更改文件属主,也可以同时更改文件属组

chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名

chmod:更改文件9个属性

可以看以下示例,工作中很多问题是因为权限不够造成的,比如这个py文件,加了777权限后,颜色为绿色,代表可执行。
在这里插入图片描述
777的具体含义(r:4,w:2,x:1),以770为例:
owner = rwx = 4+2+1 = 7
group = rwx = 4+2+1 = 7
others= — = 0+0+0 = 0

Linux 文件与目录管理

处理目录的常用命令

接下来我们就来看几个常见的处理目录的命令吧:

  • ls(英文全拼:list files): 列出目录及文件名
  • cd(英文全拼:change directory):切换目录
  • pwd(英文全拼:print work directory):显示目前的目录
  • mkdir(英文全拼:make directory):创建一个新的目录
  • rmdir(英文全拼:remove directory):删除一个空的目录
  • cp(英文全拼:copy file): 复制文件或目录
  • rm(英文全拼:remove): 删除文件或目录
  • mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
    你可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp。

Linux 文件内容查看

Linux系统中使用以下命令来查看文件的内容:

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
  • nl 显示的时候,顺道输出行号!
  • more 一页一页的显示文件内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • head 只看头几行
  • tail 只看尾巴几行

Linux 磁盘管理

Linux磁盘管理好坏直接关系到整个系统的性能问题。

Linux磁盘管理常用三个命令为df、du和fdisk。

  • df:列出文件系统的整体磁盘使用量
  • du:检查磁盘空间使用量
  • fdisk:用于磁盘分区

df

  • a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
  • k :以 KBytes 的容量显示各文件系统;
  • m :以 MBytes 的容量显示各文件系统;
  • h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
  • H :以 M=1000K 取代 M=1024K 的进位方式;
  • T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
  • i :不用硬盘容量,而以 inode 的数量来显示

示例:将 /home 底下的可用的磁盘容量以易读的容量格式显示

df -h /home

du

Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,这里介绍Linux du命令。

  • a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
  • h :以人们较易读的容量格式 (G/M) 显示;
  • s :列出总量而已,而不列出每个各别的目录占用容量;
  • S :不包括子目录下的总计,与 -s 有点差别。
  • k :以 KBytes 列出容量显示;
  • m :以 MBytes 列出容量显示;

示例:将 /home/blyang/python_code/flask_demo/ 底下的所有文件以及所占用大小以易读的容量格式显示

du -ah /home/blyang/python_code/flask_demo/

fdisk

感觉自己不常用这个,跳过

Linux vi/vim

Linux vi/vim 的详细使用方法,请查看菜鸟教程
这里说点题外话,其实我觉得你要是从事Linux相关工作,比如运维,比如内核开发,可以花一番功夫去学(其实主要是各种各样的命令需要去记)。毕竟术业有专攻,vi的高效性还是值得去学的。
如果你只是一个普通的程序员,按照我个人的经验,大部分时间都是在windows上编辑好文本,直接放到linux上就好,在windows上好用的文本编辑器实在是太多了,所以,不用太纠结这个vim的学习。
当然,技多不压身,如果比较有兴趣,当然还是掌握最好。

Linux yum 命令

yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。

基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
yum 语法
yum [options] [command] [package ...]

  • options:可选,选项包括-h(帮助),-y(当安装过程提示选择全部为 “yes”),-q(不显示安装的过程)等等。
  • command:要进行的操作。
  • package:安装的包名。

yum常用命令

    1. 列出所有可更新的软件清单命令:yum check-update
    1. 更新所有软件命令:yum update
    1. 仅安装指定的软件命令:yum install <package_name>
    1. 仅更新指定的软件命令:yum update <package_name>
    1. 列出所有可安裝的软件清单命令:yum list
    1. 删除软件包命令:yum remove <package_name>
    1. 查找软件包命令:yum search <keyword>
    1. 清除缓存命令:

yum clean packages: 清除缓存目录下的软件包
yum clean headers: 清除缓存目录下的 headers
yum clean oldheaders: 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的 headers

国内 yum 源

以 网易(163)yum源为例

安装步骤

首先备份/etc/yum.repos.d/CentOS-Base.repo
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

下载对应版本 repo 文件, 放入 /etc/yum.repos.d/ (操作前请做好相应备份)
CentOS6 :http://mirrors.163.com/.help/CentOS6-Base-163.repo
CentOS7 :http://mirrors.163.com/.help/CentOS7-Base-163.repo
CentOS8 :http://mirrors.163.com/.help/CentOS8-Base-163.repo
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
mv CentOS6-Base-163.repo CentOS-Base.repo

运行以下命令生成缓存
yum clean all
yum makecache

Shell教程

shell教程参考地址
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

第一个shell脚本

#!/bin/bash
echo "Hello World !"

运行 Shell 脚本有两种方法:

1、作为可执行程序
将上面的代码保存为 test.sh,并 cd 到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

2、作为解释器参数
这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

/bin/sh test.sh
/bin/php test.php

Shell注释

单行注释

# 这是单行注释

多行注释

:<<!
这是多行注释
这是多行注释
这是多行注释
!

变量

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="blyang"
echo $your_name
echo ${your_name}

推荐给所有变量加上花括号,这是个好的编程习惯。

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.baidu.com"
[root@poplang shell_code]# chmod +x ./test.sh 
[root@poplang shell_code]# ./test.sh 
./test.sh: line 4: myUrl: readonly variable

删除变量

your_name="blyang"
unset your_name

变量类型

运行shell时,会同时存在三种变量:

  1. 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2. 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3. shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

Shell 字符串

单双引号

单双引号都可以表示字符串,建议用双引号,双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
your_name='blyang'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

此时可以输出Hello, I know you are "blyang"!,若换成单引号则不行,另外,echo -e指输出并处理特殊字符,比如示例最后的换行符\n

拼接字符串
your_name="blyang"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3
获取字符串长度
string="abcd"
echo ${#string} #输出 4
提取子字符串
greeting="hello, "$your_name" !"
echo ${greeting:0:5}
# 输出hello
查找子字符串
echo `expr index "$greeting" b`

输出b第一次出现的位置

Shell 传递参数

示例:

#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
[root@poplang shell_code]# ./test.sh 1 "H" 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:H
第三个参数为:3

一些其它用法:

#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";

echo "参数的总个数:$#";
echo "输出所有参数:$*";

# 输出内容
:<<'
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
参数的总个数:3
输出所有参数:1 H 3
'

$* 与 $@ 区别:

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
#!/bin/bash

echo "\$*的演示:"
for i in "$*";do
        echo $i
done

echo "\$@的演示:"
for i in "$@"; do
        echo $i
done

输出:

[root@poplang shell_code]# ./test.sh a b c d
$*的演示:
a b c d
$@的演示:
a
b
c
d

Shell 数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。

#!/bin/bash

my_array=(1, B, "c", "45")
echo "第一个元素为:$my_array"  # 只打印第一个元素
echo "第二个元素为:${my_array[1]}"
echo "所有元素:${my_array[*]}"  # 此处*和@效果完全一样
echo "所有元素:${my_array[@]}"
echo "所有元素个数:${#my_array[@]}"  # 获取元素个数

:<<!
第一个元素为:1,
第二个元素为:B,
所有元素:1, B, c, 45
所有元素:1, B, c, 45
所有元素个数:4
!

Shell 基本运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符
    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
    expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):
关系运算符(大小),bool运算符(与或非),逻辑运算符(逻辑and 和 or),字符串运算符的具体使用,见Linux教程-基本运算符

[root@poplang shell_code]# vim test.sh
#!/bin/bash

a=1
b=2
# 加减乘除,注意乘需要转义符,其它不需要
val=`expr $a + $b`
echo "a + b = $val"
val=`expr $a \* $b`
echo "a * b = $val"
val=`expr $a % $b`
echo "a % b = $val"  # 注意除和取余的区别,这里是取余

# 关系运算符
if [ $a -le $b ]
then
        echo "$a -le $b:a小于等于b"
else
        echo "$a -le $b:a大于等于b"
fi

# bool运算符
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi

# 逻辑运算
if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

# 结果打印
:<<!
a + b = 3
a * b = 2
a % b = 1
1 -le 2:a小于等于b
1 小于 100 或 2 大于 100 : 返回 true
false
!

Shell echo命令

#!/bin/bash

# 显示普通字符
echo "Hello Shell"

# 显示转义字符
echo "\"Hello Shell\""

# 显示变量
read name
echo "Hello Shell $name"

# 显示换行 -e 开启转义
echo -e "Hello \n"
echo "Shell"

# 不显示换行 -e 开启转义
echo -e "Hello \c"
echo "Shell"

# 显示结果定向至文件
echo "Hello Shell" > ./myfile.txt

# 原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'

# 显示命令执行结果
echo `date`

# 输出
:<<!
Hello Shell
"Hello Shell"
Python # 这里是键盘输入
Hello Shell Python
Hello

Shell
Hello Shell
$name\"
Tue Apr 27 17:53:41 CST 2021
!

Shell printf 命令

echo可以实现的,printf都可以实现,printf 命令模仿 C 程序库(library)里的 printf() 程序。除此之外,还有它本身的一些特殊用法。
默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。

# 显示普通字符
printf "Hello C \n"

# 显示转义字符
printf "\"Hello C\"\n"

# 显示变量
read name
printf "Hello C $name\n"

# 显示换行
printf "Hello \n"
printf "C \n"

# 不显示换行
printf "Hello \t"
printf "C \n"

# 显示结果定向至文件
printf "Hello C" > ./myfile.txt

# 原样输出字符串,不进行转义或取变量(用单引号)
printf '$name\" \n'

# 显示命令执行结果
printf `date`

当然,printf还有自己一些独特的用法:

#!/bin/bash

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876

%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,以小数形式输出。

%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中 .2 指保留2位小数。

其它需要注意的地方:

# 单引号与双引号效果一样
printf '%d %s\n' 1 "abc"

# 没有引号也可以输出
printf %s abcdef

# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf %s abc def

# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"

Shell test 命令

Shell 流程控制

if else-if else fi

#!/bin/bash

a=10
b=20

if [ $a == $b ]
then
	echo "a=c"
elif [ $a -gt $b ]
then
	echo "a>b"
elif [ $a -lt $b ]
then
	echo "a<b"
else
	echo "nothing"
fi

# 输出
# a<b

for 循环

#!/bin/bash

for str in This is a string
do
    echo $str
done

:<<!
This
is
a
string
!

while 语句

条件处需两对括号:

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

双括号的意义:

语法:
((表达式1,表达式2…))
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b–等。
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while,if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开

无限循环
while true
do
	printf "Hello World!\n"clear
done
until 循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

#!/bin/bash

a=0

until [ ! $a -lt 10 ]  # 当a不小于10  为true(注意前面的!)
do
   echo $a
   a=`expr $a + 1`
done

跳出循环

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

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

break和continue的区别在于,continue会跳过本循环的此次执行,继续下一次执行。
break会终止本次循环。

Shell 函数

和其它的编程语言一样,也是先定义,再使用:

一般型函数

#!/bin/bash

demoFun(){
        echo "这是第一个Shell函数"
}

echo "函数开始执行"
demoFun
echo "函数执行结束"

等待输入型函数

值得注意的是, return后跟数值n(0-255),也就是只能返回这些数,大于255则会和预期不同。

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

传参型函数

需要注意的是,参数个数大于10个的时候,需用${n}获取,如下,
echo "第十个参数为 $10 !" 和 echo "第十个参数为 ${10} !"结果不一样,${n}是对的。

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

Shell 输入/输出重定向

输出重定向

# 最基本的输出重定向,不在屏幕上打印内容,直接输出到文件,再次运行会覆盖重写
echo "Hello" > myfile.txt

# 追加输出,不会覆盖重写
 echo "Hello Shell" >> myfile.txt

# 直接把想要的命令文档输出
chmod --help > myfile.txt

输入重定向

略,个人感觉用处不大

在这里插入代码片

/dev/null 文件

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

Shell 文件包含

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
在test2中调用test1

#!/bin/bash

func1(){
        echo "我是fun1的输出"
}

func1
#!/bin/bash

echo "第一种方法:"

source ./test1.sh

echo ”第二种方法:“
. ./test1.sh
# 输出
[root@poplang shell_code]# ./test2.sh
第一种方法:
我是fun1的输出
”第二种方法:“
我是fun1的输出

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值