您的位置:首页 > 运维架构 > Shell

shell高级编程(2)——特殊字符

2017-09-20 11:13 447 查看
#

注释行首以#开头为注释(#!是个例外).

表示注释

在引号中间和#等表示#本身

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 内部变量

^

行首,正则表达式中表示行首.”^”定位到行首
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: