$
$$
返回PID, $是个内部变量$?
表示上一个指令的返回值$0
表示函数或者shell的第一个参数,后面类推$@
返回所有参数当读取参数个数超过9的时候需要加括号
$(10)
,这是历史原因
set unset
设置程序自定义变量(只对本shell)
unset不仅可以unset变量,也可以是函数
export
设置为全局环境变量
declare
将环境变量转成自定义变量
查找历史命令并执行
$(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}
和用双引号一个效果
输出脚本每一行执行的内容
打开这个功能,脚本执行的时候回返回每一个执行的命令
set -x #打开
set +x #关闭
expect
用于人机交互,属于密码什么的
/dev/tty
读取它会自动重定向到一个终端,这在程序必须读取人工输入(比如密码)时候特别有用
printf "Enter password"
stty -echo #关闭自动打印输入内容
read pass < /dev/tty
stty echo #打开打印输入内容
PATH中添加当前路径
PATH=:$PATH
这样会先查找本地路径,也可以用一个点,更明显一点,通常不建议这么用,会有安全问题
各种括号
$(command)
与\
command`` 是一样的,但是后者已经不建议使用${VAR} 用来执行一些变量相关的动作,前面有描述
$((expr)) 用来执行一些运算
单引号不扩展字符串中变量
双引号会扩展字符串中变量
exec
exec 2 > /tmp/file # 2重定向到file
exec 3 < /home/file #打开新文件描述符3
<>
<>
打开一个文件作为输入输出
subShell与代码块
subShell是一群被括在圆括号里的命令,这些命令会在另外的进程中执行
~~
tar -cf - . | (cd /newdir; tar -xpf -)
有意思的参数
写这样一个haha.sh
#!/bin/sh
echo $@
echo "----------"
运行下
gaoshen ~ tool ./haha.sh a x c bd e > a
gaoshen ~ tool cat a
a x c bd e
----------
gaoshen ~ tool ./haha.sh a x c bd e \> a
a x c bd e > a
----------
gaoshen ~ tool ./haha.sh a x c bd e \> a 2\>$1
a x c bd e > a 2>
----------
gaoshen ~ tool ./haha.sh a x c bd e \> a 2\>\$1
a x c bd e > a 2>$1
----------
gaoshen ~ tool
可以发现> $ 在参数里属于特殊字符 需要转义