注解
Shell是一种命令解释器,它不仅分离了用户层与操作系统内核,更是一门强大的编程语言。脚本是一种易于使用的工具,它能够将系统调用、工具软件、实用程序和已编译的二进制文件联系在一起构建程序。
基础¶
注解
Shell是一种命令解释器,它不仅分离了用户层与操作系统内核,更是一门强大的编程语言。脚本是一种易于使用的工具,它能够将系统调用、工具软件、实用程序和已编译的二进制文件联系在一起构建程序。
扩展¶
路径名扩展¶
列出大写开头的文件列表,包括目录名。
$ ls -d [[:upper:]]*
Desktop Documents Downloads Pictures
路径名扩展不会包含隐藏文件。
$ ls -d *
Desktop Documents Downloads Pictures bin code doc icon
如果要显式所有隐藏文件(包括目录),需要显式过滤掉 .
和 ..
,并且 .
后面的文件名至少包含一个字符。
$ ls -d .[!.]?*
.vim .vimrc .bash_history .bashrc
其中, ls -d
显示目录名,而不进入目录进行罗列。
波浪线扩展¶
~
:$HOME
主目录~horance
:horance
用户的主目录~+
: 等价于$PWD
当前目录~-
: 等价于$OLDPWD
上一个当前目录;如果$OLDPWD
为空,则显式~-
$ echo ~horance
$ echo ~
$ echo $HOME
$ echo ~+
$ echo ~-
花括号扩展¶
批量创建子目录:
$ mkdir -p cub/{include,src,test}
$ mkdir -p date/{2000..2020}-{01..09}
备份文件,后缀名追加 .bak
$ cp /etc/apt/sources.list{,bak}
在大括号中, 不允许有空白, 除非这个空白被引用或转义。
$ echo file{1,2}{\ A," B",' C'}
参数扩展¶
打印PATH条目,每个目录一行:
$ echo $PATH | tr ':' '\n'
追加PATH搜索路径:
$ export PATH="$HOME/.cargo/bin:$PATH"
当存在上下文歧义时,需要使用 ${var}
引用变量的值。
#! /bin/bash
for fn in 1 2 3 4 5; do
touch /tmp/rep${fn}port.txt # 否则,将引用$fnport变量的值
done
rm -r /tmp/rep{1..5}port.txt
引用数组元素时,必须显式指定 ${arr[*|id]}
。
#! /bin/bash
nums=(1,2,3,4,5)
for fn in ${nums[*]}; do
touch /tmp/rep${fn}port.txt # 否则,将引用$fnport变量的值
done
rm -r /tmp/rep{1..5}port.txt
命令替换¶
$(cmd)
`cmd`
$(cmd)
将在子Shell中执行命令,并捕获其输出。例如:
$ ls -d /usr/bin/* | grep zip
/usr/bin/bzip2
/usr/bin/gzip
/usr/bin/unzip
/usr/bin/zip
然后,使用 file
获取文件类型。
$ file $(ls -d /usr/bin/* | grep zip)
/usr/bin/bzip2: Mach-O 64-bit executable x86_64
/usr/bin/gzip: Mach-O 64-bit executable x86_64
/usr/bin/unzip: Mach-O 64-bit executable x86_64
/usr/bin/zip: Mach-O 64-bit executable x86_64
历史扩展¶
$ history | grep "find"
798 2020-10-01 11:59:34 find . -name "*.log" -print0
$ !978 # 等价于执行 find . -name "*.log" -print0
其中, !!
引用上次执行的命令:
$ !!
历史扩展在脚本中被禁止的,仅用于交互式环境。
命令¶
注解
Shell是一种命令解释器,它不仅分离了用户层与操作系统内核,更是一门强大的编程语言。脚本是一种易于使用的工具,它能够将系统调用、工具软件、实用程序和已编译的二进制文件联系在一起构建程序。
脚本¶
注解
Shell是一种命令解释器,它不仅分离了用户层与操作系统内核,更是一门强大的编程语言。脚本是一种易于使用的工具,它能够将系统调用、工具软件、实用程序和已编译的二进制文件联系在一起构建程序。