Shell学习之Shell特性
目录
命令和文件自动补齐功能
命令历史记忆功能 history、上下键、!number、!string、!$、!!
别名功能 alias、unalias cp、~username/.bashrc、\cp -rf /etc/hosts
快捷键 ^R ^D ^A ^E ^L ^U ^K ^S ^Q
前后台作业控制
输入输出重定向
输入与输出
管道 | tee
命令排序
命令和文件自动补齐功能
这个不说了,我们在输入命令的时候,按tab键补全。
命令历史记忆功能 history、上下键、!number、!string、!$、!!
history:历史命令记录 上下键:切换历史命令 !number:执行对应number的历史命令 !string:重新执行一遍含有string的最近的历史命令 !$: !!:执行上一条命令
别名功能 alias、unalias cp、~username/.bashrc、\cp -rf /etc/hosts
alias:查看临时别名 alias 别名='命令':定义别名 unalias 别名:删除别名 \命令 [选项] [参数]:跳过别名,如果这个命令定义了别名,但是你不想使用别名,可以这么用
另外定义永久的别名: 超级用户root的配置文件:.bashrc 普通用户的配置文件:~username/.bashrc (前面这个符号代表家目录)
快捷键
^R:搜索历史命令,通过命令里包含的字符 ^D:退出,相当于exit ^A:将光标移到最前面 ^E:将光标移到后面 ^L:删除光标后面一个字符 ^U:删除光标前面一个字符 ^K:截去光标后面的内容 ^S:锁屏 ^Q:解屏
前后台作业控制
&命令
注: 1.需要用户交互的命令不要放在后台执行,否则机器一直等待输入 2.后台程序在执行时,执行结果仍然会输出到屏幕,干扰我们的工作, 建议将这样的信息重定向到某个文件 3.在命令后面加上&可以将命令放到后台执行,如果退出终端,则无效,只在本次会话有效
将这段代码放到后台执行,直接在后面加&。
sleep 300 & 如果让这个命令能在下次登陆也能生效,怎么解决? 在命令前面加上nohup nohup sleep 6000 &
screen命令
,生成一个会话,可以一直使用 比如我们登陆到一个linux系统,先生成一个会话,不会影响你现在的工作,你该干什么干什么,会记录所有当前会话内容,下次登陆,可以切换到你上次工作的会话下。 screen:生成一个会话 screen -s [会话名]:生成一个命名的会话 screen -list:查看所有会话 screen -r [number]:切换会话
辅助命令
我们知道当有任务在前台工作时,任务会占用终端,你此时不能在终端工作,除非你再开启一个终端 ^C:杀掉正在运行的前台任务 ^Z:将正在运行的前台任务暂停到后台 bg:让任务在后台工作,bg [number] fg:让任务回到前台工作,fg [number] kill number:给pid为number的进程发信息 kill %[number]:给当前shell中作业号为number的发信息 ps: 列出系统中正在运行的进程 jobs:查看当前有多少在后台运行的命令
输入输出重定向
当我们在shell中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描述符来引用这些文件:
系统中实际上有12个描述符,可以任意使用文件描述符3-9 标准输入 对应文件描述符0,是命令的输入,默认是键盘 标准输出 对应文件描述符1,是命令的输出,默认是终端 标准错误 对应文件描述符2,是命令错误的输出,默认是终端
利用文件重定向功能对命令的标准输入,输出和错误进行修改: 常用文件重定向命令: command >file: 标准输出重定向到一个文件,错误仍然输出屏幕 command >>file: 标准输出重定向到一个文件(追加) command 1>file1: 标准输出重定向到一个文件 command 2>>file2: 标准错误重定向到一个文件(追加) command 1>file 2>&1: 标准输出和标准错误一起重定向到一个文件 command 1>>file 2>&1: 标准输出和标准错误一起重定向到一个文件(追加) command < file1 >file2:以file1做为标准输入,file2做为标准输出 command <file: 以file做为文件标准输入 注:上面的command>file 2>&1 可以修改为command>file 2>>file
例子
重定向标准输出: 例: ls –l >>myfile.out 重定向标准输入: 例: sort < name.txt > name.out 从name.txt读入数据进行排序,然后将排序结果输出到文件name.out中 重定向标准错误 例: ls ddd 2> /dev/null ddd不存在,标准错误信息会输送到系统垃圾箱,而不会输送到屏幕如果标准错误信息有用,可以将其存放到错误文件中 使用文件重定向功能将MySQL-client-5.0.16-0.i386.rpm的包说明信息追加到 mysql_install.log 文件中。 rpm -qi MySQL-client-5.0.16-0.i386.rpm >>mysql_install.log 使用文件重定向功能将ls ddd的错误信息保存在错误日志error.log文件中, 说明:ddd 目录并不存在。 ls ddd 2>error.log 编写脚本,实现功能:读取文件myfile中一行数据,并通过echo打印出来 #!/bin/bash read data </root/myfile echo $data
输入和输出
输出echo
echo命令:用来显示文本行或变量取值,或者把字符串输入到文件中。 格式:echo string echo的常用功能:\c不换行 \f不进纸 \t跳格 \n换行 注意: 对于linux系统,必须使用-e选项来使以上转义符生效 例:$echo -e "hello\tboy" $hello boy echo命令对特殊字符敏感,如果要输出特殊字符,需要用\屏蔽特殊含义 常用的特殊字符:双引号"" 例:$echo "\"\"" $""
例子
编写shell脚本,借助echo命令分别输出系统中SHELL,PATH变量的取值 脚本: echo $SHELL,$PATH 编写shell脚本,使用一个echo命令输出如下格式的内容(注意对齐格式): id name msg 01 mike "hello" 02 john "hi" 脚本: echo -e "id\tname\tmsg\n01\tmike\t\"hello\"\n02\tjohn\t\"hi\""
输入read
从键盘或者文件的某一行文本读入信息,并将其赋给一个变量。 格式:read var1 var2 ...
注意:如果输入的值个数多于变量的个数,多余的值会赋给最后一个变量。
例子
编写shell脚本,实现功能:接收用户输入的值,并显示在屏幕。 脚本: #!/bin/bash read name echo $name 编写shell脚本,使用read命令读取user和password变量 第一次:输入 mike 1234567 第二次:输入 mike 第三次:输入mike john 123456 分别使用echo命令查看user,password的取值,比较有何不同? 脚本: #!/bin/bash read user password echo $user $password
管道 | tee
管道
可以通过管道把一个命令的输出传递给另一个命令做为输入 格式:命令1 | 命令2 示例:cat test.txt | grep 'hello'
例子
编写shell脚本,对文件file1,file2,file3内容合并,并对每行进行编号。 脚本: cat -n file1 file2 file3 > file4.txt
tee命令
把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中,如果想看到输出的同时,把输出也同时拷入一个文件,这个命令很合适。 格式:tee -a file -a 表示文件追加到末尾 file 表示保存输出信息的文件 tee命令一般和管道符 | 结合起来使用 例子:who | tee who.info 该命令的信息返回在屏幕上,同时保存在文件who.info中
例子
1.使用tee命令将当前系统中所有进程信息保存到文件pid_info中 脚本: #!/bin/bash top | tee pid_info 2.使用tee命令和who命令将当前系统中登陆的终端信息追加到文件login_info中 脚本: #!/bin/bash who | tee -a login_info
命令排序
如果你想在执行多个命令,可以使用下面三种分隔符 ; && || ; 不具备逻辑判断,不关心前面的命令是否执行成功,后面的命令怎样都会执行 示例:cd;cat file && 具备逻辑判断,前面的命令执行成功,后面的命令才能执行 || 具备逻辑判断,前面的命令执行不成功,后面的命令才能执行