Bash
2022/2/27 6:22:55
本文主要是介绍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
剩下的
懒得学了。。。
这篇关于Bash的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南