title: shell 入门学习
date: 2019/7/16 15:47:49
toc: true
shell 入门学习
linux c 一站式学习笔记
注释
使用#
注释一行
#!
在第一行称为 Shebang
,表示脚本解释器是什么,比如!# bin/bash
执行与启动
-
文件首行的
!#
不仅可以指定程序,还能指定参数#! /bin/sed -f
,增加了这个shebang
的脚本可以不用指定程序,直接使用./xxx.脚本
执行 -
man bash-builtins
查看内建命令 -
为什么需要内建命令?
shell的外部命令流程是先fork出一个shell后执行exec执行命令,fork后返回会恢复父进程的上下文,所以诸如cd等命令就不能产生效果了
-
内建命令使用
$?
读出返回的状态 -
命令行下输入的命令用()括号括起来,那么也会fork出一个子Shell执行小括号中的命令
-
使用
source xxx.sh
或者. ./xxx.sh
改变子进程,不会影响交互式(父)shell -
交互登录bash的环境变量顺序 搜索
A *login shell* is one whose
/etc/profile ~/.bash_profile, ~/.bash_login, and ~/.profile 退出 /etc/bash.bash_logout
-
交互非登陆bash读取文件
~/.bashrc
,使用--norc
禁用这个操作 -
非交互启动bash,执行子命令的fork,由环境变量
BASH_ENV
决定, 它的值当作启动脚本的文件名 -
sh启动的bash,尽量模拟上述三种bash
- 带有
--login
,模拟交互登录bash的环境变量顺序,/etc/profile ~/.profile
- 交互bash,展开变量
if [ -n "$ENV" ]; then . "$ENV"; fi
- 非交互Shell启动,例如
#! /bin/sh
,则不执行任何启动脚本
- 带有
变量
-
*
匹配0或者任意个字符 -
?
匹配一个任意字符 -
[xxx]
,匹配方括号中任意一个字符的一次出现 -
` 和 $() 命令代换明显执行后计算结果复制变量
- `$(())`变量转换为整数,只能做加减乘除的整数运算
- 转义字符是`\`,shell输入时还表示换行继续
- 创建带有`-`开头的文件`touch -- -a.c`
- 双引号用于保持引号内所有字符的字面值(回车也不例外),但以下情况除外:
```
$加变量名可以取变量的值
反引号仍表示命令替换
$表示$的字面值
\`表示`的字面值
"表示"的字面值
\表示的字面值
除以上情况之外,在其它字符前面的无特殊含义,只表示字面值
-
$0 命令本身 $1、 $2.. 参数 $# 参数个数,不包括$0 $@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。 $? 上一条命令的Exit Status $$ 当前Shell的进程号 shift shift 3表示原来的$4现在变成$1,不带参数的shift命令相当于shift 1
语法
参考
/etc/init.d/
下的脚本
if
then
elif
then
else
fi
case $xxx in
a)
...
;;
b)
...
;;
*)
esac
for xxx in xxxx
done
while xxx;do
xxx
done
-
true =0,false=1,这与c语言相反
-
命令
test
和[
可以测试条件是否成立 -
$?
是退出状态 -
-eq(等于) -ne(不等于) -lt(小于) -le(小于等于) -gt(大于) -ge(大于等于)
-
测试表达式的连接符号 ! 逻辑反 -a 与 -o 或
-
作为一种好的Shell编程习惯,应该总是把变量取值放在双引号之中,比如
"$VAR"
,p602 linuxc 一站式编程 -
多个命令在一行用
;
隔开,一行一个命令不需要;
-
:
是一个特殊的命令,称为空命令,该命令不做任何事,但Exit Status
总是真 -
&&
相当于“if...then...”
,而||
相当于if not...then...
-
$1
shell中第一个参数,$0
为命令自身,$#
是参数个数,布包裹$0
-
函数体的左花括号{和后面的命令之间必须有空格或换行,如果将最后一条命令和右花括号}写
在同一行,命令末尾必须有;号,函数调用不写括号 -
mkdir $DIR > /dev/null 2>&1
,这里先将标准输出重定位到null
,然后标准错误输出也到标准输出,使用&
的原因是这里是引用标准输出,不加引号的话就是1这个文件了
调试
-n | 读取不执行.类似编译 |
---|---|
-v | 一边执行,一遍打印标准错误 |
-x | 打印执行的每句话和结果 |
使用
$ sh -x ./script.sh
#! /bin/sh -x
脚本中设置,set -x和set +x分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试
#! /bin/sh
if [ -z "$1" ]; then
set -x
echo "ERROR: Insufficient Args."
exit 1
set +x
fi