Bash脚本命令
- 2022-11-22 09:30:00
- 宋辰轩
- 原创 413
简介
Bash是目前最常用的shell,本文使用Ubuntu 20.04LTS,在终端中输入以下代码查看当前是否为bash
echo $SHELL
第一个bash脚本
创建一个hello.sh文件,写入
#!/bin/bash # 国际惯例上来先hello world echo 'hello world'
保存该文件,使用bash hello.sh
运行此文件即可
快捷键
Ctrl + L
:清除屏幕并将当前行移到页面顶部。Ctrl + C
:中止当前正在执行的命令。Shift + PageUp
:向上滚动。Shift + PageDown
:向下滚动。Ctrl + U
:从光标位置删除到行首。Ctrl + K
:从光标位置删除到行尾。Ctrl + W
:删除光标位置前一个单词。Ctrl + D
:关闭 Shell 会话。↑
,↓
:浏览已执行命令的历史记录。
模式扩展
~
波浪线扩展,是当前的用户主目录
#输出当前用户的主目录 echo ~
?
问号扩展,任意单个字符
#输出5个字符的php文件,如model.php ls ?????.php #如果要匹配的文件在子目录下,需要使用*/匹配子目录,但这种匹配方式不会匹配当前目录 ls */?????.html.php
*
星号扩展,任意字符(包含0个)
#输出所有php后缀的文件 ls *.php #输出当前目录的所有文件 ls * #如需输出隐藏文件,可使用ls .* ls .* #如果要匹配的文件在子目录下,需要使用*/匹配子目录,但这种匹配方式不会匹配当前目录 ls */*.php
[]
方括号扩展,括号之间的任意一个字符
[ab]
表示可以匹配a或b,[!ab]
表示匹配不是a和b的字符。
如果需要匹配[
字符,可以放在方括号内,比如[[aeiou]
。如果需要匹配连字号-
,只能放在方括号内部的开头或结尾,比如[-aeiou]
或[aeiou-]
(要和start-end扩展区分开)
#输出所有以c开头的php文件 echo [c]*.php #输出最后一位不是l的php文件,虽然*是任意一个,但后面加一个[]也就是除了最后一位的任意一个 echo *[!l].php
[start-end]
start-end扩展
表示一个连续的范围,如[a-d]
表示a,b,c,d;[0-3]
表示0,1,2,3。这种简写形式有一个否定形式[!start-end]
,表示匹配不属于这个范围的字符。比如,[!a-zA-Z]
表示匹配非英文字母的字符。
[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.
开头,后面是三个数字的文件名。
{}
大括号扩展
大括号扩展{...}
表示分别扩展成大括号里面的所有值,各个值之间使用逗号分隔。比如,{1,2,3}
扩展成1 2 3
。
echo {1,2,3}.txt # 1.txt 2.txt 3.txt echo {1,2{3,4}} # 1 23 24 echo log-{,b,c} # log- log-b log-c echo /{bin,l*} # 输出了根目录下的bin和以l开头的文件 /bin /lib /lib32 /lib64 /libx32 /lost+found
{start..end}
{start..end}扩展
大括号扩展有一个简写形式{start..end}
,表示扩展成一个连续序列。比如,{a..z}
可以扩展成26个小写英文字母。
数字前面若使用前导0,则输出的每一项都有前导0。
可以使用第二个双点号{start..end..step}
来定义步长
#常用于批量建目录 mkdir {2010..2022}-{1..12} echo {01,5} # 01 02 03 04 05 echo {0..8..2} # 0 2 4 6 8
#!/bin/bash # 还常用于循环 for i in {1..4} do echo $i done
子命令扩展
$()可以扩展一个子命令的运行结果
echo $(date) # 打印当前的时间 echo $(ls) # 打印当前目录下的文件
字符类
[[:class:]]
表示一个字符类,扩展成某一类特定字符之中的一个
[[:alnum:]]
:匹配任意英文字母与数字[[:alpha:]]
:匹配任意英文字母[[:blank:]]
:空格和 Tab 键。[[:cntrl:]]
:ASCII 码 0-31 的不可打印字符。[[:digit:]]
:匹配任意数字 0-9。[[:graph:]]
:A-Z、a-z、0-9 和标点符号。[[:lower:]]
:匹配任意小写字母 a-z。[[:print:]]
:ASCII 码 32-127 的可打印字符。[[:punct:]]
:标点符号(除了 A-Z、a-z、0-9 的可打印字符)。[[:space:]]
:空格、Tab、LF(10)、VT(11)、FF(12)、CR(13)。[[:upper:]]
:匹配任意大写字母 A-Z。[[:xdigit:]]
:16进制字符(A-F、a-f、0-9)。
echo [[:upper:]]* //匹配所有大写开头的文件
量词语法
需要打开extglob,使用shopt extglob
查看是否打开,若关闭,则使用shopt -s extglob
打开
?(pattern-list)
:模式匹配零次或一次。*(pattern-list)
:模式匹配零次或多次。+(pattern-list)
:模式匹配一次或多次。@(pattern-list)
:只匹配一次模式。!(pattern-list)
:匹配给定模式以外的任何内容。
ls *?(.)php # 匹配以php结尾的,前面有0或1个.的文件
暂时没有记录