Contents ...
udn網路城邦
shell編程筆記
2015/11/26 16:04
瀏覽498
迴響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的文件和具體位置
全站分類:知識學習 科學百科
自訂分類:不分類
上一則: 學習Python語言必備的資源
下一則: 通用日誌滾動腳本

限會員,要發表迴響,請先登入