转载自:http://dev.firnow.com/course/3_program/shell/shelljs/20090828/172746.html

bash下有很多像{}、[]等一些符号命令,下面是我对一些常用的符号命令的学习笔记,若有错误或纰漏望各位兄弟指正。

一、.(source)
.(点)与source命令一样,从文件中读取并执行命令,无论该文件是否都有可执行权限都能够正确的执行。且是在当前shell下执行,而不是产生一个子shell来执行(我们通常使用“./filename.sh”去执行一个文件是在当前shell下产生一个子shell去执行的)。所以在设置bash的环境的变量时,就必须用该命令或者source命令去执行设置的环境变量才会对当前shell生效,如下:

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        . $i
    fi
done

二、:
: 该命令什么都不做,但执行后会返回一个正确的退出代码,即exit 0。比如在if语句中,then后面不想做任何操作,但是又不能空着,这时就可以使用“:”来解决,如下:

if [ "$i" -ne 1 ];then
    :
else
    echo "$i is not equal 1"
fi

三、()
() 将多个命令组合在一起执行,相当于一个命令组。

四、{}
{}  和()类似,也是将多个命令组合在一起。它们之间的区别是,()是在产生的子shell下执行,而{}是在当前的shell下执行。这与前面讲到是使用".  filename.sh"和"./filename.sh"的区别一样。举一个很简单的例子:

# A=123
 
(A=abc;echo $A);echo $A
abc
123
# { A=abc;echo $A; };echo $A
abc
abc

从上面的示例可以看出,当在()中赋值的变量,影响的只是自身的子shell,而不能将该值赋给父shell,因为“父亲不能继承儿子”。而在{}中赋值的变量,因为就在当前的shell执行的,所以就能改变原来变量的值。
注意:()里面两边可以不使用空格,{}里面两边必须使用空格,且最后一个命令也需要以“;”结尾,表示命令结束。

五、[](test)
[] 与test命令一样,用于比较值以及检查文件类型。如下:
1、[ "$A" = 123 ]:是字符串的测试,以测试 $A 是否为 1、2、3 这三个连续的"文字"。
2、[ "$A" -eq 123 ]:是整数的测试,以测试 $A 是否等于"一百二十三"。
3、[ -e "$A" ]:是关于文件的测试,以测试 123 这份"文件"是否存在。

六、[[]]
[[]]可以说是[]的“增强版”,它能够将多个test命令支持的测试组合起来,例如:

# [[ (-d "$HOME") && (-w "$HOME") ]] && echo echo "home is a writable directory"  

home is a writable directory

至于这两者的区别有位仁兄已经写的很清楚了,我将其整理一下:

数字测试: -eq -ne -lt -le -gt -ge,[[ ]]同 [ ]一致
文件测试: -r、-l、-w、-x、-f、-d、-s、-nt、-ot,[[ ]]同 [ ]一致
字符串测试: > < =(同==) != -n -z,不可使用“<=”和“>=”,[[ ]]同 [ ]
<

SPAN style="COLOR: rgb(0,1,2)">一致,但在[]中,>和<必须使用\进行转义,即\>和\<
逻辑测试: []为 -a -o ! [[ ]] 为&& || !
数学运算: [] 不可以使用 [[ ]]可以使用+ - */ %
组合: 均可用各自逻辑符号连接的数字(运算)测试、文件测试、字符测试

拿这两者对字符串的测试举一个例子,如下:

# [ a \> 1 ] && echo ture || echo false
ture
# [[ a > 1 ]] && echo ture || echo false
ture

字符串的比较是根据相应的ASCII码来比较的,所以a>1是成立的。如果有兴趣也可以思考一下为什么会出现下面的结果?

# [[ a > 1 ]] && echo ture || echo false
ture

七、(())
(())专门来做数值运算,如果表达式求值为 0,则设置退出状态为 1;如果求值为非 0 值,则设置为 0。不需要对 (( 和 )) 之间的操作符转义。算术只对整数进行。除 0 会产生错误,但不会产生溢出。可以执行 C 语言中常见的算术、逻辑和位操作。如下:

# ((i=1+99));echo $i
100

也能:

# i=99;((i++));echo $i
100

除此之外,也可以使用$(())直接进行数值运算,如下:

# echo $((2**3))
8

注意:使用 (( )) 时,不需要空格分隔各值和运算符,使用[]和[[ ]] 时需要用空格分隔各值和运算符。 
  
  
组合判断: 
  
if [ $a -ne 0 ] && [ $b -lt 3 ] || [ $c -gt 5 ] 
then 
#你在这里加其他操作 
fi 
  
  
// 
  
7.1.1.1. 和if使用的表达式 下表包含了一个组成 TEST-COMMAND 命令或者命令列表,称作 “要素primaries” 的概览。这些primaries放置在方括号中来表示一个条件表达式的测试。 表 7.1. 主表达式Primary 意义
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
[ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1FILE2 does not则为真。
exists and [ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。
[ STRING1 == STRING2 ] 如果2个字符串相同。 “=” may be used instead of “==” for strict POSIX compliance则为真。
[ STRING1 != STRING2 ] 如果字符串不相等则为真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale则为真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale则为真。
[ ARG1 OP ARG2 ] “OP” is one of -eq, -ne, -lt, -le, -gt or -ge.These arithmetic binary operators return true if “ARG1” is equal to,not equal to, less than, less than or equal to, greater than, orgreater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” areintegers. 表达式可以借以下操作符组合起来,以降序列出:listed in decreasing order ofprecedence

表 7.2. 组合表达式操作 效果
[ ! EXPR ] 如果 EXPR 是false则为真。
[ ( EXPR ) ] 返回 EXPR的值。这样可以用来忽略正常的操作符优先级。
[ EXPR1 -a EXPR2 ] 如果 EXPR1 and EXPR2 全真则为真。
[ EXPR1 -o EXPR2 ] 如果 EXPR1 或者 EXPR2 为真则为真。 [ (或作 test)内建命令对条件表达式使用一系列基于参数数量的规则来求值。更多关于这个主题的信 
  
  
 
  
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
* = 两个字符相等
* != 两个字符不等
* -n 非空串

/// 
  
(7)保留字符及其含义

$ shell变量名的开始,如$var

| 管道,将标准输出转到下一个命令的标准输入

# 注释开始

& 在后台执行一个进程

? 匹配一个字符

* 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.)

$- 使用set及执行时传递给shell的标志位

$! 最后一个子进程的进程号

$# 传递给shell script的参数个数

$* 传递给shell script的参数

$@ 所有参数,个别的用双引号括起来

$? 上一个命令的返回代码

$0 当前shell的名字

$n (n:1-) 位置参数

$$ 进程标识号(Process Identifier Number, PID)

>file 输出重定向

<file 输入重定向

`command` 命令替换,如 filename=`basename /usr/local/bin/tcsh`

>>fiile 输出重定向,append

转义符及单引号:

$echo "$HOME $PATH"

/home/hbwork /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:

$echo '$HOME $PATH'

$HOME $PATH

$echo \\$HOME $PATH

$HOME /opt/kde/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/hbw

ork/bin

其他:

$dir=ls

$$dir

$alias dir ls

$dir

ls > filelist

ls >> filelist

wc -l < filelist

wc -l filelist

sleep 5; echo 5 seconds reaches; ls -l

ps ax |egrep inetd

find / -name core -exec rm {} \\; &

filename=`date "+%Y%m%d"`.log

2. shell变量

变量:代表某些值的符号,如$HOME,cd命令查找$HOME,在计算机语言中可以使用变量可以

进行多种运算和控制。

Bourne Shell有如下四种变量:

.用户自定义变量

.位置变量即 shell script之参数

.预定义变量(特殊变量)

.环境变量(参考shell定制部分) 
  
  

  
  
old_tag=`hg tags | grep db1_V0_ | sed -n -e 1p | sed -e "s/ .*//"`
echo $old_tag
index=`expr index "$old_tag" _V0_`
echo $index
new_tag="db1_V0_"`printf "%04d" $((${old_tag:index+3}+1))`
echo $new_tag

db1_V0_0002
4
db1_V0_0003 
  
“.*”匹配剩余的0个或多个字符

替换所有的"s/1/2/g"

转载于:https://www.cnblogs.com/fhefh/archive/2011/04/16/2017895.html

bash下: () {} [] [[]] (())的解释相关推荐

  1. Linux ps aux什么含义,Linux下psaux解释

    Linux下psaux解释 ps aux的功能是打印出所有进程 ps是最基本也是最强大的进程查看命令 aux都是参数 a = show processes for all users 显示所有用户的进 ...

  2. bash下变量PS1的完整理解

    本文并不会讲解如何设置PS1以获得你喜欢的提示符:本文会围绕PS1这个变量,就其涉及到的一些概念展开讨论 导言 ubuntu 的默认 shell 是 bash,bash 下有个变量 PS1,我们在 l ...

  3. php虚拟键盘输入,[问题] bash下如何模拟键盘输入

    你的位置: 问答吧 -> Shell -> 问题详情 [问题] bash下如何模拟键盘输入 我想要在bash下模拟键盘输入. 现在有两个实例. 1. 如果我在使用未配置sudo nopas ...

  4. BOW模型在ANN框架下的解释

    BOW模型在ANN框架下的解释 作者:孤风一剑   发布:2013-12-25 09:50   栏目:其它语言   点击:720次   抢沙发   Bag of words模型(简称BOW)是最常用的 ...

  5. 在git的Bash下进行复制粘贴

    最近在学习git,必然要用到clone啊,但是为毛不能复制粘贴啊,需要一个一个字符的敲clone的网址啊,问题出在哪里呢,如何才能在git的Bash下复制粘贴呢,经过找寻,终于找到了方法. 在Bash ...

  6. bash下输入命令的几个常用快捷键

    ------------------------------------------ 先区分下vi里的命令   快速在行里移动光标 b 是往前部一个单词一个单词的移动 e 是往后部一个单词一个单词的移 ...

  7. linux 邮件附件 中文,linux bash下通过mailx发送中文内容显示为附件的解决

    满意答案 skicotvo99 2017.01.30 采纳率:44%    等级:8 已帮助:561人 linux bash下通过mailx发送中文内容显示为附件的解决mailx版本,这里默认是mai ...

  8. Git Bash 下进行快速复制粘贴

    关于在Git Bash下进行快速的复制粘贴 比如我们需要选中这个版本ID(fc0a28),我们可以双击选择这个版本ID(fc0a28),就会如下显示选中 然后只需要触碰到fc0a28的时候单击右键就可 ...

  9. bash下的特殊符号与通配符

    通配符也是bash下特殊符号的一种,以下是bash 环境中的特殊符号汇整: 符号        内容 ------------------------------------------------- ...

最新文章

  1. Exchange Server 2013 LAB Part 4.内部客户端访问
  2. C++改变基类成员在派生类中的访问属性
  3. rust(26)-单元类型与never
  4. mysql 重置更新祖级字段
  5. drf4 视图与路由组件
  6. linux下ora 01110,ORA-01003ORA-01110
  7. 程序员不可能实现的6个愿望
  8. poj 1050(DP)
  9. 在linux中emacs安装package.el
  10. 华为云NP考试题库_华为np题库
  11. java静态代理和动态代理的区别
  12. Progress进度条
  13. MD5校验判断文件是否一样
  14. Normalize.css的作用
  15. 密码:大写字母 小写字母 数字 特殊字符(四种里至少三种)
  16. python查看微信撤回消息怎么弄_Python3爬虫查看微信撤回消息
  17. 开篇的个人感想和想法
  18. Lr_debug_message,Lr_output_message,Lr_error_message,Lrd_stmt,Lrd_fetch
  19. 数据与广告系列三十二:重排ReRank,广告推荐算法链路上的背叛者,生态系统格局的重塑者...
  20. 基于贝叶斯优化的离散组合序列问题调研

热门文章

  1. Druid 分析报表中的实战(二)
  2. 如何创建一个FeatureClass,IFeatureWorkspace 接口漫谈
  3. 019.MFC_两种对话框
  4. mysql text与blog的区别
  5. laravel5.5使用sendCloud邮件服务
  6. oracle使用parallel并行,多线程查询
  7. Vue 单文件元件 — vTabs
  8. React Native 加载多类型布局的实现——分类列表SectionList的封装
  9. 4位快速加法器和4位串行加法器相比_使用混合信号示波器调试串行总线系统
  10. IE10,IE9透明元素无法点击