ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Bash

2022-02-27 01:32:19  阅读:131  来源: 互联网

标签:Shell 扩展 echo abc Output txt Bash


Prerequisite

Bash 是 Unix 系统和 Linux 系统的一种 Shell(命令行环境),是目前绝大多数 Linux 发行版的默认 Shell

Shell 这个单词的原意是“外壳”,跟 kernel(内核)相对应,比喻内核外面的一层,即用户跟内核交互的对话界面

Shell 是一个程序,提供一个与用户对话的环境,这个环境只有一个命令提示符,让用户从键盘输入命令,所以又称为命令行环境(command line interface,简写为 CLI),用户还可以用 Shell 命令写出各种小程序,又称为脚本(script)

Shell 的种类

历史上,主要的 Shell 有下面这些:

  • Bourne Shell(sh)
  • Bourne Again shell(bash)
  • C Shell(csh)
  • TENEX C Shell(tcsh)
  • Korn shell(ksh)
  • Z Shell(zsh)
  • Friendly Interactive Shell(fish)
# 查看当前运行的 Shell
echo $SHELL

# 查看当前的 Linux 系统安装的所有 Shell
cat /etc/shells

# 查看本机的 Bash 版本
bash --version

命令行环境 -- 终端模拟器

终端模拟器”(terminal emulator)就是一个模拟命令行窗口的程序,让用户在一个窗口中使用命令行环境

不同 Linux 发行版(准确地说是不同的桌面环境)带有的终端程序是不一样的,比如 KDE 桌面环境的终端程序是 konsole,Gnome 桌面环境的终端程序是 gnome-terminal,用户也可以安装第三方的终端程序

命令行环境 -- 命令行提示符

# 初始界面
[user@hostname] $

# 这是我 Win 上的 WSL
# ubuntu@LAPTOP-B5FOUNH6

上面例子中,完整的提示符是[user@hostname] $,其中前缀是用户名(user)加上@,再加主机名(hostname

基本语法

echo 命令

多行输出

echo "<HTML>
    <HEAD>
          <TITLE>Page Title</TITLE>
    </HEAD>
    <BODY>
          Page body.
    </BODY>
</HTML>"

-n 参数

取消末尾的回车符

echo -n a;echo b

# Output:ab

-e 参数

解释引号(双引号和单引号)里面的特殊字符

echo -e "Hello\nWorld"

# Output:
# Hello
# World

加个注释

echo HelloWorld # Annotation

# Output:HelloWorld

空格

Bash 使用空格(或 Tab 键)区分不同的参数,但不区分空格(多个)与 Tab 键

分号

使得一行可以放置多个命令

快捷键

  • Ctrl + L:清除屏幕并将当前行移到页面顶部。
  • Ctrl + C:中止当前正在执行的命令。
  • Ctrl + U:从光标位置删除到行首。
  • Ctrl + K:从光标位置删除到行尾。

模式扩展

Bash 是先进行扩展,再执行命令,模式扩展早于正则表达式出现,可以看作是原始的正则表达式,Bash 内置了共八个扩展

开启扩展 / 关闭扩展

# 开启扩展
set -o noglob
set -f

# 关闭扩展
set +o noglob
set +f

波浪线扩展

# 波浪线 ~ 会自动扩展成当前用户的主目录
echo ~

# 进入 /home/me/foo 目录
cd ~/foo

# 相当于 pwd
echo ~+

? 字符扩展

# ? 字符代表文件路径里面的任意单个字符
ls ?.txt

# Output:a.txt b.txt

* 字符扩展

# * 字符代表文件路径里面的任意数量的任意字符,包括零个字符
ls *.txt

# Output:a.txt b.txt ab.txt

# 彩蛋

# 如果想输出当前目录的所有文件,相当于 tree -L 2
ls *

# 显示所有隐藏文件
echo .*

方括号扩展

# 匹配括号之中的任意一个字符
ls [ab].txt

# Output:a.txt b.txt

[start-end] 扩展

# 字面意思的扩展
ls [a-c].txt

# Output:
a.txt
b.txt
c.txt

# 常用简写的例子
# [a-z]:所有小写字母
# [a-zA-Z]:所有小写字母与大写字母
# [a-zA-Z0-9]:所有小写字母、大写字母与数字
# [abc]*:所有以a、b、c字符之一开头的文件名
# program.[co]:文件program.c与文件program.o
# BACKUP.[0-9][0-9][0-9]:所有以BACKUP.开头,后面是三个数字的文件名

大括号扩展

# 输出大括号里面的所有值
echo d{a,e,i,u,o}g

# Output:dag deg dig dug dog

# PS:大括号内部的逗号前后不能有空格,否则大括号扩展会失效

{start..end} 扩展

# 表示扩展成一个连续序列
echo Number_{1..5}

# Output:Number_1 Number_2 Number_3 Number_4 Number_5

# 支持逆序
echo {c..a}

# Output:c b a

# 常见用途为新建一系列目录(下面例子共创建 9 个文件夹)
mkdir {2020..2022}-{01..03}

# 可以指定扩展的步长
echo {0..8..2}

# Output:0 2 4 6 8

变量扩展

# 字面意思的扩展
echo ${SHELL}
echo $SHELL

# Output:/bin/bash

子命令扩展

# 扩展成另一个命令的运行结果,该命令的所有输出都会作为返回值
echo $(date)

# Output:Tue Jan 28 00:01:13 CST 2020

算术扩展

# 字面意思的扩展
echo $((2 + 2))
# Output:4

字符类

# 输出所有大写字母开头的文件名
echo [[:upper:]]*

量词语法

# extglob 参数打开时才能使用
# 查看参数是否打开
shopt extglob

# 打开 extglob 参数
shopt -s extglob

# ?(.) 匹配零个或一个点
ls abc?(.)txt

# Output:abctxt abc.txt

# ?(def) 匹配零个或一个def
ls abc?(def)

# Output:abc abcdef

# +(.txt|.php) 匹配文件有一个.txt或.php后缀名
ls abc+(.txt|.php)

# Output:abc.php abc.txt abc.txt.txt

# +(.txt) 匹配文件有一个或多个.txt后缀名
ls abc+(.txt)

# Output:abc.txt abc.txt.txt

# !(b) 表示匹配单个字母b以外的任意内容
ls a!(b).txt

# Output:a.txt abb.txt ac.txt

shopt 命令

# 打开某个参数
shopt -s [optionname]

# 关闭某个参数
shopt -u [optionname]

# 查询某个参数关闭还是打开
shopt [optionname]
# dotglob 参数可以让扩展结果包括隐藏文件

# nullglob 参数可以让通配符不匹配任何文件名时,返回空字符
# 命令:rm b* => rm (当前目录不包括 b 开头的文件名时)

# failglob 参数使得通配符不匹配任何文件名时,Bash 会直接报错,而不是让各个命令去处理
# 命令:rm b* => Bash 直接报错 (当前目录不包括 b 开头的文件名时)

# extglob 参数使得 Bash 支持 ksh 的一些扩展语法

# nocaseglob 参数可以让通配符扩展不区分大小写

# globstar 参数可以使得**匹配零个或多个子目录
# 命令:**/*.txt == *.txt  +  */*.txt  +  */*/*.txt

引号和转义

# 反斜杠可以将单行命令改成多行
ls \
-a

# 相当于 ls -a

单引号

单引号用于保留字符的字面含义(各种特殊字符在单引号里面,都会变为普通字符)

echo '*'
# Output:*

echo '$USER'
# Output:$USER

echo '$((2+2))'
# Output:$((2+2))

echo '$(echo foo)'
# Output:$(echo foo)

双引号

双引号相比单引号规则宽松(这三个字符:美元符号($)、反引号(`)和反斜杠(\),在双引号之中依然有特殊含义)

echo "$SHELL"
# Output:/bin/bash

echo "`date`"
# Output:Mon Jan 27 13:33:18 CST 2020

echo "I'd say: \"hello!\""
# Output:I'd say: "hello!"

# 另一个常见的使用场合是,文件名包含空格
touch "two words.txt"

# 会保存多余的空格
echo "this is a     test"

# Output:this is a     test

# 会保存原始命令的输出格式
echo "$(cal)"

# Output:
   November 2021
Su Mo Tu We Th Fr Sa
    1  2  3  4  5  6
 7  8  9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Here 文档

是一种输入多行字符串的方法,格式如下:

<< name
text
name
# 文档内部只支持 反斜杠符号(转义)和美元符号(变量替换)
foo='hello world'
cat << _example_
$foo
"$foo"
'$foo'
_example_

# Output:
hello world
"hello world"
'hello world'

# 不希望发生变量替换,把 Here 文档的开始标记放在单引号之中即可
foo='hello world'
cat << '_example_'
$foo
"$foo"
'$foo'
_example_

# Output:
$foo
"$foo"
'$foo'

# Here 文档的本质是重定向(将字符串重定向输出给某个命令)

command << token
  string
token

# 等同于

echo string | command

# PS:但是上述 command 不包括 echo

Here 字符串

作用是将字符串通过标准输入,传递给命令【感觉没什么用~】

cat <<< 'hi there'

# 等同于

echo 'hi there' | cat

剩下的

懒得学了。。。

标签:Shell,扩展,echo,abc,Output,txt,Bash
来源: https://www.cnblogs.com/CourserLi/p/15456392.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有