热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux学习笔记3:Shell基础

1.Shell的工作原理Shell是用户和操作系统之间的接口。当用户登录系统,有一个Shell进程随之启动,并在用户注销时终止。用户输入的命令是Shell输入。处理命令的步骤:查找命令中的元字

1.Shell的工作原理

Shell是用户和操作系统之间的接口。当用户登录系统,有一个Shell进程随之启动,并在用户注销时终止。用户输入的命令是Shell输入。

处理命令的步骤:查找命令中的元字符;把这些元字符替换成对应的实际操作参数;等重新生成的指令传给内核;命令完成,提示符重新出现,等待下一条命令

查看种类:echo $SHELL

Bourne系列:Bourne Shell; Korn Shell; bash

C Shell系列:C Shell; Tcsh

 

 

2.Shell命令元字符

1通配符:用来表示文件名的某种模式,在解释时被替换成其他字符   注意与正则表达式区分

通配符

匹配内容

*

任意数量的任意字符(可以是0个)

单个任意字符

[abc]

a, b, c中的任一个字符

[a-z]

ASCII码值在a与z中间的任一个字符

[!a-z]

不在a-z范围内的任一个字符

!(fname)

除fname之外的所有文件名

!(f1|f2)

除f1和f2之外的所有文件名

练习:

ls .??*  列出.开头且长度>=3的文件,以及当前目录(.)和上级目录(..)的所有文件

rm *.c  删除.c结尾的文件

rm * .c  删除所有文件、删除名叫.c的文件

ls c*[!0-9]  列出c开头、非数字结尾的文件

cp file f[1-3]  把file,f1,f2复制到f3,f3必须是目录

cp f[1-3] file   file需要是目录

 

2转义符:当要处理的文件名或参数名中出现通配符时,需要使用转义符防止通配符起作用

a.\通配符:\*  \?  \$  \[\]  \[Enter]  [ ]

b.双引号:禁止通配符替换

  单引号:禁止通配符、变量名和命令替换

 

3.Shell命令

1命令替换:使用命令的结果替换命令;不可以是变量

a.`命令`:不支持嵌套(陈旧)

echo The current time is `date`

b.$(命令):支持嵌套,并支持与一对``嵌套

echo The current time is $(date)

 

 

2输入输出流

输入输出终端:键盘、显示器

命令的输入和输出字符流:标准输入流0、标准输出流1、标准错误流2

标准输入输出源:终端、文件、管道

 

a.重定向:

 

样例

功能

 

-

cat foo - bar

依次输出foo、标准输入、bar的内容

标准输入以Ctrl+C结束

echo 内容 >文件名

输出重定向

 

>> 

echo 内容 >>文件名

追加输出重定向

 

wc<文件名

输入重定向

 

<< 

wc <

将hello作为命令结束的关键词

 

 

2>&1

将标准错误重定向到标准输出

&理解为标准输出的引用

 

1>&2

将标准输出重定向到标准错误

 

 

示例:

cat – f2 f3 2> f4    输入重定向,f1代替键盘,依次输出-,f2,结果重定向到f3

 

b.过滤器:eg.同时用到输入流和输出流的命令

c.命令组合:使用()或{}将命令括起来,可以共享一个重定向符号

 

 

d.管道|:将一条命令的输出作为另一条命令的输入(标准)

优点:处理速度快;不产生中间文件结果

 

 

4.Shell变量

1 环境变量

声明:由Shell定义,无需声明

赋值:export 变量名=变量值 eg.export PATH=“$PATH:newpath”

引用:$变量名

查看:env

修改:在Shell中直接修改,在Shell中生效

      在启动配置文件中修改,每次登陆后生效:系统配置文件:/etc/profile;用户配置文件:~/.profile,~/.bashrc

环境变量

内容

HOME

用户目录(不同于/home)

PATH

命令执行路径,用冒号分隔,Shell会按PATH中给出的顺序搜索目录

PWD

当前工作目录的绝对路径

UID

当前用户识别号

RANDOM

一个随机数

 

2 用户自定义变量

a.变量

命名规则:字母开头,区分大小写,可包含数字与下划线

类型:shell变量都是字符串

声明与赋值:无需提前声明

 

赋值语句

赋值语义

y=${x-value}

若x有值,则y=x,否则y=value

y=${x=value}

若x有值,则y=x,否则y=x=value

y=${x+value}

若x有值,则y=value,否则不操作

y=${x?value}

若x有值,则y=x,否则在标准错误流输出value

 

引用:

变量引用

变量替换

$var

变量值

${var}

变量值

${#var}

变量值长度

 

 

字符串操作:

语句

返回值

示例: var=”~/my/f¥ile.txt”

${var#s}

去掉从左边开始第一个匹配s的子串

${var#*/}=my/file.txt

${var##s}

去掉从左边开始最后一个匹配s的子串

${var##*/}=file.txt

${var%s}

去掉从右边开始第一个匹配s的子串

${var%/*}=~/my

${var%%s}

去掉从右边开始最后一个匹配s的子串

${var%%/*}=~

${var:m:n}

提取从m位置开始往后的n个连续字符

${var:2:5}=my/fi

${var:0-n}

提取从右边开始的n位子串

${var:0-5}=e.txt

${var/s/t}

把第一个匹配s的串替换成t

${var/t/e}=~/my/file.ext

${var//s/t}

把所有匹配s的串替换成t

${var//t/e}=~/my/file.exe

 

b.运算符

数值运算:let(Shell内部命令);$((整数表达式))(Shell扩展命令);expr;bc

 

 

bc浮点数计算器

通常采用管道方式接受输入并返回结果,常用参数有:

scale=n  保留小数点后n位(整数运算除1.0后才会生效;四舍五入通过 +0.5 实现)

ibase=k  指定输入位k进制

obase=k  制定输出为k进制

 

 

c.数组

声明:declare -a 数组名

赋值:array[0]=value

array=(0 1 2 3)

array=(0 [3]=1 2)   指定下标赋值

arr[*]与arr[@]相同

echo ${arr[*]}会跳过未赋值的位置

数组索引是字符串,因此不能用01代替1

 

 

5.Shell脚本

有时候出现not found的错误是因为多打或少打了空格

将一组命令保存在文件中,然后逐条执行;可以用文本编辑器编写,直接用./name执行

 

a.解释器行:用来指定Shell种类,一般为 #!/bin/bash

 

b.命令行参数:运行脚本时给定的用户输入参数

位置参数

说明

$0

所执行命令的名字

$1--$9

命令行参数1到9的名字

$*

所有命令行参数组合成的字符串,被引号包含时,将所有参数当作整体

$@

所有命令行参数组合成的字符串,被引号包含时仍将各个参数分开

$#

命令行参数的个数

$$

当前shell的进程ID号

$?

最近一次命令的退出状态(正常0)

$!

最近一次后台进程的ID号

 

c.用户输入:read 变量表

-p  提示字符串

-n  指定数量读取

-t  指定时间内读取

-s  隐藏显示输入字符

eg.read -n 2 -t 10 -p “input your name:” name

 

d.命令退出状态

所有命令和程序都会返回一个退出状态值:正常 exit 0;错误 exit 1

可以使用参数 $? 查看上一条命令的退出状态

 

 

e.结构控制语句

• 顺序执行:命令1;命令2

• 条件执行:命令1 && 命令2  先执行命令1,若命令1成功,则执行命令2

            命令1 || 命令2  先执行命令1,若命令1失败,则执行命令2

命令成功与否取决于退出状态值

 

 

• 条件测试命令:test 缩写为[],没有任何输入,直记录退出状态值

括号本身一定要和内部的命令有一个空格

数值比较运算符

含义

-eq

等于

-ne

不等于

-gt

大于

-ge

大于等于

-lt

小于

-le

小于等于

 

字符串比较运算符

含义

=

等于

!=

不等于

-n str

字符串不为空

-z str

字符串为空

str

字符串被赋值且不为空

 

 

 

 

 

 

 

 

 

 

 

 

 

文件特性检查命令

含义

[ -e file ]

file存在

[ -f file ]

file存在并是一个常规文件

[ -d file ]

file存在并是一个目录

[ -L file ]

file存在并是一个符号链接

[ -rwx file ]

file存在且可读可写可执行

[ -s file ]

file存在且大小不为0

[ f1 -nt f2 ]

f1比f2更新

[ f1 -ot f2 ]

f1比f2更旧

[ f1 -ef f2 ]

f1被连接到f2

 

• if语句:

if 条件测试命令

then

    命令串

elif 条件测试命令

    then

        命令串

    else

        命令串

fi

 

• case语句

case 表达式 in  //支持通配符

模式1) 命令串1 ;;

模式2) 命令串2 ;;

*) 命令串n  //default

esac

 

• for语句

for 变量 in 列表

do

命令串

done

 

• while语句

while 条件测试命令

do

命令串

done

 

• until语句:当条件测试命令返回假时执行循环体

until 条件测试命令

do

命令串

done

 

• break语句:跳出循环体,执行done的下一句

 

• continue语句:跳到done的位置,重新进入循环

 

 

6.Shell函数

声明:function(){

          statements

          return value

      }

使用函数名进行调用,可在后面给出命令行参数;退出状态由return返回;可通过标准输出向调用者返回输出字符串

 


推荐阅读
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • Linux批量复制并重命名和批量复制文件到多个文件夹的方法
    本文介绍了在Linux系统下批量复制并重命名文件以及批量复制文件到多个文件夹的方法。通过使用模式匹配功能,可以方便地实现文件的批量操作。同时,还提供了有关shell语法中的()和{}的参考资料。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • LINUX学习之centos7营救模式
    今天卸载软件的时候,不小心把GNOME的一些组件给卸了,导致桌面无法正常开启,会卡在启动过程中,而我的开机启动模式又是设置为图形界面,所以一开LINUX就卡住了,进入不了命令行界面 ... [详细]
  • Linux Shell脚步的格式
    Shell脚步等多个命令的组合,可以做成一个shell文件(1.sh)赋权执行执行命令的方式前两张新的进程中执行,对当前进程不产生影响(cdtmp;pwds ... [详细]
  • 1关于字符串相邻的两个或多个字符串字面值(引号引起来的字符)将会自动连接到一起:str_catpython!str_cat输出:python!把很长 ... [详细]
  • 常用工具(一)
    1.时间戳在线转换工具(1)链接https:tool.lutimestamp(2)说明可以通过此工具:将时间戳转为具体时间点,也可以将具体时间点转为时间戳(3)效果2.JSON在线 ... [详细]
  • 查找给定字符串的所有不同回文子字符串原文:https://www ... [详细]
author-avatar
手机用户2502902345
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有