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