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