Bash 初学

Tags
linuxbash
Created
Jul 15, 2018 11:11 AM

shell 脚本简单教程:https://blog.techbridge.cc/2019/11/15/linux-shell-script-tutorial/

跨平台项目不要使用 bash 命令

unix 下的一种 shell

image

bash 256颜色索引:

https://en.wikipedia.org/wiki/File:Xterm_256color_chart.svg

Bit 7 6 5 4 3 2 1 0

Data R R R G G G B B

bash shell 的命令分为两类:外部命令和内部命令。外部命令是通过系统调用或独立的程序实现的,如 sed、awk 等等。内部命令是由特殊的文件格式(.def)所实现,如 cd、history、exec 等等。

有两种方法执行shell scripts,一种是新产生一个 shell,然后执行相应的 shell scripts;一种是在当前 shell 下执行,不再启用其他shell(source命令)。

// 文件头部含有 #!/usr/bin/node, 直接在shell(前面不能加sh,加了就是指定解释器) 中执行 ./tem.js(需可执行权限) 时 sh 可以调用node 来执行。

系统调用 exec 是以新的进程去代替原来的进程,但进程的PID保持不变。因此,可以这样认为,exec 系统调用并没有创建新的进程,只是替换了原来进程上下文的内容。原进程的代码段,数据段,堆栈段被新的进程所代替。

exec 1>tem // 重新设置标准输出, 屏蔽 stdout 和 stderr: command > /dev/null 2>&1

  • I/O 重定向通常与FD有关,shell的 FD 通常为10个,即0~9;
  • 三个常用FD(默认与keyboard、monitor、monitor有关):
  • /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃
说明
0
stdin,标准输入
1
stdout,标准输出
2
stderr,标准错误输出

shell 中传含有通配符的参数推荐用''包含

. 前缀的文件是*nix的隐藏文件

文件夹路径使用/,选项前缀-(全名选项前缀--),#注释

“—” 参数(单独的)用来指示本命令行“选项”参数的结束,所有位于“--”后面的参数代表“文件名”或执行此“文件”需要的“参数”。如:

  • git checkout -- 文件1 文件2 文件3
  • lua -E -- 脚本.lua 参数1 参数2 参数3

TAB 键(已经能确定文件)即可自动补全

: 是一个占位符, 不产生任何输出

nohup(忽略hup信号// setsid 开个不属于终端子进程的进程 // disown -h调度已有job(s))+ & : 忽略终端关闭发送的hup信号后台运行,不过终端关闭之后jobs就看不到进程了,只能通过ps查看。

使用disown命令之后,还有一个问题。那就是,退出 session 以后,如果后台进程与标准I/O有交互,它还是会挂掉。(比如console.log),因为后台任务继承自当前session的标准i/o,disown并没有改变这一点。可以自己改变标准输入输出

subshell:将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行,将"&"也放入“()”内效果跟setsid命令一样

& “后台”运行(终端关闭就没了),ctrl+z 挂起进程,jobs 得到任务号,用fg %x恢复, bg %x(将一个在后台暂停的命令,变成在后台继续执行);

& 后台运行的进程有 log 输出会自动将进程调到前台来,ctrl+c 不会退出而是推到后台

&& 成功退出后连续执行。; 总是执行后面的命令

|| 仅当左侧出口状态为非零(即 false)时,它才会评估右侧

$ 系统环境变量,如输出PATH:echo $PATH,echo $? 上一条命令运行的错误码(正确为0)

unset 删除环境变量

<> 输入输出重定向命令(命令后面的定向到前面的命令)

| 管道命令(将前面命令的输出作为后一个命令的输入)

  • 代表标准输出(跟tee一个意思?),选项/&和-之间可以省略空格,但是参数和-之间不能省略

\ 换行

>> 重定向并追加到文件。如:echo "127.0.0u.com">>hosts

命令替换,将一个命令的输出作为另一个命令的参数 command1 `command2`

ctrl+c 退出进程(发送了系统信号SIGINT?)

ctrl+d 退出××(传递SIGTEM信号,sort wc命令都可以不带参数等待用户输入ctrl+d在处理输入数据)

(cd /root && echo $PWD) 使用子 shell 执行命令,可以指定当前工作目录

  • -help 显示命令帮助

uname 显示系统信息 // unix name

su 切换用户,ubuntu默认不能切换到root,需要sudo passwd设置root密码

ls列出文件,-a显示所有,-l显示详情,-s显示大小,R递归显示,F文件类型标识

cd 移动工作目录

cp 复制文件 -f 静默覆盖,-r/R:递归复制目录及其子目录内的所有内容

pushd 切换目录(先 pushd <path>添加到栈,+<n>)

dirs 显示栈目录,-c清除栈

popd 从栈中弹出目录

pwd 当前工作目录(并非脚本执行目录)

mkdir 创建文件夹 -p 创建多层次目录,-m 指定目录权限

rmdir 删除指定空目录,-p指定目录中的多层次空目录

stat 查看文件状态

touch 创建文件或者更新文件状态

mv 移动文件(相同文件夹下用作重命名),-f 强制覆盖,-u更新

rm 删除文件,-d 删除目录,-i 提示,-r 递归删除,-f 强制删除

cat 显示文件内容,-n 显示行号,-b 对空行不编号

head -5 file 看文件的前5行

tail 看尾, 参数 -f/F 使 tail 不停地去读最新的内容

watch 以周期性的方式执行给定的指令,如 watch cat file,输出全屏显示,-n 指定执行间隔,-d 高亮不同之处

uniq:去重后显示文件内容,-c 显示出现次数 -d 仅显示重复行 -u 仅显示没重复行

watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示

来自: http://man.linuxde.net/watch

watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示

来自: http://man.linuxde.net/watch

watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示

来自: http://man.linuxde.net/watch

watch命令以周期性的方式执行给定的指令,指令输出以全屏方式显示

来自: http://man.linuxde.net/watch

sed 非交互式处理文件,sed -i 1a\sd tem 在 tem 第一行添加一行 sd,-s 替换

awk 处理文本文件 // '{print $1,$4}' 每行按空格或 TAB 分割,输出文本中的 1、4 项

wc 统计指定文件中的行数(-l)、单词数(-w)、字节数(-c), 并显示出来

sort 排序文件中的行,-o 修改源文件,-r 降序,-u 去除重复行,-n 以数字来排序,-t 分隔符再 -k 制定列数 -f 忽略大小写,-b 忽略空白,-M 按月份(英文)

chmod  [-vR] [ugoa] [+-=] [rwx] 修改文件权限,如 sudo chmod a+rwx st

// chmod -x *.pl 添加多个文件执行权限

iconv 转换文件编码,-f,-t 输入输出格式,-o 输出文件夹,-s 关闭警告

which git-shell 查看 git-shell 实际运行的程序位置 // whereis

see 用系统配置文件 /etc/mailcap 或用户配置文件 ~/.mailcap 打开文件,类似的还有 xdg-open(与Nautilus 保持一致)

select-editor // 选择默认播放器。

shell 脚本(先由bash执行)顶部#!指定该脚本内容执行程序

#!/bin/sh

"/D/Program Files/Sublime Text/sublime_text.exe" $1 &

$1获取bash中的参数,&表示非阻塞式的后台运行

mktemp 生成临时文件,返回临时文件绝对路径

trap 命令用来在 Bash 脚本中响应系统信号

bash(shell) 脚本:

不用写行结束符,不能计算浮点

VAR=55             # 将整数55赋值给变量VAR

((++VAR))          #自增

echo $((VAR * 22)) # VAR乘以22并将结果送入命令

...                #太复杂了

login故名思义,即登陆,login shell是指用户以非图形化界面或者以ssh登陆到机器上时获得的第一个shell,简单些说就是需要输入用户名和密码的shell。因此通常不管以何种方式登陆机器后用户获得的第一个shell就是login shell。

interactive意为交互式,这也很好理解,interactive shell会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。所以一般来说只要是需要用户交互的,即一个命令一个命令的输入的 shell都是interactive shell。而如果无需用户交互,它便是non-interactive shell。通常来说如bash script.sh此类执行脚本的命令就会启动一个non-interactive shell,它不需要与用户进行交互,执行完后它便会退出创建的shell。

  • 登陆机器后的第一个shell:login + interactive
  • 新启动一个shell进程,如运行bash:non-login + interactive
  • 执行脚本,如bash script.sh:non-login + non-interactive
  • 运行头部有如#!/usr/bin/env bash的可执行文件,如./executable:non-login + non-interactive
  • 通过ssh登陆到远程主机:login + interactive
  • 远程执行脚本,如ssh user@remote script.sh:non-login + non-interactive
  • 远程执行脚本,同时请求控制台,如ssh user@remote -t 'echo $PWD':non-login + interactive
  • 在图形化界面中打开terminal:
  • Linux上: non-login + interactive

    Mac OS X上: login + interactive

#!/usr/bin/env sh 指定解释器,当bash以是sh命启动时,bash会尽可能的模仿sh(包括配置文件的加载方式)

SuperMade with Super