shell 中 && || () {} 用法


http://www.jianshu.com/p/617c1ee1e46e

() 运算符:

如果希望把几个命令合在一起执行,shell提供了两种方法。既可以在当前shell也可以在子shell中执行一组命令。
格式:

(command1;command2;command3....)               多个命令之间用;分隔
  1. 一条命令需要独占一个物理行,如果需要将多条命令放在同一行,命令之间使用命令分隔符(;)分隔。执行的效果等同于多个独立的命令单独执行的效果。
  2. () 表示在当前 shell 中将多个命令作为一个整体执行。需要注意的是,使用 () 括起来的命令在执行前面都不会切换当前工作目录,也就是说命令组合都是在当前工作目录下被执行的,尽管命令中有切换目录的命令。
  3. 命令组合常和命令执行控制结合起来使用。
  4. 示例4中,如果目录dir不存在,则执行命令组合。

    示例4.jpg

{} 运算符:

如果使用{}来代替(),那么相应的命令将在子shell而不是当前shell中作为一个整体被执行,只有在{}中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子shell中执行,否则在当前shell执行。
它的一般形式为:

{ command1;command2;command3… }      注意:在使用{}时,{}与命令之间必须使用一个空格
  1. 示例5中,使用{}则在子shell中执行了打印操作


作者:shu_ke
链接:http://www.jianshu.com/p/617c1ee1e46e
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
========================================================================================================================================
http://www.pixelbeat.org/cmdline_zh_CN.html

 
 
 
 
 
 
 
 
 
Xiaoming Mo and Chen HuaJiang have kindly translated this page.

这是一个linux常见命令的列表。
那些有• 标记的条目,你可以直接拷贝到终端上而不需要任何修改,因此你最好开一个终端边读边剪切&拷贝
所有的命令已在Fedora和Ubuntu下做了测试

命令 描述
apropos whatis 显示和word相关的命令。 参见线程安全
man -t man | ps2pdf - > man.pdf 生成一个PDF格式的帮助文件
  which command 显示命令的完整路径名
  time command 计算命令运行的时间
time cat 开始计时. Ctrl-d停止。参见sw
nice info 运行一个低优先级命令(这里是info)
renice 19 -p $$ 使脚本运行于低优先级。用于非交互任务。
目录操作
cd - 回到前一目录
cd 回到用户目录
  (cd dir && command) 进入目录dir,执行命令command然后回到当前目录
pushd . 将当前目录压入栈,以后你可以使用popd回到此目录
alias l='ls -l --color=auto' 单字符文件列表命令
ls -lrt 按日期显示文件. 参见newest
ls /usr/bin | pr -T9 -W$COLUMNS 在当前终端宽度上打印9列输出
  find -name '*.[ch]' | xargs grep -E 'expr' 在当前目录及其子目录下所有.c和.h文件中寻找'expr'. 参见findrepo
  find -type f -print0 | xargs -r0 grep -F 'example' 在当前目录及其子目录中的常规文件中查找字符串'example'
  find -maxdepth 1 -type f | xargs grep -F 'example' 在当前目录下查找字符串'example'
  find -maxdepth 1 -type d | while read dir; do echo $dir; echo cmd2; done 对每一个找到的文件执行多个命令(使用while循环)
find -type f ! -perm -444 寻找所有不可读的文件(对网站有用)
find -type d ! -perm -111 寻找不可访问的目录(对网站有用)
locate -r 'file[^/]*\.txt' 使用locate 查找所有符合*file*.txt的文件
look reference 在(有序)字典中快速查找
grep --color reference /usr/share/dict/words 使字典中匹配的正则表达式高亮
归档 and compression
  gpg -c file 文件加密
  gpg file.gpg 文件解密
  tar -c dir/ | bzip2 > dir.tar.bz2 将目录dir/压缩打包
  bzip2 -dc dir.tar.bz2 | tar -x 展开压缩包 (对tar.gz文件使用gzip而不是bzip2)
  tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg' 目录dir/压缩打包并放到远程机器上
  find dir/ -name '*.txt' | tar -c --files-from=- | bzip2 > dir_txt.tar.bz2 将目录dir/及其子目录下所有.txt文件打包
  find dir/ -name '*.txt' | xargs cp -a --target-directory=dir_txt/ --parents 将目录dir/及其子目录下所有.txt按照目录结构拷贝到dir_txt/
  ( tar -c /dir/to/copy ) | ( cd /where/to/ && tar -x -p ) 拷贝目录copy/到目录/where/to/并保持文件属性
  ( cd /dir/to/copy && tar -c . ) | ( cd /where/to/ && tar -x -p ) 拷贝目录copy/下的所有文件到目录/where/to/并保持文件属性
  ( tar -c /dir/to/copy ) | ssh -C user@remote 'cd /where/to/ && tar -x -p' 拷贝目录copy/到远程目录/where/to/并保持文件属性
  dd bs=1M if=/dev/sda | gzip | ssh user@remote 'dd of=sda.gz' 将整个硬盘备份到远程机器上
rsync (使用 --dry-run选项进行测试)
  rsync -P rsync://rsync.server.com/path/to/file file 只获取diffs.当下载有问题时可以作多次
  rsync --bwlimit=1000 fromfile tofile 有速度限制的本地拷贝,对I/O有利
  rsync -az -e ssh --delete ~/public_html/ remote.com:'~/public_html' 镜像网站(使用压缩和加密)
  rsync -auz -e ssh remote:/dir/ . && rsync -auz -e ssh . remote:/dir/ 同步当前目录和远程目录
ssh (安全 Shell)
  ssh $USER@$HOST command 在$Host主机上以$User用户运行命令(默认命令为Shell)
ssh -f -Y $USER@$HOSTNAME xeyes 在名为$HOSTNAME的主机上以$USER用户运行GUI命令
  scp -p -r $USER@$HOST: file dir/ 拷贝到$HOST主机$USER'用户的目录下
  ssh -g -L 8080:localhost:80 root@$HOST 由本地主机的8080端口转发到$HOST主机的80端口
  ssh -R 1434:imap:143 root@$HOST 由主机的1434端口转发到imap的143端口
wget (多用途下载工具)
(cd cmdline && wget -nd -pHEKk http://www.pixelbeat.org/cmdline.html) 在当前目录中下载指定网页及其相关的文件使其可完全浏览
  wget -c http://www.example.com/large.file 继续上次未完的下载
  wget -r -nd -np -l1 -A '*.jpg' http://www.example.com/ 批量下载文件到当前目录中
  wget ftp://remote/file[1-9].iso/ 下载FTP站上的整个目录
wget -q -O- http://www.pixelbeat.org/timeline.html | grep 'a href' | head 直接处理输出
  echo 'wget url' | at 01:00 在下午一点钟下载指定文件到当前目录
  wget --limit-rate=20k url 限制下载速度(这里限制到20KB/s)
  wget -nv --spider --force-html -i bookmarks.html 检查文件中的链接是否存在
  wget --mirror http://www.example.com/ 更新网站的本地拷贝(可以方便地用于cron)
网络(ifconfig, route, mii-tool, nslookup 命令皆已过时)
  ethtool eth0 显示网卡eth0的状态
  ethtool --change eth0 autoneg off speed 100 duplex full 手动设制网卡速度
  iwconfig eth1 显示无线网卡eth1的状态
  iwconfig eth1 rate 1Mb/s fixed 手动设制无线网卡速度
iwlist scan 显示无线网络列表
ip link show 显示interface列表
  ip link set dev eth0 name wan 重命名eth0为wan
  ip link set dev eth0 up 启动interface eth0(或关闭)
ip addr show 显示网卡的IP地址
  ip addr add 1.2.3.4/24 brd + dev eth0 添加ip和掩码(255.255.255.0)
ip route show 显示路由列表
  ip route add default via 1.2.3.254 设置默认网关1.2.3.254
tc qdisc add dev lo root handle 1:0 netem delay 20msec 增加20ms传输时间到loopback设备(调试用)
tc qdisc del dev lo root 移除上面添加的传输时间
host pixelbeat.org 查寻主机的DNS IP地址
hostname -i 查寻本地主机的IP地址(同等于host `hostname`)
whois pixelbeat.org 查寻某主机或莫IP地址的whois信息
netstat -tupl 列出系统中的internet服务
netstat -tup 列出活跃的连接
windows networking (samba提供所有windows相关的网络支持)
smbtree 寻找一个windows主机. 参见findsmb
  nmblookup -A 1.2.3.4 寻找一个指定ip的windows (netbios)名
  smbclient -L windows_box 显示在windows主机或samba服务器上的所有共享
  mount -t smbfs -o fmask=666,guest //windows_box/share /mnt/share 挂载一个windows共享
  echo 'message' | smbclient -M windows_box 发送一个弹出信息到windows主机(XP sp2默认关闭此功能)
文本操作 (sed使用标准输入和标准输出,如果想要编辑文件,则需添加<oldfile >newfile)
  sed 's/string1/string2/g' 使用string2替换string1
  sed 's/\(.*\)1/\12/g' 将任何以1结尾的字符串替换为以2结尾的字符串
  sed '/^ *#/d; /^ *$/d' 删除注释和空白行
  sed ':a; /\\$/N; s/\\\n//; ta' 连接结尾有\的行和其下一行
  sed 's/[ \t]*$//' 删除每行后的空白
  sed 's/\([\\`\\"$\\\\]\)/\\\1/g' 将所有转义字符之前加上\
seq 10 | sed "s/^/      /; s/ *\(.\{7,\}\)/\1/" 向右排N(任意数)列
  sed -n '1000p;1000q' 输出第一千行
  sed -n '10,20p;20q' 输出第10-20行
  sed -n 's/.*<title>\(.*\)<\/title>.*/\1/ip;T;q' 输出HTML文件的<title></title>字段中的 内容
  sort -t. -k1,1n -k2,2n -k3,3n -k4,4n 排序IPV4地址
echo 'Test' | tr '[:lower:]' '[:upper:]' 转换成大写
tr -dc '[:print:]' < /dev/urandom 过滤掉不能打印的字符
history | wc -l 计算指定单词出现的次数
集合操作 (如果是英文文本的话export LANG=C可以提高速度)
  sort -u file1 file2 两个未排序文件的并集
  sort file1 file2 | uniq -d 两个未排序文件的交集
  sort file1 file1 file2 | uniq -u 两个未排序文件的差 集
  sort file1 file2 | uniq -u 两个未排序文件的对称差集
  join -t'\0' -a1 -a2 file1 file2 两个有序文件的并集
  join -t'\0' file1 file2 两个有序文件的交集
  join -t'\0' -v2 file1 file2 两个有序文件的差集
  join -t'\0' -v1 -v2 file1 file2 两个有序文件的对称差集
数学
echo '(1 + sqrt(5))/2' | bc -l 方便的计算器(计算 φ)
echo 'pad=20; min=64; (100*10^6)/((pad+min)*8)' | bc 更复杂地计算,这里计算了最大的FastE包率
echo 'pad=20; min=64; print (100E6)/((pad+min)*8)' | python Python处理数值的科学表示法
echo 'pad=20; plot [64:1518] (100*10**6)/((pad+x)*8)' | gnuplot -persist 显示FastE包率相对于包大小的图形
echo 'obase=16; ibase=10; 64206' | bc 进制转换(十进制到十六进制)
echo $((0x2dec)) 进制转换(十六进制到十进制)((shell数学扩展))
units -t '100m/9.58s' 'miles/hour' 单位转换(公尺到英尺)
units -t '500GB' 'GiB' 单位转换(SI 到IEC 前缀). 参见 numfmt
units -t '1 googol' 定义查找
seq 100 | (tr '\n' +; echo 0) | bc 加N(任意数)列. 参见 add and funcpy
日历
cal -3 显示一日历
cal 9 1752 显示指定月,年的日历
date -d fri 这个星期五是几号. 参见day
date --date='25 Dec' +%A 今年的圣诞节是星期几
date --date '1970-01-01 UTC 2147483647 seconds' 将一相对于1970-01-01 00:00的秒数转换成时间
TZ=':America/Los_Angeles' date 显示当前的美国西岸时间(使用tzselect寻找时区)
  echo "mail -s 'get the train' P@draigBrady.com < /dev/null" | at 17:45 在指定的时间发送邮件
echo "DISPLAY=$DISPLAY xmessage cooker" | at "NOW + 30 minutes" 在给定的时间弹出对话框
locales
printf "%'d\n" 1234 根据locale输出正确的数字分隔
BLOCK_SIZE=\'1 ls -l 用ls命令作类适于locale()文件分组
echo "I live in `locale territory`" 从locale数据库中展开信息
LANG=en_IE.utf8 locale int_prefix 查找指定地区的locale信息。参见ccodes
locale | cut -d= -f1 | xargs locale -kc | less 显示在locale数据库中的所有字段
recode (iconv, dos2unix, unix2dos 已经过时了)
recode -l | less 显示所有有效的字符集及其别名
  recode windows-1252.. file_to_change.txt 转换Windows下的ansi文件到当前的字符集(自动进行回车换行符的转换)
  recode utf-8/CRLF.. file_to_change.txt 转换Windows下的ansi文件到当前的字符集
  recode iso-8859-15..utf8 file_to_change.txt 转换Latin9(西欧)字符集文件到utf8
  recode ../b64 < file.txt > file.b64 Base64编码
  recode /qp.. < file.txt > file.qp Quoted-printable格式解码
  recode ..HTML < file.txt > file.html 将文本文件转换成HTML
recode -lf windows-1252 | grep euro 字符表中查找欧元符号
echo -n 0x80 | recode latin-9/x1..dump 显示字符在latin-9中的字符映射
echo -n 0x20AC | recode ucs-2/x2..latin-9/x 显示latin-9编码
echo -n 0x20AC | recode ucs-2/x2..utf-8/x 显示utf-8编码
光盘
  gzip < /dev/cdrom > cdrom.iso.gz 保存光盘拷贝
  mkisofs -V LABEL -r dir | gzip > cdrom.iso.gz 建立目录dir的光盘镜像
  mount -o loop cdrom.iso /mnt/dir 将光盘镜像挂载到 /mnt/dir (只读)
  cdrecord -v dev=/dev/cdrom blank=fast 清空一张CDRW
  gzip -dc cdrom.iso.gz | cdrecord -v dev=/dev/cdrom - 烧录光盘镜像 (使用 dev=ATAPI -scanbus 来确认该使用的 dev)
  cdparanoia -B 在当前目录下将光盘音轨转录成wav文件
  cdrecord -v dev=/dev/cdrom -audio *.wav 将当前目录下的wav文件烧成音乐光盘 (参见cdrdao)
  oggenc --tracknum='track' track.cdda.wav -o 'track.ogg' 将wav文件转换成ogg格式
磁盘空间 (参见FSlint)
ls -lSr 按文件大小降序显示文件
du -s * | sort -k1,1rn | head 显示当前目录下占用空间最大的一批文件. 参见dutop
df -h 显示空余的磁盘空间
df -i 显示空余的inode
fdisk -l 显示磁盘分区大小和类型(在root下执行)
rpm -q -a --qf '%10{SIZE}\t%{NAME}\n' | sort -k1,1n 显示所有在rpm发布版上安装的,并以包字节大小为序
dpkg-query -W -f='${Installed-Size;10}\t${Package}\n' | sort -k1,1n 显示所有在deb发布版上安装的,并以KB包大小为序
dd bs=1 seek=2TB if=/dev/null of=ext3.test 建立一个大的测试文件(不占用空间). 参见truncate
监视/调试
tail -f /var/log/messages 监视Messages日志文件
strace -c ls >/dev/null 总结/剖析命令进行的系统调用
strace -f -e open ls >/dev/null 显示命令进行的系统调用
ltrace -f -e getenv ls >/dev/null 显示命令调用的库函数
lsof -p $$ 显示当前进程打开的文件
lsof ~ 显示打开用户目录的进程
tcpdump not port 22 显示除了ssh外的网络交通. 参见tcpdump_not_me
ps -e -o pid,args --forest 以树状结构显示进程
ps -e -o pcpu,cpu,nice,state,cputime,args --sort pcpu | sed '/^ 0.0 /d' 以CPU占用率为序显示进程
ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS 以内存使用量为序显示进程. 参见ps_mem.py
ps -C firefox-bin -L -o pid,tid,pcpu,state 显示指定进程的所有线程信息
ps -p 1,2 显示指定进程ID的进程信息
last reboot 显示系统重启记录
free -m 显示(剩余的)内存总量(-m以MB为单位显示)
watch -n.1 'cat /proc/interrupts' 监测文件/proc/interrupts的变化
系统信息 (参见sysinfo)
uname -a 查看内核/操作系统/CPU信息
head -n1 /etc/issue 查看操作系统版本
cat /proc/partitions 显示所有在系统中注册的分区
grep MemTotal /proc/meminfo 显示系统可见的内存总量
grep "model name" /proc/cpuinfo 显示CPU信息
lspci -tv 显示PCI信息
lsusb -tv 显示USB信息
mount | column -t 显示所有挂载的文件系统并对齐输出
# dmidecode -q | less 显示SMBIOS/DMI 信息
# smartctl -A /dev/sda | grep Power_On_Hours 系统开机的总体时间
# hdparm -i /dev/sda 显示关于磁盘sda的信息
# hdparm -tT /dev/sda 检测磁盘sda的读取速度
# badblocks -s /dev/sda 检测磁盘sda上所有的坏扇区
交互 (参见linux keyboard shortcut database)
readline Line editor used by bash, python, bc, gnuplot, ...
screen 多窗口的虚拟终端, ...
mc 强大的文件管理器,可以浏览rpm, tar, ftp, ssh, ...
gnuplot 交互式并可进行脚本编程的画图工具
links 网页浏览器
miscellaneous
alias hd='od -Ax -tx1z -v' 方便的十六进制输出。 (用法举例: • hd /proc/self/cmdline | less)
alias realpath='readlink -f' 显示符号链接指向的真实路径((用法举例: • realpath ~/../$USER)
set | grep $USER 在当前环境中查找
  touch -c -t 0304050607 file 改变文件的时间标签 (YYMMDDhhmm)
python -m SimpleHTTPServer Serve current directory tree at http://$HOSTNAME:8000/
© Jan 22 2008
 
 
 
========================================================================================================================================
http://www.cnblogs.com/xuxm2007/archive/2011/10/20/2218846.html
在shell中常用的特殊符号罗列如下: 

# ;   ;; . , / \\ 'string'| !   $   ${}   $? $$   $* 

\"string\"* **   ? : ^ $#   $@ `command`{}   [] [[]] ()   (()) 

||   && {xx,yy,zz,...}~   ~+   ~-   &   \\<...\\>   + - %=   ==   != 

   
# 井号 (comments) 
这几乎是个满场都有的符号,除了先前已经提过的\"第一行\" 
#!/bin/bash 
井号也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后面的是注解文字,不会被执行。 
# This line is comments. 
echo \"a = $a\" # a = 0 
由于这个特性,当临时不想执行某行指令时,只需在该行开头加上 # 就行了。这常用在撰写过程中。 
#echo \"a = $a\" # a = 0 
如果被用在指令中,或者引号双引号括住的话,或者在倒斜线的后面,那他就变成一般符号,不具上述的特殊 功能。 


~ 帐户的 home 目录 
算是个常见的符号,代表使用者的 home 目录:cd ~;也可以直接在符号后加上某帐户的名称:cd ~user或者当成是路径的一部份:~/bin 
~+ 当前的工作目录,这个符号代表当前的工作目录,她和内建指令 pwd的作用是相同的。 
# echo ~+/var/log 
~- 上次的工作目录,这个符号代表上次的工作目录。 
# echo ~-/etc/httpd/logs 


; 分号 (Command separator) 
在 shell 中,担任\"连续指令\"功能的符号就是\"分号\"。譬如以下的例子:cd ~/backup ; mkdir startup ;cp ~/.* startup/. 


;; 连续分号 (Terminator) 
专用在 case 的选项,担任 Terminator 的角色。 
case \"$fop\" inhelp) echo \"Usage: Command -help -version filename\";;version) echo \"version 0.1\" ;;esac 


. 逗号 (dot,就是“点”) 
在 shell 中,使用者应该都清楚,一个 dot 代表当前目录,两个 dot 代表上层目录。 
CDPATH=.:~:/home:/home/web:/var:/usr/local 
在上行 CDPATH 的设定中,等号后的 dot 代表的就是当前目录的意思。 
如果档案名称以 dot 开头,该档案就属特殊档案,用 ls 指令必须加上 -a 选项才会显示。除此之外,在 regularexpression 中,一个 dot 代表匹配一个字元。 


'string' 单引号 (single quote) 
被单引号用括住的内容,将被视为单一字串。在引号内的代表变数的$符号,没有作用,也就是说,他被视为一般符号处理,防止任何变量替换。 
heyyou=homeecho '$heyyou' # We get $heyyou 


\"string\" 双引号 (double quote) 
被双引号用括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。这点与单引数的处理方式不同。 
heyyou=homeecho \"$heyyou\" # We get home 

`command` 倒引号 (backticks) 
在前面的单双引号,括住的是字串,但如果该字串是一列命令列,会怎样?答案是不会执行。要处理这种情况,我们得用倒单引号来做。 
fdv=`date +%F`echo \"Today $fdv\" 
在倒引号内的 date +%F 会被视为指令,执行的结果会带入 fdv 变数中。 


, 逗点 (comma,标点中的逗号) 
这个符号常运用在运算当中当做\"区隔\"用途。如下例 
#!/bin/bashlet \"t1 = ((a = 5 + 3, b = 7 - 1, c = 15 / 3))\"echo \"t1= $t1, a = $a, b = $b\" 


/ 斜线 (forward slash) 
在路径表示时,代表目录。 
cd /etc/rc.dcd ../..cd / 
通常单一的 / 代表 root 根目录的意思;在四则运算中,代表除法的符号。 
let \"num1 = ((a = 10 / 2, b = 25 / 5))\" 


\\ 倒斜线 
在交互模式下的escape 字元,有几个作用;放在指令前,有取消 aliases的作用;放在特殊符号前,则该特殊符号的作用消失;放在指令的最末端,表示指令连接下一行。 
# type rmrm is aliased to `rm -i'# \\rm ./*.log 
上例,我在 rm 指令前加上 escape 字元,作用是暂时取消别名的功能,将 rm 指令还原。 
# bkdir=/home# echo \"Backup dir, \\$bkdir = $bkdir\"Backup dir,$bkdir = /home 
上例 echo 内的 \\$bkdir,escape 将 $ 变数的功能取消了,因此,会输出 $bkdir,而第二个 $bkdir则会输出变数的内容 /home。 


| 管道 (pipeline) 
pipeline 是 UNIX 系统,基础且重要的观念。连结上个指令的标准输出,做为下个指令的标准输入。 
who | wc -l 
善用这个观念,对精简 script 有相当的帮助。 


! 惊叹号(negate or reverse) 
通常它代表反逻辑的作用,譬如条件侦测中,用 != 来代表\"不等于\" 
if [ \"$?\" != 0 ]thenecho \"Executes error\"exit 1fi 
在规则表达式中她担任 \"反逻辑\" 的角色 
ls a[!0-9] 
上例,代表显示除了a0, a1 .... a9 这几个文件的其他文件。 


: 冒号 
在 bash 中,这是一个内建指令:\"什么事都不干\",但返回状态值 0。 

echo $? # 回应为 0 
: > f.$$ 
上面这一行,相当于 cat /dev/null >f.$$。不仅写法简短了,而且执行效率也好上许多。 
有时,也会出现以下这类的用法 
: ${HOSTNAME?} ${USER?} ${MAIL?} 
这行的作用是,检查这些环境变数是否已设置,没有设置的将会以标准错误显示错误讯息。像这种检查如果使用类似 test 或 if这类的做法,基本上也可以处理,但都比不上上例的简洁与效率。 


? 问号 (wild card) 
在文件名扩展(Filename expansion)上扮演的角色是匹配一个任意的字元,但不包含 null 字元。 
# ls a?a1 
善用她的特点,可以做比较精确的档名匹配。 


* 星号 (wild card) 
相当常用的符号。在文件名扩展(Filename expansion)上,她用来代表任何字元,包含 null 字元。 
# ls a*a a1 access_log 
在运算时,它则代表 \"乘法\"。 
let \"fmult=2*3\" 
除了内建指令 let,还有一个关于运算的指令expr,星号在这里也担任\"乘法\"的角色。不过在使用上得小心,他的前面必须加上escape 字元。 


** 次方运算 
两个星号在运算时代表 \"次方\" 的意思。 
let \"sus=2**3\"echo \"sus = $sus\" # sus = 8 


$ 钱号(dollar sign) 
变量替换(Variable Substitution)的代表符号。 
vrs=123echo \"vrs = $vrs\" # vrs = 123 
另外,在 Regular Expressions 里被定义为 \"行\" 的最末端 (end-of-line)。这个常用在grep、sed、awk 以及 vim(vi) 当中。 


${} 变量的正规表达式 
bash 对 ${} 定义了不少用法。以下是取自线上说明的表列 
   ${parameter:-word}   ${parameter:=word}   ${parameter:?word}   ${parameter:+word}   ${parameterffset}   ${parameterffset:length}   ${!prefix*}   ${#parameter}   ${parameter#word}   ${parameter##word}   ${parameter%word}   ${parameter%%word}   ${parameter/pattern/string}   ${parameter//pattern/string} 


$* 
$* 引用script的执行引用变量,引用参数的算法与一般指令相同,指令本身为0,其后为1,然后依此类推。引用变量的代表方式如下: 
$0, $1, $2, $3, $4, $5, $6, $7, $8, $9, ${10}, ${11}..... 
个位数的,可直接使用数字,但两位数以上,则必须使用 {} 符号来括住。 
$* 则是代表所有引用变量的符号。使用时,得视情况加上双引号。 
echo \"$*\" 
还有一个与 $* 具有相同作用的符号,但效用与处理方式略为不同的符号。 


$@ 
$@ 与 $* 具有相同作用的符号,不过她们两者有一个不同点。 
符号 $* 将所有的引用变量视为一个整体。但符号 $@ 则仍旧保留每个引用变量的区段观念。 

$# 
这也是与引用变量相关的符号,她的作用是告诉你,引用变量的总数量是多少。 
echo \"$#\" 


$? 状态值 (status variable) 
一般来说,UNIX(linux) 系统的进程以执行系统调用exit()来结束的。这个回传值就是status值。回传给父进程,用来检查子进程的执行状态。 
一般指令程序倘若执行成功,其回传值为 0;失败为 1。 
tar cvfz dfbackup.tar.gz /home/user > /dev/nullecho\"$?\"$$ 
由于进程的ID是唯一的,所以在同一个时间,不可能有重复性的 PID。有时,script会需要产生临时文件,用来存放必要的资料。而此script亦有可能在同一时间被使用者们使用。在这种情况下,固定文件名在写法上就显的不可靠。唯有产生动态文件名,才能符合需要。符号$$或许可以符合这种需求。它代表当前shell 的 PID。 
echo \"$HOSTNAME, $USER, $MAIL\" > ftmp.$$ 
使用它来作为文件名的一部份,可以避免在同一时间,产生相同文件名的覆盖现象。 
ps: 基本上,系统会回收执行完毕的 PID,然后再次依需要分配使用。所以 script 即使临时文件是使用动态档名的写法,如果script 执行完毕后仍不加以清除,会产生其他问题。 

(   ) 指令群组 (command group) 
用括号将一串连续指令括起来,这种用法对 shell 来说,称为指令群组。如下面的例子:(cd ~ ; vcgh=`pwd` ;echo $vcgh),指令群组有一个特性,shell会以产生 subshell来执行这组指令。因此,在其中所定义的变数,仅作用于指令群组本身。我们来看个例子 
# cat ftmp-01#!/bin/basha=fsh(a=incg ; echo -e \"\\n $a \\n\")echo $a#./ftmp-01incgfsh 
除了上述的指令群组,括号也用在 array 变数的定义上;另外也应用在其他可能需要加上escape字元才能使用的场合,如运算式。 


(( )) 
这组符号的作用与 let 指令相似,用在算数运算上,是 bash 的内建功能。所以,在执行效率上会比使用 let指令要好许多。 
#!/bin/bash(( a = 10 ))echo -e \"inital value, a = $a\\n\"(( a++))echo \"after a++, a = $a\" 

{ } 大括号 (Block of code) 
有时候 script 当中会出现,大括号中会夹着一段或几段以\"分号\"做结尾的指令或变数设定。 
# cat ftmp-02#!/bin/basha=fsh{a=inbc ; echo -e \"\\n $a \\n\"}echo $a#./ftmp-02inbcinbc 
这种用法与上面介绍的指令群组非常相似,但有个不同点,它在当前的 shell 执行,不会产生 subshell。 
大括号也被运用在 \"函数\" 的功能上。广义地说,单纯只使用大括号时,作用就像是个没有指定名称的函数一般。因此,这样写 script也是相当好的一件事。尤其对输出输入的重导向上,这个做法可精简 script 的复杂度。 

此外,大括号还有另一种用法,如下 
{xx,yy,zz,...} 
这种大括号的组合,常用在字串的组合上,来看个例子 
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,这几个目录。这组符号在适用性上相当广泛。能加以善用的话,回报是精简与效率。像下面的例子 
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}} 
如果不是因为支援这种用法,我们得写几行重复几次呀! 


[   ] 中括号 
常出现在流程控制中,扮演括住判断式的作用。if [ \"$?\" != 0 ]thenecho \"Executes error\"exit1fi 
这个符号在正则表达式中担任类似 \"范围\" 或 \"集合\" 的角色 
rm -r 200[1234] 
上例,代表删除 2001, 2002, 2003, 2004 等目录的意思。 


[[ ]] 
这组符号与先前的 [] 符号,基本上作用相同,但她允许在其中直接使用 || 与&& 逻辑等符号。 
#!/bin/bashread akif [[ $ak > 5 || $ak< 9 ]]thenecho $akfi 


|| 逻辑符号 
这个会时常看到,代表 or 逻辑的符号。 


&& 逻辑符号 
这个也会常看到,代表 and 逻辑的符号。 


& 后台工作 
单一个& 符号,且放在完整指令列的最后端,即表示将该指令列放入后台中工作。 
tar cvfz data.tar.gz data > /dev/null& 

\\<...\\> 单字边界 
这组符号在规则表达式中,被定义为\"边界\"的意思。譬如,当我们想找寻 the 这个单字时,如果我们用 
grep the FileA 
你将会发现,像 there 这类的单字,也会被当成是匹配的单字。因为 the 正巧是 there的一部份。如果我们要必免这种情况,就得加上 \"边界\" 的符号 
grep '\\' FileA 


+ 加号 (plus) 
在运算式中,她用来表示 \"加法\"。 
expr 1 + 2 + 3 
此外在规则表达式中,用来表示\"很多个\"的前面字元的意思。 
# grep '10\\+9' fileB109100910000910000931010009#这个符号在使用时,前面必须加上escape 字元。 


- 减号 (dash) 
在运算式中,她用来表示 \"减法\"。 
expr 10 - 2 
此外也是系统指令的选项符号。 
ls -expr 10 - 2 
在 GNU 指令中,如果单独使用 - 符号,不加任何该加的文件名称时,代表\"标准输入\"的意思。这是 GNU指令的共通选项。譬如下例 
tar xpvf - 
这里的 - 符号,既代表从标准输入读取资料。 
不过,在 cd 指令中则比较特别 
cd - 
这代表变更工作目录到\"上一次\"工作目录。 


% 除法 (Modulo) 
在运算式中,用来表示 \"除法\"。 
expr 10 % 2 
此外,也被运用在关于变量的规则表达式当中的下列 
${parameter%word}${parameter%%word} 
一个 % 表示最短的 word 匹配,两个表示最长的 word 匹配。 


= 等号 (Equals) 
常在设定变数时看到的符号。 
vara=123echo \" vara = $vara\" 
或者像是 PATH 的设定,甚至应用在运算或判断式等此类用途上。 


== 等号 (Equals) 
常在条件判断式中看到,代表 \"等于\" 的意思。 
if [ $vara == $varb ] 
...下略 

!= 不等于 
常在条件判断式中看到,代表 \"不等于\" 的意思。 
if [ $vara != $varb ] 
...下略 


^ 
这个符号在规则表达式中,代表行的 \"开头\" 位置,在[]中也与\"!\"(叹号)一样表示“非” 


输出/输入重导向 
> >>   <   <<   :>   &>   2&>   2<>>&   >&2  

文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。 
常用的文件描述符如下: 
文件描述符     名称     常用缩写 默认值 
0        标准输入 stdin    键盘 
1        标准输出 stdout     屏幕 
2    标准错误输出   stderr     屏幕 
我们在简单地用<或>时,相当于使用 0< 或 1>(下面会详细介绍)。 
* cmd > file 
把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bash的noclobber选项可以防止复盖原有文件。 
* cmd >> file 
把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件後面。 
* cmd < file 
使cmd命令从file读入 
* cmd << text 
从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用<<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考後面的例子。 
* cmd <<< word 
把word(而不是文件word)和後面的换行作为输入提供给cmd。 
* cmd <> file 
以读写模式把文件file重定向到输入,文件file不会被破坏。仅当应用程序利用了这一特性时,它才是有意义的。 
* cmd >| file 
功能同>,但即便在设置了noclobber时也会复盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能。 
: > filename    把文件\"filename\"截断为0长度.# 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同). 
cmd >&n 把输出送到文件描述符n 
cmd m>&n 把输出 到文件符m的信息重定向到文件描述符n 
cmd >&- 关闭标准输出 
cmd <&n 输入来自文件描述符n 
cmd m<&n m来自文件描述各个n 
cmd <&- 关闭标准输入 
cmd <&n- 移动输入文件描述符n而非复制它。(需要解释) 
cmd >&n- 移动输出文件描述符 n而非复制它。(需要解释) 
注意: >&实际上复制了文件描述符,这使得cmd > file 2>&1与cmd 2>&1 >file的效果不一样。
 

 

 http://hi.baidu.com/hellosimple/blog/item/559483f1f1c0e95e352acc89.html

 

 http://blog.csdn.net/mqboss/article/details/6549176

1、{} 大括号:
用法一:通配符扩展 
代码: 
ls my_{finger,toe}s

这条命令相当于如下命令的组合:
代码: 
ls my_fingers my_toes
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列表中)使用多条语句,你可以把它们括在花括号{}中来构造一个语句块。
代码: 
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、[] 中括号: 
用法一:通配符扩展:
允许匹配方括号中任何一个单个字符
代码: 
ls /[eh][to][cm]*

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


3、`command` 反引号:
`command`与$(command)的含义相同,都是返回当前执行命令的结果 
代码: 
#!/bin/sh
for file in $(ls f*.sh);do
    lpr $file
done
exit 0

该例实现了扩展f*.sh给出所有匹配模式的文件的名字。

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


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


6、$((...))语法:对括号内的表达式求值 
代码: 
#!/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 || …:允许执行一系列命令直到有一条命令成功为止,其后所有命令将不再被执行
#!/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 
代码: 
$ :
$ echo $?
$ 0
while: (该语句结构可实现一个无限循环)


10、; 分号: 在 shell 中,担任"连续指令"功能的符号就是"分号" 
代码: 
cd ~/backup ; mkdir startup ; cp ~/.* startup/.


11、# 井号:表示符号后面的是注解文字,不会被执行; 
代码: 
* 匹配文件名中的任何字符,包括字符串;
? 匹配文件名中的任何单个字符。
~ 代表使用者的 home 目录


12、/ 倒斜线:
放在指令前,有取消 aliases(别名) 的作用;
放在特殊符号前,则该特殊符号的作用消失;
放在指令的最末端,表示指令连接下一行(使得回车符无效,只起换行作用)

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

14、** 次方运算:两个星号在运算时代表 "次方" 的意思 
代码: 
let "sus=2**3"
echo "sus = $sus"
$ sus = 8 -
 
分类:  Linux, 脚本语言
标签:  shell


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM