轉(zhuǎn)帖|行業(yè)資訊|編輯:龔雪|2015-10-13 13:24:44.000|閱讀 249 次
概述:shell腳本可以直接與操作系統(tǒng)內(nèi)核打交道,從而完成任意復(fù)雜的任務(wù),讓我們一起來看看shell是如何完成某些特殊復(fù)雜的功能的。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
通過上一節(jié)我們知道,Linux Bash shell 命令行的變量都被解析成字符串,如
//變量被解析為字符串 root@sparkmaster:~/ShellLearning/chapter09# first=1 root@sparkmaster:~/ShellLearning/chapter09# second=2 //并不會(huì)進(jìn)行加法操作,而是兩個(gè)字符串拼接 root@sparkmaster:~/ShellLearning/chapter09# $first+$second 1+2: command not found
那如何要進(jìn)行基本的加減乘除等運(yùn)算,怎么辦呢?有三種命令可以做到,它們是let, (( )), and []。先來看一下let命令
//使用let命令,會(huì)進(jìn)行加法運(yùn)算 root@sparkmaster:~/ShellLearning/chapter09# let result=first+second root@sparkmaster:~/ShellLearning/chapter09# echo $result 3
let命令還提供c、c++風(fēng)格的自增、自減等操作,如:
root@sparkmaster:~/ShellLearning/chapter09# first=2 root@sparkmaster:~/ShellLearning/chapter09# $first 2: command not found //自增操作 root@sparkmaster:~/ShellLearning/chapter09# let first++ root@sparkmaster:~/ShellLearning/chapter09# echo ${first} 3 //自減操作 root@sparkmaster:~/ShellLearning/chapter09# let first-- root@sparkmaster:~/ShellLearning/chapter09# echo ${first} 2 //相當(dāng)于let first=first+10 root@sparkmaster:~/ShellLearning/chapter09# let first+=10 root@sparkmaster:~/ShellLearning/chapter09# echo ${first} 12 //相當(dāng)于let first=first-10,其它操作如乘、除類似 root@sparkmaster:~/ShellLearning/chapter09# let first-=10 root@sparkmaster:~/ShellLearning/chapter09# echo ${first} 2
[]命令的功能與let命令類似,如
root@sparkmaster:~/ShellLearning/chapter09# first=5 root@sparkmaster:~/ShellLearning/chapter09# second=6 root@sparkmaster:~/ShellLearning/chapter09# result=$[first+second] root@sparkmaster:~/ShellLearning/chapter09# echo $result 11 //result=$[$first+$second]與result=$[first+second]等同 root@sparkmaster:~/ShellLearning/chapter09# result=$[$first+$second] root@sparkmaster:~/ShellLearning/chapter09# echo $result 11
也可以使用(( )) 命令進(jìn)行,如:
root@sparkmaster:~/ShellLearning/chapter09# reslut=$((first+second)) root@sparkmaster:~/ShellLearning/chapter09# echo $result 11
需要注意的是上述命令只對(duì)整型數(shù)值有效,不適用于浮點(diǎn)數(shù)
root@sparkmaster:~/ShellLearning/chapter09# result=$[first+second] bash: 5.5: syntax error: invalid arithmetic operator (error token is ".5") root@sparkmaster:~/ShellLearning/chapter09# let resul=first+second bash: let: 5.5: syntax error: invalid arithmetic operator (error token is ".5")
如果有浮點(diǎn)數(shù)參與運(yùn)算,可以將echo與bc命令結(jié)合起來使用,代碼如下:
root@sparkmaster:~/ShellLearning/chapter09# echo "$first+$second" | bc 12.0 root@sparkmaster:~/ShellLearning/chapter09# echo "$first*$second" | bc 35.7
在Linux操作系統(tǒng)當(dāng)中,文件描述符(File descriptors )與文件的輸入輸出相關(guān),用整數(shù)表示,最常用的三種文件描述符號(hào)為stdin、stdout及stderr。stdin表示標(biāo)準(zhǔn)輸入(standard input),文件描述符為0;stdout表示標(biāo)準(zhǔn)輸出(standard output),文件描述符為1;stderr表示標(biāo)準(zhǔn)錯(cuò)誤(standard error),文件描述為2。
標(biāo)準(zhǔn)輸出指的是命令執(zhí)行正常時(shí)顯示到終端的信息,如
//stdout root@sparkmaster:~/ShellLearning/chapter10# echo "Shell Scripting 1" Shell Scripting 1
標(biāo)準(zhǔn)錯(cuò)誤指的是命令執(zhí)行異常時(shí)顯示到終端的信息,如
//stderr root@sparkmaster:~/ShellLearning/chapter10# cat ls cat: ls: No such file or directory
如果不想將這些信息輸出到終端,而是輸出到文件中保存起來,這時(shí)就需要用到重定向,具體代碼如下:
//利用>命令將標(biāo)準(zhǔn)輸出重定向輸出到文件,>命令首先清空shell.txt文件 //然后將信息寫到文件當(dāng)中,相當(dāng)于覆蓋了以前文件的內(nèi)容 root@sparkmaster:~/ShellLearning/chapter10# echo "Shell Scripting 1" > shell.txt //以追加的方式將標(biāo)準(zhǔn)輸出重定向到文件 root@sparkmaster:~/ShellLearning/chapter10# echo "Shell Scripting 2" >> shell.txt root@sparkmaster:~/ShellLearning/chapter10# cat shell.txt Shell Scripting 1 Shell Scripting 2
剛提到echo “Shell Scripting 1” > shell.txt命令是將標(biāo)準(zhǔn)輸出(文件描述符為1)重定向到文件shell.txt當(dāng)中,它其實(shí)相當(dāng)于echo “Shell Scripting 1” 1> shell.txt,只不過默認(rèn)可以省略:
root@sparkmaster:~/ShellLearning/chapter10# echo "Shell Scripting 1" 1> shell2.txt root@sparkmaster:~/ShellLearning/chapter10# cat shell2.txt Shell Scripting 1
同樣標(biāo)準(zhǔn)錯(cuò)誤輸出也可以重定向到文件當(dāng)中,與標(biāo)準(zhǔn)輸出重定向不同的是,其文件描述符不能省略
//2>將標(biāo)準(zhǔn)錯(cuò)誤信息重定向到文件中,這里的文件描述符2不能省略 root@sparkmaster:~/ShellLearning/chapter10# cat ls 2> shellError.txt root@sparkmaster:~/ShellLearning/chapter10# cat shellError.txt cat: ls: No such file or directory //標(biāo)準(zhǔn)錯(cuò)誤的文件描述符2不能省略,因?yàn)槭÷缘脑捘J(rèn)是標(biāo)準(zhǔn)輸出 //會(huì)將錯(cuò)誤信息輸出到終端 root@sparkmaster:~/ShellLearning/chapter10# cat ls > shellError.txt cat: ls: No such file or directory
重定向時(shí)可以根據(jù)將重定向命令結(jié)合起來使用,如
//cmd命令無效,會(huì)產(chǎn)生標(biāo)準(zhǔn)錯(cuò)誤,此時(shí)錯(cuò)誤信息會(huì)重定向到文件stderr.txt文件當(dāng)中 root@sparkmaster:~/ShellLearning/chapter10# cmd 2>stderr.txt 1>stdout.txt root@sparkmaster:~/ShellLearning/chapter10# cat stderr.txt No command 'cmd' found, did you mean: Command 'dcmd' from package 'devscripts' (main) Command 'wmd' from package 'wml' (universe) Command 'tcmd' from package 'tcm' (universe) Command 'cmp' from package 'diffutils' (main) Command 'qcmd' from package 'renameutils' (universe) Command 'mmd' from package 'mtools' (main) Command 'cm' from package 'config-manager' (universe) Command 'mcd' from package 'mtools' (main) Command 'icmd' from package 'renameutils' (universe) cmd: command not found //stdout.txt中無內(nèi)容 root@sparkmaster:~/ShellLearning/chapter10# cat stdout.txt //ls命令合法,會(huì)產(chǎn)生標(biāo)準(zhǔn)輸出,此時(shí)會(huì)被重定向到stdout.txt文件當(dāng)中 root@sparkmaster:~/ShellLearning/chapter10# ls 2>stderr.txt 1>stdout.txt root@sparkmaster:~/ShellLearning/chapter10# cat stdout.txt shell2.txt shellError.txt shell.txt stderr.txt stdout.txt
在實(shí)際使用時(shí),有些時(shí)候可能會(huì)將標(biāo)準(zhǔn)輸出與標(biāo)準(zhǔn)錯(cuò)誤輸出都重定向到一個(gè)文件,此時(shí)可以使用下列命令
//&>將標(biāo)準(zhǔn)錯(cuò)誤輸出轉(zhuǎn)換為標(biāo)準(zhǔn)輸出,相當(dāng)于2>&1 root@sparkmaster:~/ShellLearning/chapter10# cmd &> output.txt root@sparkmaster:~/ShellLearning/chapter10# cat output.txt No command 'cmd' found, did you mean: Command 'dcmd' from package 'devscripts' (main) Command 'wmd' from package 'wml' (universe) Command 'tcmd' from package 'tcm' (universe) Command 'cmp' from package 'diffutils' (main) Command 'qcmd' from package 'renameutils' (universe) Command 'mmd' from package 'mtools' (main) Command 'cm' from package 'config-manager' (universe) Command 'mcd' from package 'mtools' (main) Command 'icmd' from package 'renameutils' (universe) cmd: command not found root@sparkmaster:~/ShellLearning/chapter10# ls &>output.txt root@sparkmaster:~/ShellLearning/chapter10# cat output.txt output.txt shell2.txt shellError.txt shell.txt stderr.txt stdout.txt
有時(shí)命令運(yùn)行時(shí),對(duì)于出錯(cuò)信息我們并不關(guān)心,又不想浪費(fèi)存儲(chǔ)空間存儲(chǔ)這些錯(cuò)誤信息,此時(shí)可以將其丟棄,具體做法是將標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到/dev/null文件當(dāng)中,/dev/null就像一個(gè)垃圾黑洞
//將錯(cuò)誤信息丟棄 root@sparkmaster:~/ShellLearning/chapter10# cmd 2> /dev/null
標(biāo)準(zhǔn)錯(cuò)誤輸出或標(biāo)準(zhǔn)輸出還可以作為管道命令的標(biāo)準(zhǔn)輸入,例如:
//標(biāo)準(zhǔn)輸出作為另外一個(gè)命令的標(biāo)準(zhǔn)輸入 root@sparkmaster:~/ShellLearning/chapter10# cat stdout.txt | more shell2.txt shellError.txt shell.txt stderr.txt stdout.txt //標(biāo)準(zhǔn)錯(cuò)誤輸出作為另一個(gè)命令的標(biāo)準(zhǔn)輸入 root@sparkmaster:~/ShellLearning/chapter10# ls + | more ls: cannot access +: No such file or directory
有時(shí)我們既想將標(biāo)準(zhǔn)錯(cuò)誤輸出或標(biāo)準(zhǔn)輸出重定向到一個(gè)文件當(dāng)中,又想它作為另外一個(gè)命令的標(biāo)準(zhǔn)輸入,這時(shí)可以使用tee命令
//標(biāo)準(zhǔn)輸出重定向到文件teeStdout.txt當(dāng)中,同時(shí)又作為more的標(biāo)準(zhǔn)輸入 root@sparkmaster:~/ShellLearning/chapter10# ls | tee teeStdout.txt | more output.txt shell2.txt shellError.txt shell.txt stderr.txt stdout.txt teeStdout.txt root@sparkmaster:~/ShellLearning/chapter10# cat teeStdout.txt output.txt shell2.txt shellError.txt shell.txt stderr.txt stdout.txt teeStdout.txt
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn