#
注释行首以#开头为注释(#!是个例外).- 表示注释
- 在引号中间和#等表示#本身
- echo ${PATH#*:} # 参数替换,不是一个注释
- echo $(( 2#101011 )) # 数制转换,不是一个注释
;
命令分隔符,可以用来在一行中来写多个命令.- 命令分隔,在一行中写多个命令 echo “aa” ; echo “bb”
- 在条件中的if和then如果放在同一行,也用;分隔
;;
终止”case”选项- .
- 命令:source
- 文件名的前缀,隐藏文件
- 目录:.当前目录,..父目录
- 正则表达式:匹配任意单个字符
”
“STRING”将会阻止(解释)STRING中大部分特殊的字符’
全引用. ‘STRING’ 阻止了全部特殊字符,
逗号链接了一系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被 返回.\
转义字符,如\X 等价于”X”或’X/
文件名路径分隔符.或用来做除法操作`
后置引用,命令替换:
- 空命令
- 还用来在/etc/passwd 和$PATH 变量中用来做分隔符
- !
取反操作符 - *
- 通配符
- 数学乘法
- ** 是幂运算
- ?
- 测试操作
- (())结构可以用来做数学计算或者是写 c 代码,那?就是 c 语言的 3 元操作符的 一个
- 在正则表达式中一样匹配任意的单个字符
- $
- 变量替换
- 在正则表达式中作为行结束符
- ${}
参数替换 - $* #@
位置参数 - $?
退出状态变量.$?保存一个命令/一个函数或者脚本本身的退出状态 - $$
进程 ID 变量.这个$$变量保存运行脚本进程 ID - ()
命令组 - {}
- 大括号扩展
- 代码块
#!/bin/bash
# 从 /etc/fstab 中读行
File=/etc/fstab
{
read line1
read line2
} < $File
echo "First line in $File is:"
echo "$line1"
echo
echo "Second line in $File is:"
echo "$line2"
exit 0
#!/bin/bash
# rpm-check.sh
# 这个脚本的目的是为了描述,列表,和确定是否可以安装一个 rpm 包.
# 在一个文件中保存输出.
#
# 这个脚本使用一个代码块来展示 8
SUCCESS=0
E_NOARGS=65
if [ -z "$1" ]
then
echo "Usage: `basename $0` rpm-file"
exit $E_NOARGS
fi
{
echo
echo "Archive Description:"
rpm -qpi $1 # 查询说明
echo
echo "Archive Listing:"
rpm -qpl $1 # 查询列表
echo
rpm -i --test $1 # 查询 rpm 包是否可以被安装
if [ "$?" -eq $SUCCESS ]
then
echo "$1 can be installed."
else
echo "$1 cannot be installed."
fi
echo
} > "$1.test" # 把代码块中的所有输出都重定向到文件中
echo "Results of rpm test in file $1.test"
# 查看rpm的man页来查看rpm的选项
exit 0
- []
- test
- 数组元素
- 字符范围
Array[1]=slot_1
echo ${Array[1]}
- [[]]
test - (())
数学运算符的扩展 - > >> >& &> <
重定向
- scriptname >filename 重定向脚本的输出到文件中.覆盖文件原有内容.
- command &>filename 重定向 stdout 和 stderr 到文件中
- command >&2 重定向 command 的 stdout 到 stderr
- scriptname >>filename 重定向脚本的输出到文件中.添加到文件尾端,如果没有文件, 则创建这个文件.
- <<
用在here document - <<<
重定向,用在”here string” - <, >
ASCII 比较 - \<, >
正则表达式中的单词边界 - |
管道.分析前边命令的输出,并将输出作为后边命令的输入 - >|
强制重定向 - ||
或-逻辑操作 - &
后台运行命令
#!/bin/bash
#background-loop.sh
for i in 1,2,3,4,5,6,7,8,9,10
do
echo -n "$i"
done&
echo "finish 1-10"
for i in 11,12,13,14,15,16,17,18,19,20
do
echo -n "$i"
done
echo "finish 11-20"
exit
#--------------------------------------------------------
#期望的输出应该是
#1 2 3 4 5 6 7 8 9 10
#11 12 13 14 15 16 17 18 19 20
#然而实际的结果有可能是
#11 12 13 14 15 16 17 18 19 20
#1 2 3 4 5 6 7 8 9 10 bozo $
#(第 2 个'echo'没执行,为什么?)
#也可能是
#1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#(第 1 个'echo'没执行,为什么?)
#非常少见的执行结果,也有可能是:
#11 12 13 1 2 3 4 5 6 7 8 9 10 14 15 16 17 18 19 20
#前台的循环先于后台的执行
- -
- 之前工作的目录 cd -
- 算术减号
- 用于重定向 stdin 或 stdout
tar -cvf - /home | tar -xvf -tdout
tar -cvf - /home 将home打包到stdout(-)
| 管道,即前一命令的输出为后一命令输入
tar -xvf - 从stdin(-)解包
#!/bin/bash
#备份最后一天修改的文件
BACKUPFILE=backup-$(date +%m-%d-%Y)
archive=${1:-$BACKUPFILE}
tar cvf - `find . -mtime -1 -type f -print` >$archive.tar
gzip $archive.tar
echo "Directory $PWD backed up in archive file\"$archive.tar.gz\"."
exit 0
- =
算术等号 - +
- 算术加号,也用在正则表达式中
- 选项,对于特定的命令来说使用”+”来打开特定的选项,用”-“来关闭特定的选项
- %
算术取模运算.也用在正则表达式中 - ~
home 目录.相当于$HOME 变量 - ~+
当前工作目录,相当于$PWD 变量 - ~-
之前的工作目录,相当于$OLDPWD 内部变量 - ^
行首,正则表达式中表示行首.”^”定位到行首