Bash Shell 中的特殊字符

什么是Bash Shell中的特殊字符?某些特殊字符在Bash Shell里不是表示其字符含义本身,而是另有含义,称为:meta-meaning。

  • 1.字符:#

代表注释,如果有一行以#开始,那么意味着这行不会被执行,只是一行说明注释。

例如:

# this is comments

这是一行注释。

但是这里有个例外,那就是脚本的第一行我们经常看到的:

#!/bin/bash

这个指示一个脚本的解释器,说明这个脚本是由/bin/bash 来解释的。

从#为开始,后面的字符即为注释,直到该行结束。体会下面几个例子:

echo "The # here does not begin a comment."
echo ‘The # here does not begin a comment.‘

引用内的字符按原意输出。

echo The \# here does not begin a comment.

这个使用了\把#做了转义,即把#原样输出。

echo The # here begins a comment.

这个惨了,被截断了,只输出: The

echo ${PATH#*:}

这个是参数替换,不是注释符。

echo $(( 2#101011 ))

这个是基数指示符,也不是注释符,说明后面的数是二进制的。

  • 2.字符:;

分号[semicolon],作为命令的分割符,说明一条命令到此结束。使用分号,你可以在一行写多条命令,这个我们经常见。

例如:

hdfeel$ echo hello; echo world;
hello
world
hdfeel$

3.字符:;;

两个分号在一起[double semicolon],这个只用在case语句里:

case "$variable" in
  abc)  echo "\$variable = abc" ;;
  xyz)  echo "\$variable = xyz" ;;
esac
  • 4.字符:"

双引号[double quote]表示部分引用[partial quoting],多数情况下,双引号内的字符原样输出,但其中的变量会被替换。比如:

hdfeel$ fileName="a.txt"
hdfeel$ echo "the file name is $fileName"
hdfeel$ the file name is a.txt

这可能正是我们需要的。如果你想原样输出,那么用单引号,或者使用反斜杠\对$进行转义。

echo "the file name is \$fileName"
echo ‘the file name is $fileName‘
  • 5.字符:’

单引号[single quote],代表全引用[full quoting],引号内的字符全部原样输出,即使有变量也不做相应的替换。

例子上面有了,不再重复了。

  • 6.字符:,

逗号[comma operator],连接2个算式,但是只有最后一个算式的值被返回。

hdfeel$ let "t2 = ((a = 9, 15 / 3))"

上面的语句把a赋值为9,并把15除以3的结果5,赋值给t2.

另外,逗号操作符,也可以连接字符串:

for file in /{,usr/}bin/*calc
#             ^    在/bin和/usr/bin目录里,找出所有以"calc"结尾的可执行文件
#+                 
do
        if [ -x "$file" ]
        then
          echo $file
        fi
done
# /bin/ipcalc
# /usr/bin/kcalc
# /usr/bin/oidcalc
# /usr/bin/oocalc
  • 7.字符:

反斜杠[backslash]就是换码符[escape],为单个字符的引用机制,通过对字符的引用来改变它本来的含义。

比如:

hdfeel$ echo "\"";   // 输出双引号
hdfeel$ "
hdfeel$ x=abc
hdfeel$ echo “$x”   // 输出变量的值
hdfeel$ abc
hdfeel$ echo “\$x”  // 原样输出
hdfeel$ $x
  • 8.字符:`

命令替换符,就是键盘的左上角波浪符下面的字符,不要看错了,不是单引号噢,<code>`</code>中间放一个可执行的命令<code>`</code>,这个符号也叫反引号。

举个小例子:

#! /bin/bash
inFile=“example.txt"
maxLen=12
#
while read line; do
    len=`echo $line | awk ‘{print length($0)}‘`    //  子命令被放到了反引号里面执行。
    if [ $len -lt $maxLen ]; then
        echo $line
    fi
done < $inFile

上面的程序打印出了少于12个字符的行。

  • 9.冒号:

冒号[colon],称为空命令[null command],即什么都不执行,返回值为true,也就是0,属于Bash的内置命令。

下面2段代码把冒号当成了判断条件:

while :
do
   operation-1
   operation-2
   ...
   operation-n
done

和上面的代码实现一样的功能

while true
do
   operation-1
   operation-2
   ...
   operation-n
done

有时它也被用来当占位符:

if condition
then :   # Do nothing and branch ahead
else     # Or else ...
   take-some-action
fi

冒号:也用来当作域分隔符,你在/etc/passwd和$PATH变量中可以看到它:

shells hdfeel$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
shells hdfeel$

最糟心的时,冒号这东西还可以做函数名,如果想让代码把人搞晕的话,这么搞

:()
{
  echo "The name of this function is "$FUNCNAME" "
  # Why use a colon as a function name?
  # It‘s a way of obfuscating your code.
}
:
# The name of this function is :

当然在函数内部,它可以做一个占位符,这样函数就不是一个空函数了。

not_empty ()
{
  :
} # Contains a : (null command), and so is not empty.

下面的这个比较实用:

{a..z} 生成字符a到z之间的所有字符,当然也可以是数字,比如:{1..9}

体会下这个代码

echo {a..z} # a b c d e f g h i j k l m n o p q r s t u v w x y z
# Echoes characters between a and z.
echo {0..3} # 0 1 2 3
# Echoes characters between 0 and 3.
base64_charset=( {A..Z} {a..z} {0..9} + / = )
# Initializing an array, using extended brace expansion.
# From vladz‘s "base64.sh" example script.

上面解释了一些Bash Shell中的部分特殊字符,在<a Advanced Bash-Scripting Guide中有更多、更详细的介绍,有兴趣可以参考。

原文:http://www.hdfeel.net/2015/01/bash-shell-special-character/

时间: 2024-10-14 05:26:19

Bash Shell 中的特殊字符的相关文章

linux bash shell中for的用法and示例

关于linux bash shell中的for语句 在linux中shell是必不可少的一部分,但是在bash shell中有while,for,until等循环命令,今天就介绍一下关于for的一些用法.文中任何错误希望大佬们一一指出,不胜感激. bash shell中提供了for命令,用于创建通过一系列值重复的循环,每次重复使用系列中的一个值执行一个定义的命令集. for语句的基本格式如下: for---in list do commands done 在参数list中提供一系列用于迭代(上一

bash shell 中的比较

1.算术比较 运算符 描述 -eq 等于 -ne 不等于 -gt 大于 -lt 小于 -ge 大于等于 -le 小于等于 举例: [ $var -eq 1 ] #变量等于1 返回真 [ $var -ne 1 ] #变量不等于1 返回真 [ $var -gt 1 ] #变量大于1 返回真 [ $var -lt 1 ] #变量小于1 返回真 [ $var -ge 1 ] #变量大于等于1 返回真 [ $var -le 1 ] #变量小于等于1 返回真 2.字符串比较 字符串比较时候使用[[ ]] 双

bash shell中测试命令

bash shell中测试命令 test命令提供了if-than语句中测试不同条件的途径.如果test命令中列出的条件成立,test命令就会退出并返回退出状态吗0 .这样if-than语句就与其他编程语言中的if-than语句类似的方式工作了.如果条件不成立,test命令就会退出并返回非零的退出状态码,使得if-than语句不会被执行. 1    test 命令的基本格式     test        condition         condition是test命令要测试的一系列参数和值.

Bash Shell 中的History命令

###  Bash Shell 中的History命令 ---------- 日常运维工作中,我们经常使用History命令去检查在这台机器上所执行的历史命令,或者谁在什么时间执行的什么命令.History命令默认情况下不显示时间,我们可以设置. ---------- - 显示所执行过的命令 简单敲下键盘,输入一个单词:history即可.或者his +table键bash自动补全命令,终端会显示行号及对应的命令. > [[email protected] ~]$ history 1  exit

bash shell中的环境变量

环境变量--bash shell使用环境变量来存储系统相关数据,并允许将数据存储在内存中. 环境变量分为:全局环境变量 本地环境变量 目录 全局环境变量 本地环境变量 设置全局环境变量 删除环境变量 PATH全局环境变量 设置系统环境变量的相关文件(登录.非登录.交互.非交互shell) 一.全局环境变量 在当前shell和子shell都可见 可以用printenv命令查看全局环境变量,大写表示是系统环境变量,小写表示是普通用户的环境变量 这是bash shell的一个标准约定,不是必须的,因此

Bash shell 中,select 使用举例

Bash shell 中,select 使用举例 一 背景 在最近的运维工作中,写了很多脚本,在写这些脚本时发现了一些高效的用法,现将 select 的用法简单介绍一下. 二 使用举例 select 表达式是 bash 的一种扩展应用,擅长于交互式场合.用户可以从一组不同的值中进行选择.格式如下: select var in ... ; do ... done 2.1 单独使用 select #!/bin/bash Hostname=( 'host1' 'host2' 'host3' ) sel

bash shell 中数组使用举例

bash shell 中数组使用举例 一 背景 让我们先来看一个 shell 脚本的执行过程及结果: [[email protected] ~]$ sh array.sh N2 N3 N4 The elements of this array 2-4 are: N2 N3 N4 N1 is in array. N2 is in array. N3 is in array. N4 is in array. The original array is as follows: N1 N2 N3 N4

Shell中的特殊字符

介绍[54,17] bash本身并不支持正则表达式regex, 而shell下的有些工具是支持解释regex的,使用regex的是shell命令和工具, 如grep,sed,awk等.但shell 支持通配符,区别于regex,通配是把一个包含通配符的非具体文件名扩展存储在计算机,服务器或者网络上的一批具体文件名的过程. 通配符文件名匹配 通配符用来匹配文件名,路径名,包括命令, 通常将四种通配方式组合使用.Linux 文件名可使用除/ 外的任何可打印字符(文件名开头和结尾的空格很难识别,除非有

Linux CentOS 7 shell中的特殊字符及与管道相关的命令(cut,sort,wc,uniq,tee,tr,split)

一. shell特殊符号cut命令 1.特殊符号 * :任意个任意字符 ? :任意单个字符# :注释\ :转义字符 | :管道符 2.几个和管道相关的命令 (1) cut cut 把文件分段 cat /etc/passwd cut -d: -f 3  /etc/passwd    cut -d: -f 3,6,5  /etc/passwd cut -d: -f 3-6  /etc/passwd cut -c 10 /etc/passwd   取第十个字符 cut -c 5-10 /etc/pas