禅道博客

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

Bash脚本命令

2023-12-21 15:20:08
宋辰轩
原创 633
摘要: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个.的文件
暂时没有记录
评论通过审核后显示。