Linux-Shell函数和图形菜单
Linux-Shell函数和图形菜单背景此前讲述的都是单一脚本运行所有的命令,其中不乏一些重复的代码,如果是少量的都还好,但是一旦面对大批量重复的代码时就会显得很啰嗦,所以此处就讲到在Linux中使用Shell函数,从而降低重复代码的编写工作。
同样,为了便于更加友好的使用Shell脚本,还可以创建图形菜单,本文也对该内容进行了简要描述。
全文笔记来源于《Linux命令行与Shell编程大全》
内容Shell函数与其它语言类似,在shell中也可以编写函数,它的定义方式如下:
123456789# 方式1:借助关键字funcationfuncation name { commands}# 方式2:直接定义name() { commands}
比如:
12345678funcation print { echo "who you are"}# 也可以print() { echo "who you are"}
当我们需要调用函数的时候,则直接写 ...
Linux-数据和信号
Linux-数据展示和信号背景在shell中,数据的展示方式有两种,一种是在终端上,还有一种是记录在文件中,这些在Linux中都是借助标准文件描述符实现,本文会对这些标准文件描述符做简要记录。同时在Linux中,是通过信号与进程中运行的程序进行交互,本文也会对此做简要记述。全文参考《Linux命令行与Shell编程大全》
内容数据展示在shell中文件描述符是一个非负数整数,并且在一个进程中最多可以有9个文件描述符,分别对应于:0~8,但是由于一些原因,在bash shell中保留了前三个文件描述符:0、1、2,分别对应于:标准输入(STDIN)、标准输出(STDOUT)、标准错误输出(STDERR)。
STDIN可以理解为我们常见的shell输入,比如我们直接在shell终端输入,或者通过文件读取。STDOUT可以理解为shell命令的输出,STDERR可以理解为命令运行报错时的输出,STDOUT和STDERR都是一样的输出,但是在Linux中,将其区分开对待。
对于STDIN,默认情况下是通过终端进行输入,但是也可以通过<、<<进行修改,比如:
12345# 则c ...
Linux-Shell交互
Linux-Shell交互背景此前讲述的一直都是Shell脚本中的内容,并没有涉及到脚本与人之间的交互,本文主要对Shell交互部分的内容做了一些笔记,内容参考于《Linux命令行与Shell编程大全》
内容命令行传参在shell中,如果需要向脚本中传递参数,有两种方式,一种是通过脚本运行期间的交互进行输入,还有一种是直接在启动脚本时就将对应的参数就传递给脚本,先对第二种方案进行描述,其传递的格式如下:
12# var表示传递的参数./run.sh var1 var2 var3 ...
此时,对于run.sh脚本而言,它会接受到命令行传递的参数,并且将其依次记录在变量:$1 ~ $9中,当然,如果传递的参数超过了9个,则可以通过${10}的方式再次获取传递的其他参数,譬如:
12total=$[ $1 * ${11} ]echo "the result is $total"
不过,如果传递的参数内容中有空格,则需要用单引号/双引号对其进行包裹,否则shell会将其解读为多个参数。比如:
1./run.sh "sh ...
Linux-Shell循环
Linux-Shell循环背景之前在《Linux-shell与环境变量》中,讲述了条件判断语句,那么还缺少循环结构,本文就对shell中的循环结构做简要描述。笔记源自于《Linux命令行与shell编程基础》
内容for循环条件判断固然解决了多情况下难以统一解决方案的问题,但是对于重复劳作的问题却还没有解决,所以shell中还有循环结构的命令:for、while、until。针对for命令的结构如下:
1234for var in listdo commandsdone
for循环中的list说是一个列表,既可以是列表变量,也可以是直接的列表内容,但本质上就是一个字符串,比如:
12345# 直接将列表的值写在了in后面for i in alabama alaska linux shell wahahado echo "the var is $i"done
同样可以借助于变量
12345678# 请注意,for默认使用空格、换行符、制表符作为列表元素的间隔符var="alabama alaska linux shell wahaha&quo ...
Linux-Shell脚本基础
Linux-Shell脚本基础背景此前讲述的都是基于命令行的Linux命令,其实那些都是非常常用的,也是基础中的基础。本文基于之前的内容,讲述关于shell编程的一些语言基础和相关的结构化命令,如:条件判断、循环。
内容脚本基础之前我们讲,通过;可以在一行之中同时编辑多条命令运行,并且通过()可以将多条命令整合成一条命令运行起来,那么在shell脚本中如何运行多条命令呢?如下:
123#!/bin/bashwhowhoami
在shell中,#起注释作用,除了首行以外,首行的#!/bin/bash表示运行该脚本所使用的程序。编写完成以后,如果你直接运行该文件(run.sh),则会提示command not found,这个是因为我们没有将shell脚本所在的路径纳入到PATH搜索环境中。解决方案如下:
1PATH=$PATH:$(pwd)
或者,如果不想修改PATH的搜索路径,则通过指定脚本具体的路径来运行
1./run.sh
但是这么运行的话,会提示Permission denied,这是因为该文件没有可执行权限,所以需要追加执行权限
1chmod u+x run.sh
在s ...
Linux-软件包安装
Linux-软件包安装背景全文针对Linux系统下软件包的更新、安装、升级做简要叙述。本文环境是Ubuntu 20.10,它基于dpkg,如果使用的是CentOS,则不适用。
内容在Linux系统中,当我们想要查看某一个软件的相关信息,则可以通过apt命令:
12345678910111213141516171819202122apt show [包名]# 执行后,可获得如下结果:Package: vimVersion: 2:8.1.2269-1ubuntu5Priority: optionalSection: editorsOrigin: UbuntuMaintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>Original-Maintainer: Debian Vim Maintainers <pkg-vim-maintainers@lists.alioth.debian.org>Bugs: https://bugs.launchpad.net/ubuntu/+filebugIn ...
Linux-权限系统
Linux-权限系统背景本文对Linux下的权限管理进行简要的描述,阅读书籍是《Linux命令行与Shell脚本大全》
内容以前学的时候,讲到/etc/passwd文件存放了用户的信息,但是牵扯到密码的隐私问题,所以文件中只用x取代了原密码位,而真实存放密码的文件是/etc/shadow,仔细查看内容如下:
12# 列举了其中的一条test:$1$wesgrt55$QT8CyMTQnzH66xIL1CqHj.:18599:0:99999:7:::
其中用:间隔了9个子段,含义分别如下:
123456789第1位:用户名第2位:加密后的密码第3位:上次修改密码后过去的天数(与1970/1/1相比)第4位:多少天后允许修改密码第5位:多少天后必须修改密码第6位:过期前多少天提醒用户修改密码第7位:密码过期多少天后,账户被禁用第8位:用户账户被禁用的日期(与1970/1/1相比)第9位:预留位
这两个文件都是可以通过编辑器进行修改的,但是强烈不建议,因为一旦格式出了问题,那么所有的用户都将无法登录,因此建议通过指定的命令进行修改,比如添加用户,则可以使用useradd:
12# user ...
Linux-Shell
Linux-Shell背景本文主要赘述Linux下Shell、环境变量相关的知识,以及对Linux下一些快捷方式的描述。
内容shell命令行以前在创建用户的时候,说到将用户的登录终端修改为/bin/bash,因为它的终端对于用户而言更加友好,实际上,在Linux下可以调用任意的shell终端:
12345# 比如使用/bash/dash终端,则/bash/dash# 此时相当于创建了一个子shell,需要退出的话,则:exit
如果我们想要在一行中同时执行多条命令,则可以使用;将命令间隔开:
1[命令];[命令];[命令];[命令]...
使用上述的方式,在shell中就会依次执行命令,而并不是当成一条shell命令在执行。如果希望将上述命令绑定成一条命令执行,则用小括号包裹命令:
1([命令];[命令];([命令];[命令])...)
如果你想检验这个是不是真的绑定微一条命令在执行,则可以通过$BASH_SUBSHELL变量的返回值判断:
12# 返回值为0,则表示不是一个shell命令,非0表示是一个shell命令([命令];[命令];([命令];[命令]);echo $B ...