特殊字符
#号
行首以#为开头注释(#!例外)
1 # This line is a comment.
注释也可以存在于本行命令的后边.
1 echo "A comment will follow." # 注释在这里
2#
^ 注意#前边的空白


 echo $(( 2#101011 ))
# 数制转换,不是一个注释
8
echo ${PATH#*:}
/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

另外,标准的引用和转义字符 “”  \ 可以用来转义 #

;分号
用来在一行中写多个命令
[root@centos129 ~]# echo test ; echo test
test
test

终止case选项 用双分号 ;;

终止"case"选项.
1
2
3
4
case "$variable" in
abc) echo "\$variable = abc" ;;
xyz) echo "\$variable = xyz" ;;
esac

.作为文件名的一部分.如果作为文件名的前缀的话,那么这个文件将成为隐藏文件.
将不被 ls 命令列出.

.命令如果作为目录名的一部分的话,那么.表达的是当前目录.".."表示上一级目录.

“ 部分引用字符串 阻止一部分特殊字符
’ 全引用, 阻止全部特殊字符

逗号链接了一系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被
返回.
如:
1 let "t2 = ((a = 9, 15 / 3))"
# Set "a = 9" and "t2 = 15 / 3"
\
转义字符,如\X 等价于"X"或'X'
/
文件名路径分隔符.或用来做除法操作.
`
后置引用,命令替换

:
空命令,等价于"NOP"(no op,一个什么也不干的命令).也可以被认为与 shell 的内建命令
(true)作用相同.":"命令是一
个 bash 的内建命令,它的返回值为 0,就是 shell 返回的 true.
在 if/then 中的占位符,如:
1 if condition
2 then : # 什么都不做,引出分支.
3 else
4
take-some-action
5 fi
"变量扩展/子串替换"
在和 > (重定向操作符)结合使用时,把一个文件截断到 0 长度,没有修改它的权限.
如果文件在之前并不存在,那么就创建它.如:
1 : > data.xxx
#文件"data.xxx"现在被清空了.
2
3 #与 cat /dev/null >data.xxx 的作用相同
4 #然而,这不会产生一个新的进程,因为":"是一个内建命令.
具体参见 Example 12-14.
错误检查,所以可以在注释行中写任何东西.然而,使用:的话将不会这样.如:
1 : This is a comment thar generates an error,(if [ $x -eq 3] ).


":"还用来在/etc/passwd 和$PATH 变量中用来做分隔符.
bash$ echo $PATH
/usr/local/bin:/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games

!

    取反操作符[叹号, 即!]. !操作符将会反转命令的退出码的结果, (具体参见例子 6-2). 也会反转测试操作符的意义, 比如修改"等号"( = )为"不等号"( != ). !操作符是Bash的关键字.

* 算数操作符
求幂运算的话使用**
?测试操作符,在一个特定的表达式中?用来测试一个条件的结果
$变量替换
如:
test=1
echo $test
#:1

${} 参数替换

$*,$@
位置参数
()
命令组
如:
echo (test=1 ; echo $test)
在括号中的命令将会作为一个子shell来运行!
在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的. 父进程, 也就是脚本本身, 将不能够读取在子进程中创建的变量, 也就是在子shell中创建的变量.


大括号扩展.

  1 cat {file1,file2,file3} > combined_file
  2 # 把file1, file2, file3连接在一起, 并且重定向到combined_file中.
  3
  4
  5 cp file22.{txt,backup}
  6 # 拷贝"file22.txt"到"file22.backup"中

       

    在大括号中, 不允许有空白, 除非这个空白被引用或转义.

    echo {file1,file2}\ :{\ A," B",' C'}

    file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C


1 a=123
  2 { a=321; }
  3 echo "a = $a"   # a = 321   (说明在代码块中对变量a所作的修改, 影响了外边的变量)
  4


代码快和IO重定向
#!/bin/bash
#从文件中读取
File=/tmp/haha
{
read line1
read line2
} < $File
echo "first line in $File is:"
echo "$line1"
echo
echo "second line in $File is:"
echo "$line2"
exit 0
~        
[root@centos129 tmp]# bash test.sh
first line in /tmp/haha is:
//

second line in /tmp/haha is:
// named.caching-nameserver.conf

练习讲一个代码快的结果保存到文件中去
#!/bin/bash
#rpm-check.sh
#这个脚本的目的是为了描述列表和确定是否可以安装一个rpm包
#在这个文件中保存输出
#这个脚本使用一个代码快来展示
SUCCESS=0
E_NOARGS=65
if [ -z "$1" ]  #如果第一个参数为空就echo+exit -z是字符串为空
        then
echo "Usage: `basename $0` rpm-file"
        exit $E_NOARGS
fi
{
echo
echo "Archive Description"
rpm -qi $1 #查询说明
echo
echo "Archive listing:"
rpm -ql $1 #查询列表
echo
rpm -qa  $1 #查询rpm包是否可以被安装
if [ "$?" -eq $SUCCESS ]
        then
echo "$1 can be installed"                #{}大括号中的代码讲不会开启一个新的子shell
        else
echo "$1 cannot be installed"
fi
echo

} > "$1.test" #把代码快中的所有输出都重定向到文件中去
echo "Results of rpm test in file $1.test"
exit 0


{}\;
路径名一半在find命令中使用

[]条件测试,条件测试表达式放在[]中,这是shell中的test命令不是/usr/bin/test



[] 数组元素
如:
数组元素.

在一个array结构的上下文中, 中括号用来引用数组中每个元素的编号.

  1 Array[1]=slot_1
  2 echo ${Array[1]}

|

    管道. 分析前边命令的输出, 并将输出作为后边命令的输入. 这是一种产生命令链的好方法

如 cat *.test | sort | uniq
如 cat $test $test1 | grep $test2
也可以讲输出命令传递到脚本中去
如:cat test.sh
tr 'a-z' 'A-Z'
exit 0


ls -l | ./test.sh
总计 64
DRWX------ 3 ROOT ROOT   4096 02-06 09:48 GCONFD-ROOT
-RW-R----- 1 ROOT ROOT   1230 02-13 09:09 HAHA
-RW-R--R-- 1 ROOT ROOT  12043 02-13 10:00 HTTPD.TEST
DRWX------ 2 ROOT ROOT   4096 02-06 09:48 KEYRING-2QWUBU
DRWX------ 2 ROOT ROOT   4096 01-06 11:03 KEYRING-MH64KU
DRWX------ 2 ROOT ROOT   4096 02-01 11:44 KEYRING-OGMBW2
DRWX------ 2 ROOT ROOT   4096 01-07 16:46 KEYRING-OM0BDE

|| 或的意思 如果测试中任意一边结果为真的话,操作就会返回0
&后台运行

[root@centos129 tmp]# cat test.sh
#!/bin/bash
#后台循环程序
for i in 1 2 3 4 5 6 7  8 9 10
        do
echo -n "$i "
done &
#后台运行这个循环,在第2个循环之后将在默写时候执行
echo
for i in 11 12 13 14 15 16 17 1819 20
do
        echo -n "$i "
done

[root@centos129 tmp]# bash test.sh
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 1819 20 [root@centos129 tmp]#

&&

    与-逻辑操作. 在一个条件测试结构中, 只有在条件测试结构的两边结果都为true的时候, &&操作才会返回0(代表sucess).