linux-5

shell 特殊字符
2010-08-09 11:35
1、{} 大括号:
用法一:通配符扩展
eg: ls my_{finger,toe}s
这条命令相当于如下命令的组合:
ls my_fingers my_toes
eg: mkdir {userA,userB,userC}-{home,bin,data}
我们将得到 userA-home, userA-bin, userA-data, userB-home, userB-bin,userB-data,userC-home, userC-bin, userC-data,这几个目录
用法二:可用于语句块的构造,语句之间用回车隔开。如果你想在某些使用单个语句的地方(比如在AND或OR列表中)使用多条语句,你可以把它们括在花括号{}中来构造一个语句块。
eg:
{
grep -v "$cdcatnum" $strack_file > $temp_file
cat $temp_file > $strack_file
echo
cat -n file1
} (注:以上大括号中的四句命令够成了一个语句块)
用法三:参数扩展
${name:-default} 使用一个默认值(一般是空值)来代替那些空的或者没有赋值的变量name;
${name:=default}使用指定值来代替空的或者没有赋值的变量name;
${name:?message}如果变量为空或者未赋值,那么就会显示出错误信息并中止脚本的执行同时返回退出码1。
${#name} 给出name的长度
${name%word} 从name的尾部开始删除与word匹配的最小部分,然后返回剩余部分
${name%%word} 从name的尾部开始删除与word匹配的最长部分,然后返回剩余部分
${name#word} 从name的头部开始删除与word匹配的最小部分,然后返回剩余部分
${name##word} 从name的头部开始删除与word匹配的最长部分,然后返回剩余部分
(注,name为变量名,word为要匹配的字符串)
用法三在处理字符串和未知变量时,是很有用的。


2、[] 中括号:

用法一:通配符扩展:
允许匹配方括号中任何一个单个字符
eg: ls /[eh][to][cm]*
相当于执行 ls /etc /home(若有/eom目录,就相当于会执行ls /etc /home /eom)
注:在mkdir命令下不能扩展
用法二:用于条件判断符号:
[]符号可理解为指向test命令的一个软链接,所以其用法可完全参照test,将test位置替换为[便可。
eg: if [ "$?" != 0 ] 等价于 if test "$?" != 0
then echo "Executes error"


3、`command` 反引号:`command`与$(command)的含义相同,都是返回当前执行命令的结果

eg: #!/bin/sh
for file in $(ls f*.sh);do
lpr $file
done
exit 0
该例实现了扩展f*.sh给出所有匹配模式的文件的名字。


4、'string' 单引号 和 "string" 双引号

双引号:如果想在定义的变量中加入空格,就必须使用单引号或双引号,
单、双引号的区别在于双引号转义特殊字符而单引号不转义特殊字符
eg: $ heyyou=home
$ echo '$heyyou'
$ $heyyou ($没有转义)
eg: $ heyyou=home
$ echo "$heyyou"
$ home (很明显,$转义了输出了heyyou变量的值)


5、$# 它的作用是告诉你引用变量的总数量是多少;

    $$ 它的作用是告诉你shell脚本的进程号;
$* 以一个单字符串显示所有的脚本传递的参数。等价于$1 $2 $3.......;
$@ 与$*基本类似(参见序号7),但在数组赋值时有些不同;
$? 前一个命令的退出码;
$- 显示shell使用的当前选项;
$! 最后一个后台运行的进程ID号。


6、$((...))语法:对括号内的表达式求值

eg:
#!/bin/sh
x=0
hile [ "$x" -ne 10 ];do
echo $x
x=$(($x+1))
done
exit 0


7、shell中几种特殊的参数变量的引用

$1、$2、$3……${10}、${11}、${12}…… :表示脚本传入的的各个参数,注意当需表示两位数以后的参数时数字要用花括号括起。
$@ 列出所有的参数,各参数用空格隔开
$*: 列出所有的参数,各参数用环境变量IFS的第一个字符隔开


8、命令列表:

AND列表   statement1   &&   statement2   &&    statement3     && …:只有在前面所有的命令都执行成功的情况下才执行后一条命令
OR列表 statement1 || statement2 || statement3 || …:允许执行一系列命令直到有一条命令成功为止,其后所有命令将不再被执行
eg:#!/bin/sh
touch file_one
rm -f file_two
if [ -f file_one ] && echo "hello" && [ -f file_two ] && echo " there"
then
echo "in if"
else
echo "in else"
fi
exit 0
上例的输出为:
hello
in else
关于AND列表与OR列表,在逻辑判断中很使用,下面就举一个其最常用的例子:
[ condition ] && command for true || command for false:
当条件为真时,执行commandfor true ,当条件为假时,执行command for false


9、: 冒号:内建空指令,返回值为0

eg: $ :
$ echo $?
$ 0
while: (该语句结构可实现一个无限循环)


10、; 分号: 在 shell 中,担任"连续指令"功能的符号就是"分号"

eg:cd ~/backup ; mkdir startup ; cp ~/.* startup/.


11、# 井号:表示符号后面的是注解文字,不会被执行;

*  匹配文件名中的任何字符,包括字符串;
? 匹配文件名中的任何单个字符。
~ 代表使用者的 home 目录


12、/ 倒斜线:放在指令前,有取消 aliases(别名) 的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令

的最末端,表示指令连接下一行(使得回车符无效,只起换行作用)


14、! 感叹号:通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表"不等于"


15、** 次方运算:两个星号在运算时代表 "次方" 的意思

eg:let "sus=2**3"
echo "sus = $sus"
$ sus = 8
16、
;    命令分隔符。在同一行使用多个命令时需用到
;;    终止case选项符
.    a)等价于source 命令
    b)作为文件的前缀表示该文件为隐藏文件
    c)用在目录作为目录名的一部份时表示当前目录,..表示上级目录
    d)作为正则表达式的一部分时用来匹配任意单个字符
"    部分引用。“STRING”阻止了一部分的特殊字符
'    全引用。“STRING”阻止了所有的特殊字符
,    算术操作,只取最后一个值作为整个表达式的值
/    转义字符
/    文件名路径分隔符
`    后置引用
:    a)空命令,等价于NOP。也可认为与shell内置的true命令相同功能。(while :等价于while True)
    b)在if/then的占位符,什么也不做
    c)在一个 2 元命令中提供一个占位符和和"默认参数
    d)在和 > (重定向操作符)结合使用时,[把一个文件截断到 0 长度,没有修改它的权限。如果文件在之前并不存在,那么就创建它。如:
          1 : > data.xxx     #文件"data.xxx"现在被清空了.
          2
          3 #与 cat /dev/null >data.xxx 的作用相同
          4 #然而,这不会产生一个新的进程,因为":"是一个内建命令.
      注意: 这只适用于正规文件,而不是管道,符号连接,和某些特殊文件。
    e) 还用来在/etc/passwd 和$PATH 变量中用来做分隔符.
          bash$  echo $PATH
          /usr/local/bin:/bin:/usr/X11R6/bin:/sbin:/usr/sbin:/usr/games

!    取反操作符

*    a)万能匹配字符,用于文件名匹配和正则表达式匹配。
    b)数学乘法,**表示幂运算

?    a)测试操作.在一个确定的表达式中,用?来测试结果.(( ))结构可以用来做数学计算或者是写 c 代码,那?就是 c 语言的 3 元操作符的一个.在"参数替换"中,?测试一个变量是否被 set 了.
    b)在正则表达式中一样匹配任意的单个字符

$    a)变量替换
          var1=5
          echo $var1 # 5
    b)在正则表达式中作为匹配行结束符
${ }    参数替换
$*,$@    位置参数
$?    退出状态变量.$?保存一个命令/一个函数或者脚本本身的退出状态.
$$    进程 ID 变量.这个$$变量保存运行脚本进程 ID
( )    a)命令组.如:
          (a=hello;echo $a)
      注意:在()中的命令列表,将作为一个子 shell 来运行.在()中的变量,由于是在子 shell 中,所以对于脚本剩下的部分是不可用的.
    b)用在数组初始化,如:
          Array=(element1,element2,element3)

{xxx,yyy,zzz...}
         大括号扩展,如:
        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"中
      一个命令可能会对大括号中的以逗号分割的文件列表起作用[1]. file globbing 将对大括号中的文件名作扩展.
      注意: 在大括号中,不允许有空白,除非这个空白是有意义的.
        echo {file1,file2}/ :{/ A," B",' C'}
        file1 : A file1 : B file1 : C file2 : A file2 : B file2 : C
    
{ }     代码块.又被称为内部组.事实上,这个结构创建了一个匿名的函数.但是与函数不同的是,在其中声明的变量,对于脚本其他部分的代码来说还是可见的,即可以使用并影响外代码。

[ ]    a)测试。test表达式的[]中,值得注意的是[是 shell 内建 test 命令的一部分,并不是/usr/bin/test 中的扩展命令的一个连接.
    b)数组元素
        Array[1]=slot_1
        echo ${Array[1]}
        c)字符范围.在正则表达式中使用,作为字符匹配的一个范围

[[ ]]]    测试。test表达式在其中。与[test]有所区别。

(( ))     数学计算的扩展。在(( ))结构中可以使用一些数字计算。

>&>>&>><   重定向.
        scriptname >filename 重定向脚本的输出到文件中.覆盖文件原有内容.
        command &>filename 重定向 stdout 和 stderr 到文件中
        command >&2        重定向 command 的 stdout 到 stderr
        scriptname >>filename 重定向脚本的输出到文件中.添加到文件尾端,如果没有文件,则创建这个文件.
/<和/>    正则表达式中的单词边界.如:
        bash$grep '/<the/>' textfile

|    管道.分析前边命令的输出,并将输出作为后边命令的输入.这是一种产生命令链的好方法.
>|    强制重定向(即使设置了 noclobber 选项—就是-C 选项).这将强制的覆盖一个现存文件.
||     或-逻辑操作.
&     后台运行命令.一个命令后边跟一个&,将表示在后台运行
&&     与-逻辑操作.
    -a)选项,前缀.在所有的命令内如果想使用选项参数的话,前边都要加上"-".
    b)用于重定向 stdin 或 stdout.在需要一个文件名的地方,-重定向输出到 stdout(如在 tar 和 cf 命令中),或者从stdin 中接受输入,而不是从一个文件中接受输入.这是在管道中作为一个过滤器,来使用文件定位工具的一种办法.
    c)之前工作的目录."cd -"将回到之前的工作目录,注意:一定要和之前讨论的重定向功能分开,但是只能依赖上下文区分.
    d)算术减号
=     算术等号,有时也用来比较字符串
+     a)算术加号,也用在正则表达式中.
    b)选项,对于特定的命令来说使用"+"来打开特定的选项,用"-"来关闭特定的选项.
%     算术取模运算.也用在正则表达式中.
~     home 目录.相当于$HOME 变量
~+     当前工作目录,相当于$PWD 变量.
~-     之前的工作目录,相当于$OLDPWD 内部变量.
^    行首,正则表达式中表示行首."^"定位到行首.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章