shell編程筆記
2015/11/26 16:04
瀏覽499
迴響0
推薦0
引用0
相關書籍推薦:Advanced Bash-Scripting Guide<<高級Bash 腳本編程指南>>
1、shell三類:Bourne shell(sh Linux默認),C shell (csh),Korn shell(ksh)
sh 在編程時很優秀,但用戶交互不夠優秀;csh用戶交互做的比sh好,但接口不如sh;ksh融合了csh和sh的優點,並兼容sh
2、試驗命令時出錯:(cd /source/directory && tar cf - . ) | (cd /dest/directory && tar xvfp -)
(cd /home/apx-services/ && tar zvcf -.)|(cd ./ && tar xvfp -) 報錯: tar: Cowardly refusing to create an empty archive
原因是少了空格!:改成(cd /home/apx-services/ && tar cf - . ) | (cd ../test/ && tar xvfp -),成功
另外,網上查的出現這種錯誤的可能也有windows下寫的sh拷到Linux下時,這種錯誤用dos2unix filename處理後就能解決
3、下面兩段加到sh中,報錯:bash_test.sh: line 16: syntax error: unexpected end of file
if [ -z $y ]
echo $y
if [ -n $x ]
echo $x
原因是:if的sh語法
if [ -z $y ]
then
echo $y
fi
if [ -n $x ]
then
echo $x
fi
4、sh中整數運算一般通過 let 和 expr 這兩個指令來實現,如對變量 x 加 1 可以寫作:let "x = $x + 1" 或者 x=`expr $x + 1`
x=1999
let "x=$x + 1"
5、until測試:報錯[: too many arguments
j=1
until [ $j eq '4' ]
do
echo $j
j=' expr $j + 1 '
done
改成:until [ $j eq '4' ]
j=`expr $j + 1`
報錯[: eq: binary operator expected
改成:until [ $j -eq '4' ]正常運行
6、BASH 中有一些保留變量,下面列出了一些(這些參數只要寫一個sh文件echo出來就比較的明白了,一開始學的時候我一直只是看,越看越不明白):
$IFS 這個變量中保存了用於分割輸入參數的分割字符,默認識空格。 $HOME 這個變量中存儲了當前用戶的根目錄路徑。
$PATH 這個變量中存儲了當前 Shell 的默認路徑字符串。
$PS1 表示第一個系統提示符。
$PS2 表示的二個系統提示符。
$PWD 表示當前工作路徑。
$EDITOR 表示系統的默認編輯器名稱。
$BASH 表示當前 Shell 的路徑字符串。
$0, $1, $2, ... 表示系統傳給腳本程序或腳本程序傳給函數的第0個、第一個、第二個等參數。
$# 表示腳本程序的命令參數個數或函數的參數個數。
$$ 表示該腳本程序的進程號,常用於生成文件名唯一的臨時文件。
$? 表示腳本程序或函數的返回狀態值,正常為 0,否則為非零的錯誤號。
$* 表示所有的腳本參數或函數參數。
$@ 和 $* 涵義相似,但是比 $* 更安全。
$! 表示最近一個在後臺運行的進程的進程號。
7、Bash內建參數(和上一條差不多,多出來的是用的少一些吧?)
PPID : 該bash的呼叫者process ID.
PWD : 目前的工作目錄。
OLDPWD : 上一個工作目錄。
REPLY : 當read命令沒有參數時,直接設在REPLY上。
UID : User ID。
EUID : Effective User ID。
BASH : Bash的完整路徑。
BASH_VERSION : Bash版本。
SHLVL : 每次有Bash執行時,數字加一。
RANDOM : 每次這個參數被用到時,就會產生一個亂數在RANDOM上。
SECONDS : 從這個Shell一開始啟動後的時間。
LINENO : Script的行數。
HISTCMD : 歷史記錄數。
OPTARG : getopts處理的最後一個選項參數。
OPTIND : 下一個要由getopts所處理的參數號碼。
HOSTTYPE : 機器種類。
OSTYPE : 作業系統名稱。
IFS : Internal Field Separator。
PATH : 命令搜尋路徑。
PATH="/usr/gnu/bin:/usr/local/bin:/usr/ucb:/bin:/usr/bin:."
HOME : 目前使用者的home directory;
CDPATH : cd命令的搜尋路徑。
ENV : 如果這個參數被設定,每次有shell script被執行時,將會執行它所設定的檔名做為環境設定。
MAIL : 如果這個參數被設定,而且MAILPATH沒有被設定,那麽有信件進來時,bash會通知使用者。
MAILCHECK : 設定多久時間檢查郵件一次。
MAILPATH : 一串的郵件檢查路徑。
MAIL_WARNING : 如果有設定的話,郵件被讀取後,將會顯示訊息。
PS1 : 提示訊息設定,內定為"bash$ "。(請詳見提示訊息一節。)
PS2 : 第二提示訊息設定,內定為"> "。
PS3 : select命令所使用的提示訊息。
PS4 : 執行追蹤時用的提示訊息設定,內定為"+ "。
HISTSIZE : 命令歷史記錄量,內定為500。
HISTFILE : 歷史記錄檔,內定~/.bash_history。
HISTFILESIZE : 歷史記錄檔行數最大值,內定500。
OPTERR : 如果設為1,bash會顯示getopts的錯誤。
PROMPT_COMMAND : 如果設定的話,該值會在每次執行命令前都顯示。
IGNOREEOF : 將EOF值當成輸入,內定為10。
TMOUT : 如果設為大於零,該值被解譯為輸入等待秒數。若無輸入,當成沒有輸入。
FCEDIT : fc命令的內定編輯器。
FIGNORE : 請詳見READLINE。
INPUTRC : readline的startup file,內定~/.inputrc
8、獲取設備simid:(at_chat能夠執行發送at命令到at服務器端並獲取response)
DEVICE="/dev/citty6"
simid=`/usr/app/at_chat -c AT+CIMI -i $DEVICE | grep -o '^[0-9]*$'`
解釋:AT+CIMI 獲得IMSI。這命令用來讀取或者識別SIM卡的IMSI(國際移動簽署者標識)。在讀取IMSI之前應該先輸入PIN(如果需要PIN的話)。
9、awk是一種編程語言,用於在linux/unix下對文本和數據進行處理。awk的處理文本和數據的方式:它逐行掃描文件,從第一行到最後一行,尋找匹配的特定模式的行,
並在這些行上進行你想要的操作。如果沒有指定處理動作,則把匹配的行顯示到標準輸出(屏幕),如果沒有指定模式,則所有被操作所指定的行都被處理。
pattern {action} 如$ awk '/root/' test,或$ awk '$3 < 100' test。
10、Q:shell中提供`和'的區別是?
` 後置引用,命令替換
' 全引用. 'STRING' 阻止了全部特殊字
proto="ls -al"
ehco "$proto" //輸出ls -al
echo '$proto' //輸出$proto
echo `$proto` //輸出total 40 drwxrwxrwx 2 root root 4096 2012-08-23 15:03 . drwxrwxrwx 3 root root 4096 2012-08-22 10:12 ......
下面一段代碼是單獨測試``,下一次調用的時候就已經運行了
proto=`ls -al`
edit="$proto"
echo $edit //輸出total 40 drwxrwxrwx 2 root root 4096 2012-08-23 15:03 . drwxrwxrwx 3 root root 4096 2012-08-22 10:12 ......
11、覺得還比較好玩:Linux下使cpu使用率達到100%(csdn上看到的,自己去運行了下,然後top出來)
Cpu(s): 8.0%us, 52.2%sy, 0.0%ni, 39.5%id, 0.0%wa, 0.0%hi, 0.4%si, 0.0%st
這裏的冒號其實就是個標識符,用冒號是為了更具迷惑性一點而已- -!換成其它標識符就好理解了
a()
{
a | a&
};
a
這回明白了吧,首先定義一個函數a,a的函數體為a | a&
a為調用自身,|是管道(這是最具殺傷力的部分,管道兩邊的進程同時運行,直接導致每次遞歸調用創建的進程數呈指數增長),&在後臺運行
最後調用剛剛定義的這個函數a
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt;}
附錄(Linux shell相關命令):
brctl命令,linux配置網橋
arp -n | grep "br0"//地址解析協議,ip->mac
sed -e 's/Device[0-9]*/Device/g' Device1~9*àDevice
cut -f 2 -d "=",根據“=”來拆分字符串,並從結果中獲得第二個拆分出來的字符串
grep -r 'config_get' /lib/, 在文件夾/lib下查找有config_get的文件和具體位置
限會員,要發表迴響,請先登入


