shell 編程

在linux中提供了多種shell 
 sh , bash , csh , tcsh , ksh 
常用的是 bash 

# cat /etc/shells  來查看系統中可以使用的shell
你默認的shell 是設置在 /etc/passwd 中 mia 中

# clear 清空屏幕

# df 顯示本機的硬盤空間數

# set [-x +x -v +v] 設置調試模式的命令

shell 字符串截取
1, echo ${bianliang:1:20} # 將變量baingliang 從1位截取到第20位
2, ${bianliang##*string} # 從左向右截取最後一個string後的字符串
   ${bianliang#*string}  #從左向右截取第一個string後的字符串
   ${bianliang%%string*}  #從右向左截取最後一個string後的字符串
   ${bianliang%string*}  #從右向左截取第一個string後的字符串
   ${#string}            #獲取字符串的長度

/etc/profile 文件存放了shell環境和程序啓動配置 
~/.bash_profile 單獨用戶的配置文件

# env / printenv   用來顯示系統中的環境變量
 本地變量只存在於當前shell中

變量有四種類型 
 1,字符串變量 2,整數變量 3,常量 4,數組變量

建立變量
 變量不允許數字開頭 而且變量賦值的" = "號兩邊不能出現空格否則會出現錯誤
刪除變量
 在linux中變量只能用unset刪除 並可同時刪除多個 如 unset BIANLIANG BIANLIANG2 BIANLIANG3
導出變量 Exprot
 建立一個變量 是僅存在於當前shell中的 而當前shell的子進程是不理會的所以用exorit來設置 被設置  後的變量將和環境變量一樣。

命令列隊
 “與”列隊的形式
   命令1 && 命令2      <當命令1結束後執行命令2
 “或”列隊的形式
   命令1 || 命令2      <當命令1返回值是0就執行命令2

循環結構
 until 
  until 測試命令; do 命令塊; done
用來輸入密碼的例子
until [ "$y" = "y" ] || [ "$y" = "s" ]
do
    read y
    echo '密碼錯誤'
done
echo '正確可以繼續操作'

 while
  while 測試命令; do 命令塊; done
 for
  for 變量[in 單詞]; do 命令塊; done
 for (2)
  for ((表達式1; 表達式2; 表達式3)); do 命令塊; done

條件判斷
 if [條件1]; then
 命令塊1
 elif [條件2]; then
 命令塊2
 else 
 其他命令
 fi #結束

 case 變量 in       
  變量=1 | 變量=2)    //變量左側的(是可選的  就是可有可無 
   echo 1
  ;;                 //結束是兩個;
  變量3)
   echo 3
  ;;
  *)                 相當於if的 else  就是 其他
   echo 其他
  ;;
  esca   
 在case中 一個分句結束後 ;;結束 的話 就是跳出判斷  如果是;&結束 就會繼續判斷下面的判斷
 如果是;;&代替側會繼續判斷後面的語句知道結束f

 select 查看目錄清單,   結構和for相似
 select name in /*;
 do 
  echo $name
 done

刪除一個文件
rm -f files 

清空一個文件
cat /dev/null > files 

文件開頭是用 #! 表明文件執行時需要一個解釋器的

在win平臺下編寫shell 要注意編碼, 只有unix的編碼才能被shell識別,否則會出錯


shell 擴展
 {}擴展
 # echo a{b,c}s #將輸出 abs acs 括號擴展  可以嵌套{}
 ~擴展
 # echo ~   #將顯示你的home目錄 如 /var/home/youname
 shell參數和變量擴展
 # echo ${BL:=zhi} # 輸出 zhi   允許設置尚不存在的變量
 命令替換
 # echo `date` #將輸入日期 將命令寫入變量或者輸出。 
 算數擴展
 # echo $[1*2] # 將算數操作寫入[]中 
   echo $a=$[1*2]; echo $[a++] # 將輸出4..累加結果

別名 alias
 # alias dh='df -h' # 建立別名
 # alias            # 顯示已經設置的別名列表
 # unalias dh       # 刪除別名

GAWK 命令
 awk 用print 按塊打印輸出數據
 # ls -l | awk '{print $1,$2}' # 只顯示列表的 第一列和第二列
 # ls -l | awk '/(.sh)?$/ {print $1,$2}' # 用正則匹配顯示命令塊匹配後的列表
 # ls -l | awk 'BEGIN {print "start"} /(.sh)?$/ {print $1,$2}' # 匹配之前顯示字符
 # ls -l | awk '/(.sh)?$/ {print $1,$2} end {print "is end"}' # 匹配結束顯示字符
  匹配分隔符有,分割 不用,就將多個塊連接到一塊了。
AWK 腳本
將awk 寫入腳本中 命名爲 .awk後綴
# ls -l | awk -f desh.awk  # 用腳本文件代替手寫 


if 表達式
-a FILE ] 如果 FILE 存在則爲真。
-b FILE ] 如果 FILE 存在且是一個塊特殊文件則爲真。
-c FILE ] 如果 FILE 存在且是一個字特殊文件則爲真。
-d FILE ] 如果 FILE 存在且是一個目錄則爲真。
-e FILE ] 如果 FILE 存在則爲真。
-f FILE ] 如果 FILE 存在且是一個普通文件則爲真。
-g FILE ] 如果 FILE 存在且已經設置了SGID則爲真。
-h FILE ] 如果 FILE 存在且是一個符號連接則爲真。
-k FILE ] 如果 FILE 存在且已經設置了粘制位則爲真。
-p FILE ] 如果 FILE 存在且是一個名字管道(F如果O)則爲真。
-r FILE ] 如果 FILE 存在且是可讀的則爲真。
-s FILE ] 如果 FILE 存在且大小不爲0則爲真。
-t FD   ] 如果文件描述符 FD 打開且指向一個終端則爲真。
-u FILE ] 如果 FILE 存在且設置了SUID (set user ID)則爲真。
-w FILE ] 如果 FILE 如果 FILE 存在且是可寫的則爲真。
-x FILE ] 如果 FILE 存在且是可執行的則爲真。
-O FILE ] 如果 FILE 存在且屬有效用戶ID則爲真。
-G FILE ] 如果 FILE 存在且屬有效用戶組則爲真。
-L FILE ] 如果 FILE 存在且是一個符號連接則爲真。
-N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則爲真。
-S FILE ] 如果 FILE 存在且是一個套接字則爲真。
FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists andFILE2 does not則爲真。
FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在則爲真。
FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的設備和節點號則爲真。
o OPTIONNAME] 如果 shell選項 “OPTIONNAME” 開啓則爲真。
[ -z STRING ] STRING” 的長度爲零則爲真。
[ -n STRING ] or [ STRING ] STRING” 的長度爲非零 non-zero則爲真。
[ STRING1 == STRING2 ] 如果2個字符串相同。 “=” may be used instead of “==” for strict POSIX compliance則爲真。
[ STRING1 != STRING2 ] 如果字符串不相等則爲真。
[ STRING1 < STRING2 ] 如果 “STRING1” sorts before “STRING2” lexicographically in the current locale則爲真。
[ STRING1 > STRING2 ] 如果 “STRING1” sorts after “STRING2” lexicographically in the current locale則爲真。
[ ARG1 OP ARG2 ] OP” is one of -eq-ne-lt-le-gt or -ge. These arithmetic binary operators return true if “ARG1” is equal to, not equal to, less than, less than or equal to, greater than, or greater than or equal to “ARG2”, respectively. “ARG1” and “ARG2” are integers.

在if中:
exit 1  #退出當前腳本,後續的腳本將不再執行 

# expr [string] 獲取字符串的長度

索引
# expr index "$string" c 獲取c在字符串第一次出現的位置
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章