禅道博客

分享专业技术知识,文章内容干货满满

Bash脚本命令

2022-11-22 09:30:00
宋辰轩
原创 50
摘要:Bash是目前最常用的shell,本文使用Ubuntu 20.04LTS来介绍bash脚本的相关命令。

简介

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]* :所有以abc 字符之一开头的文件名。
  • 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个.的文件
发表评论
评论通过审核后显示。