Shell 符号的应用
关于 shell 符号,想必刚开始使用 shell 的时候总是会有迷迷糊糊的感觉。这个符号啥意思来着?为啥这个符号这里意义就不一样了?咋怎啊?索性整理了一下
一、分号 ;
echo abc;echo 123
命令终止位置,在命令行中可连续运行命令
二、美元符号 $
用于变量的引用
a=test;echo $a
定义变量 a=test,显示变量 a 的值
一般表达式中表 行尾
echo -e "12323\nadabb" | grep "b$"
查找以 b 字符结尾的行
与其他符号连接使用
$#
传递到脚本的参数个数
$*
以单个字符显示所有向脚本传递的参数. 加双引时则将所有参数视为一个整体
$@
同 $*
但加双引号时则保留每个参数区段
$$
脚本运行的当前进程 id 号
$!
后台运行的最后一个进程 id 号
$?
显示最后命令的退出状态。0 表示成功,其他任何值表示命令执行错误
三、AND符 &
在其他语言(java)中,属于位运算符,但是在shell命令行中有不同含义
命令在行尾时,表示后台运行
sleep 5 &
此时可以通过 jobs 来验证,sleep 在后台运行
与重定向符共用时
ls - >/dev/null
标准输出重定向
ls 1>/dev/null
标准输出重定向,同上
ls 2>/dev/null
标准错误输出重定向
ls - &>/dev/null
标准输出和标准错误输出都重定向
ls - 2>&1
这里的&用于描述1不是文件,而是将标准输出和错误输出合并重定向
两个 & 时 (&& ) 表逻辑符,与 java 相同, 与 py3 中的 and 用法一致
echo aa && echo bb
前面命令执行成功则后面命令才会执行
[ 1 -gt 2 ] && echo bb
前面命令执行失败 则后面命令不执行
四、管道符 |
命令行中表管道符
echo "aaaab" | tr -s a
将echo 的标准输出作为 tr 命令的标准输入
正则表达式表 或
echo abcd | grep -oE '[a|b]'
查找且显示 abcd 中的 a 或 b
两个 | 时 (||) 表逻辑符,与 java 相同, 与 py3 中的 or 用法一致
echo aa || echo bb
前面命令执行成功 则后面命令不会执行
[ 1 -gt 2 ] || echo bb
前面命令执行失败 则后面命令才会执行
五、井号 #
在shell 脚本首行与 ! 连用时,表约定标记告诉系统其后路径所指定的程序解释脚本
#!/bin/bash
告诉系统使用 /bin/bash 来解释此脚本
在shell脚本中命令行首,表注释符
# echo "this is a notes"
运行脚本将不执行该行
脚本参数处理时,表位置参数的个数
[ "$#" -gt 0 ] && echo gt || echo lt
参数大于0 显示gt 参数小于0 显示 lt
在字符串操作时,表统计字符个数,掐头
echo ${#PATH}
统计PATH中字符的个数,不包含不可打印字符(换行符)
echo ${PATH#*:}
会将PATH变量中第一个 : 前的字符去除
echo ${PATH##*:}
会将PATH变量中最后一个 : 前的字符去除
在 sed 中可表分界符
echo $PATH |sed 's#:#=#g'
将PATH中所有 : 替换为 =
六、大括号 {}
通配符扩展
echo a{1,2,3}
显示 a1 a2 a3 同 echo a{1..3}
正则表达式中表范围
echo a1aa | grep -oE "a{2}"
匹配并显示 2 个连续的a
用于匿名函数
{ sleep 5;echo a; }
休眠5s 后显示 a
执行花括号中命令时 表当前 shell
{ sleep 10; }
休眠10s 可使用另外shell 窗口查看 bash 进程不发生变化
括起变量名时,表变量边界
a=test;echo "${a}aaa"
定义变量并显示 testaaa 若不加花括号无法识别变量则不显示任何字符
七、圆括号 ()
执行圆括号中命令时 表子 shell 中执行,会继承父 shell 变量
(sleep 10; )
另起子线程休眠10s 可使用另外shell 窗口查看 bash 进程发生变化
定义数组
a=(1 2 3 4)
定义一个数组,元素为1 2 3 4 同a=({1..4})
八、双圆括号 (())
算术运算
echo $((2*3))
显示 2 乘 3 的结果
整数的比较
((1<2)) && echo yes
如果 1 小于 2 则显示 yes
九、中括号 []
算术运算
echo $[1+2]
显示 1 加 2 的结果
正则表达式中,中括号内的任意字符
echo a1b2. | grep -oE "[0-9]"
匹配0到9之间的任意数字
数组中,表示取数组中某下标的值
a=({1..5});echo ${a[1]}
取数组中下标为 1 的值
条件测试表达式
[ -z "" ] && echo yes
字符串长度为0 则显示yes
a=;[ $a ] && echo not null || echo null
判断变量a是否为空,为空则false
[ 1 -lt 2 ] && echo bb
如果 1 小于 2 则显示 bb
十、双中括号 [[]]
是 [] 的扩展基本作用相同,但[[]] 允许直接使用 && 和 || 等符号
十一、反引号 ``
在反引号内部的shell命令将会被执行,其结果输出代替用反引号括起来的文本
echo `expr 1 + 2`
计算并显示 1 + 2 的结果
十二、单引号 ' '
将单引号内的内容原样输出,阻止所有字符的转义
echo '$PATH'
最终显示 $PATH 字符
十三、双引号 " "
把双引号的内容输出出来。如果内容中有命令、变量,则会先把命令,变量解析出结果,然后再输出最终内容。双引号内命令或变量的写法为命令或变量或$(命令或变量)
echo "$PATH"
会输出系统的 PATH
注:
不加引号
不会将含有空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把命令、变量解析出结果,然后再输出最终内容来,如果字符串含有空格等特殊字符,则不能完整输出,则需改加双引号。