从shell眼中看世界
echo-显示一行文本
当输入一个命令,bash在执行命令之前,会对输入的字符做展开处理。
路径展开
echo *
shell将*展开为当前目录下的文件名称,会打印出当前目录下的文件名称,
echo d* 打印出当前目录下所有以d开头的文件
echo *d 打印出当前目录下所有以d结尾的文件
~展开
echo ~ 打印出当前用户的家目录信息
echo ~test 打印出test用户的家目录信息
算术表达式展开
echo $((expression))
echo $(((2*3)+5))
echo $(((2**3)*5))
注意表达式的格式,算术表达式只支持整数和加减乘除、取余、幂运算。
花括号展开
从一个花括号的模式中创建多个文本字符串
echo hello{1,2,3} 将会输出hello1 hello2 hello3
echo hello {1,2,3} 将会输出hello 1 2 3
echo hello{a,b,c} 将会输出helloa hellob helloc
注意:{}中的元素要用,分隔,可以是字符,也可以是字符串
最常见的应用是创建一系列的文件或目录
mkdir hello{1,2,3,4,5}
参数展开
echo $USER 打印出用户名
查看变量列表
printenv |less
当展开的变量是不存在的时候,系统会将其展开成为一个空字符串
echo $HELLO
命令替换
将一个命令的输出作为展开式
echo $(ls)
ls -l $(which cp) 将whic cp的输出信息作为ls的参数
或是
ls -l `which cp` 旧版的shell支持,倒引号
引用
echo hello world
将会在屏幕上打印出hello world
echo the total is $100.00
将会在屏幕上打印出 the total is 00.00
在第一个中,shell会删除多余的空格,在第二个中,$会对1进行变量展开,而1并不是变量,所以会将其展开成为空字符串
shell提供了一种引用的机制,它会有效的控制字符的展开
双引号
第一种引用类型来控制字符的展开
如果在文本两端添加””,那么文本中除了$ \ `(倒引号)外,其他字符都将不会有特殊展开含义
在双引号中,参数展开、表达式展开、命令展开仍然有效
echo “$USER $((2**3)) $(ls)”
echo “hello world” 会打印出hello world
单词分割机制
echo hello world
这时会输出hello world
在默认情况下,单词分割机制会在单词中寻找空格、制表符、换行符,并把它们看作单词之间的界定符,而每个单词都是一个参数,在上例中就有两个参数,打印出每个参数用空格界定
同样,如果你输入 echo $(cal)
那么此时打印出的是一行有空格界定的数据,而不含有换行符
如果输入 echo “hello world”
单词分割被禁止,其实就是””内部的内容作为一个参数存在,而不加””却是两个参数
看看 echo $(cal)与echo “$(cal)”的区别
单引号
第二种引用限制字符展开,单引号会限制所有字符的展开,所有的字符只有本身的含义,不存在特殊含义
转义字符
用\来禁止特殊字符的展开,注意在单引号中\将失去作用
echo \”hello world\”
反斜杠转义序列的使用
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
例如\a响铃
echo -e ‘\a’ -e选项来解释转义字符,虽然\在单引号中失去作用,但-e选项解释了它
echo $’\a’
不能够直接echo “\a”
最后学习一个-n选项
-n 不换行的输出
Echo “hello”;echo “world” 此时会两行输出hello world
Echo -n “hello”;echo “world” 则会一行输出helloworld