🌕写在前面
- 🍊博客主页:Scorpio_m7,github
- 🎉欢迎关注🔎点赞👍收藏⭐️留言📝
- 🌟本文由 Scorpio_m7原创,CSDN首发!
- 📆首发时间:🌹2023年4月14日🌹
- ✉️坚持和努力一定能换来诗与远方!
- 🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢感谢感谢!
文章目录
shell的种类
- b-shell,早期unix的标准shell,/bin/sh
- c-shell,c语言特点
- k-shell:korn shell,/bin/ksh,支持带类型的变量,数组
- bash,bourne again shell,是Linux标准shell,/bin/bash,b-shell扩展,吸收c-shell特点
shell的功能
- shell是命令解释器
- 文件名替换,命令替换,变量替换
- 历史替换,别名替换
- 流程控制的内部命令(内部命令和外部命令)
shell的特点
- 主要用途:批处理,执行效率比算法语言低
- shell编程风格和c语言等算法语言的区别
- shell是面向命令处理的语言,提供的流程控制结构通过对一些内部命令的解释实现
- shell设计精炼,但是提供灵活机制(策略与机制相分离)。提供shell替换实现,例如:流程控制所需的条件判断,四则运算,都由shell之外的命令完成
- 重定向与管道
- 方便交互使用的功能:历史替换与别名替换
- shell变量
- shell的变量替换,命令替换,文件名替换
- 元字符,如:单双引号
- 流程控制
- 子程序
启动bash
- 注册shell
- 交互式shell(键入bash命令)
- 脚本解释器
自动执行的一批命令 (用户偏好)
- 当bash作为注册shell被启动时,自动执行用户主目录下的.bash_profile文件中命令,~/.bash_profile或$HOME/.bash_profile,umask之类的命令应当在.bash_profile文件中
- 当bash作为注册shell被退出时,自动执行$HOME/.bash_logout
- 当bash作为交互式shell启动时,自动执行$HOME/.bashrc
自动执行的一批命令(系统级,比用户级高)
当bash作为注册shell启动时,自动执行/etc/profile文件中命令
当bash作为交互式shell启动时,自动执行/etc/bash.bashrc
当bash作为注册shell退出时,自动执行/etc/bash.bash.logout
脚本文件
三种方法都启动/bin/bash,新创建子进程,并在子进程中执行脚本
-
bash<lsdir(无法携带参数)
-
bash lsdir
bash -x lsdir
bash lsdir /usr/lib/gcc
-
chmod u+x lsdir
./lsdir /usr/lib/gcc
在当前shell中执行脚本(会修改当前bash的路径)
- . lsdir /usr/lib/gcc
- source lsdir /usr/lib/gcc
#lsdir
if [ $# = 0 ]
then
dir=.
else
dir=$1
fi
find $dir -type d -print
echo '-----------'
cd $dir
pwd
历史表
先前键入的命令存于历史表,编号递增,FIFO刷新。表大小由变量HISTSIZE设定,修改HISTSIZE的配置应放入~/.bashrc
history查看历史表($HOME/.bash_history)
- 上下键替换命令
- !! 引用上一条命令
- !str 以str开头的最近用过的命令,如:!v
别名替换
在别名表中增加一个别名,应把alias命令放入.bashrc
alias dir="ls -flad"
TAB键补全
首个单词TAB建补全搜索$PATH下的命令,其他单词搜索当前目录下文件
输入重定向
-
<filename:从文件中获取stdin,例如:sort<1.txt
-
<<word:从shell脚本文件获取数据直到遇到定界符word,如脚本word.sh:
cat << word * now : `date` * my home directory is $HOME word pwd
定界符中的内容需要加工替换,date会打印当前时间。程序运行结果如下:
root@ubuntu:~/Desktop# ./word.sh * now : Sat Jan 21 22:35:26 PST 2023 * my home directory is /root /root/Desktop
如果不想定界符中的内容发生替换,将脚本改成:
cat << 'word' * now : `date` * my home directory is $HOME word pwd
-
base64 <<< test:将test字符串作为输入就行base64编码后输出
输出重定向与管道
- 程序的标准输入是stdin,fd=0
- 程序的标准输出是stdout,fd=1
- 程序的标准错误输出是stderr,fd=2
使用系统调用(原始I/O)的程序举例
#include <string.h>
#include <unistd.h>
int main(void)
{
static char *str1="string1\n";
static char *str2="string2\n";
for(int i=0;i<3;i++){
write(1,str1,strlen(str1));//向标准输出写入
write(2,str2,strlen(str2));//向标准错误输出写入
}
}
stdout输出重定向
- **>**filename:将stdout重定向到文件filename,若文件存在则覆盖内容
- **>>**filename:将stdout重定向追加到filename尾
stderr输出重定向
- 2>filename:将文件句柄2重定向到文件
- 2>&1:将文件句柄2重定向到文件描述符1指向的文件