Shell基本命令
shell简介
shell工作原理
命令: 是用户向系统内核发出控制请求,与之交互的文本流
命令行: 指的是供用户输入命令的界面,其本身只是接受输入,然后把命令传递给命令解释器。
shell:命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互。当需要重复执行若干命令,可以将这些命令集合起来,加入一定的控制语句,编辑成为shell脚本文件,交给shell批量执行
shell命令提示符格式
username@hostname:direction$
username:用户名,显示当前登录用户的账号
hostname:主机名,显示登录的主机名
direction:目录名,显示当前所处的路径,当在根目录下显示为/,当在用户主目录下显示为~
shell命令格式
command [options] argument1 argument2 ...
command:命令名称,shell命令或程序,严格区分大小写
options:命令选项,用户改变命令执行动作的类型,由-引导,可以同时带有多个选项
argument:命令参数,指出命令作用的对象或目标,由的命令允许带多个参数注意事项:
1.一条命令的三要素之间要用空格隔开
2.若将多个命令在一行书写,用分号;将各命令隔开
3.如果一条命令不能再一行写完,在行尾使用反斜杠\标明该条命令未结束
4.如果命令不带选项和参数,通常使用默认的
约定:命令提示符简写:$-普通用户,#-root用户,表示用户可以输入命令了。##注释
命令行补全
command或filename + <TAB>
- 按下Tab健,补全文件名
- 连续按下两次Tab健
如果存在多个文件和命令相同前缀,shell列出所有相同前缀的文件和命令
查询命令历史
Bash将用户曾经键入的命令序号保存在一个命令历史表中。
按上下健,可以查询命令历史 history命令
history [n]
罗列命令历史表,默认保留500条命令。
n:罗列 近的n条环境变量HISTSIZE
echo $HISTSIZE:显示历史命令的容量
HISTSIZE=1000:修改历史命令容量为1000(中间不能加空格)
通配符、管道和重定向
通配符
shell命令的通配符
通配符 | 含义 | 实例 |
---|---|---|
* | 匹配任意长度的字符串 | file_*.txt匹配:file_1.txt、file_thy.txt |
? | 匹配一个长度的字符 | file_?.txt匹配:file_1.txt、file_2.txt、file_3.txt |
[…] | 匹配其中指定的一个字符 | file_[otr]匹配:file_o.txt、file_r.txt、file_t.txt |
[-] | 匹配指定的一个字符范围 | file_[a-z]匹配:file_a.txt、file_b.txt、直到file_z.txt |
[^…] | 除了其中指定的字符均可匹配 | file_[^otr].txt:file_o.txt、file_r.txt、file_t.txt其他文件 |
管道
|:命令通过该符号连成了一个管道
命令1 | 命令2 |命令3:命令1的输出 是 命令2的输入;命令2 的输出 是 命令3的输入。
和 ; 区分
命令1 ; 命令2 :分开执行各自的操作,是没有任何关系的 cd day31 ; ls :先进目录,然后列出当前目录的文件
eg:
ls | wc -w
ls列出当前目录的文件名,作为输出给wc指令,wc -w统计有多少个单词 == 文件数量
wc:统计文档信息
-w:统计多少单词
-l:统计多少行
-m:统计多少字符
重定向
1. 重定向输入
文件名 :将该文件作为重定向的输入源。
改变了输入目标。键盘->文件 实现文件a.txt输入内容,终显示在屏幕上。
2. 重定向输出
文件名 :将该文件作为重定向的输出源,即将输出结果显示在该文件内。(采用w(新建)模 式)
文件名 :将该文件作为重定向的输出源,即将输出结果显示在该文件内。(采用a(追加)模 式)
$./test >b.txt
$./test >>b.txt
改变了输出目标。屏幕->文件
第一条:
如果文件不存在,新建文件,并且将输出内容写入到新建的文件内
如果文件存在,清除文件内容,重写新的数据内容
第二条:
如果文件不存在,新建文件,并且将输出内容写入到新建的文件内
如果文件存在,追加写入(接着后面写)
3. 组合重定向
文件 -> 文件
$./test <a.txt >b.txt ##拷贝新建
$./test <a.txt >>b.txt ##拷贝追加
改变输入目标,键盘->文件
改变输出目标,屏幕->文件
运行程序时,实现文件->文件。(复制拷贝)
$vim test.c
#include <stdio.h>
int main(int argc, const char *argv[]) {
while((ch = getchar()) != EOF ){
putchar(ch);
}
return 0;
}
$gcc test.c -o test
$./test <a.txt
$./test >b.txt
$./test >>b.txt
$./test <a.txt >b.txt ##拷贝新建
$./test <a.txt >>b.txt ##拷贝追加
注意事项
test – 可执行程序 a.txt – 数据文件
a.txt > b.txt 这写法是错误的!!!!!!!
./test > ./a.out 这样也是错的!!!
1、重定向运算符链接一个可执行程序和一个数据文件,不能用于链接一个数据文件和另一个数据 文件,也不能用于链接一个程序和另一个程序。
2、使用重定向运算符不能读取多个文件的输入,也不能把输出定向至多个文件。
3、运算符与文件名之间的空格不是必须的。
ls >b.txt