Matthew Note

SHELL Command/Script Notes

$

  • $$ 返回PID, $是个内部变量
  • $? 表示上一个指令的返回值
  • $0 表示函数或者shell的第一个参数,后面类推
  • $@ 返回所有参数
  • 当读取参数个数超过9的时候需要加括号$(10),这是历史原因

set unset

  • 设置程序自定义变量(只对本shell)
  • unset不仅可以unset变量,也可以是函数

export

设置为全局环境变量

declare

将环境变量转成自定义变量

查找历史命令并执行

1
$(history | grep -E '^ +1148' | awk -F' ' '{$1="";print}')

参数扩展

  • ${param:-default} 如果param为空,就把他设置成default
  • ${ #param} 给出param长度
  • ${var:-string}: 若变量var为空,则用在命令行中用string来替换${var:-string},否则变量var不为空时,则用变量var的值来替换${var:-string}
  • ${var:=string}: 替换规则和${var:-string}是一样的,所不同之处是${var:=string}若var为空时,用string替换${var:=string}的同时,把string赋给变量var:${var:=string}很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。
  • ${var:+string}的替换规则和上面的相反,即只有当var不是空的时候才替换成string,若var为空时则不替换或者说是替换成变量 var的值,即空值。(因为变量var此时为空,所以这两种说法是等价的)
  • ${var:?string}替换规则为:若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。

变量

变量仅仅在声明时、赋值时、被删除时(unset)、被导出时(export),算术运算中使用双括号结构时或在代表信号时(signal,查看样例 32-5)才不需要有 $ 前缀。赋值可以是使用 =(比如 var1=27),可以是在 read 语句中,也可以是在循环的头部(for var2 in 1 2 3)。1

变量即使在双引号””中被引用也不会影响变量替换。我们称之为部分引用,有时候也称弱引用。而使用单引号’’引用时,变量将会作为字符串显示,变量替换也不会发生。我们称之为全引用,有时也称强引用。${var}和用双引号一个效果

输出脚本每一行执行的内容

打开这个功能,脚本执行的时候回返回每一个执行的命令

1
2
set -x #打开
set +x #关闭

expect

用于人机交互,属于密码什么的

/dev/tty

读取它会自动重定向到一个终端,这在程序必须读取人工输入(比如密码)时候特别有用

1
2
3
4
printf "Enter password"
stty -echo #关闭自动打印输入内容
read pass < /dev/tty
stty echo #打开打印输入内容

PATH中添加当前路径

PATH=:$PATH 这样会先查找本地路径,也可以用一个点,更明显一点,通常不建议这么用,会有安全问题

各种括号

  • $(command)\command`` 是一样的,但是后者已经不建议使用
  • ${VAR} 用来执行一些变量相关的动作,前面有描述
  • $((expr)) 用来执行一些运算
  • 单引号不扩展字符串中变量
  • 双引号会扩展字符串中变量

exec

1
2
exec 2 > /tmp/file # 2重定向到file
exec 3 < /home/file #打开新文件描述符3

<>

<>打开一个文件作为输入输出

subShell与代码块

subShell是一群被括在圆括号里的命令,这些命令会在另外的进程中执行

~~
tar -cf - . | (cd /newdir; tar -xpf -)
~~