shell編程基礎一

變量 算術|字符|條件測試

1、shell編程:過程式、解釋執行 
2、shell腳本基礎 
  2.1shell腳本: 包含一些命令或聲明,并符合一定格式的文本文件 
  2.2格式要求:首行shebang機制 
     #!/bin/bash 
     #!/usr/bin/python 
     #!/usr/bin/perl 
  2.3shell腳本的用途有: 
     自動化常用命令 
     執行系統管理和故障排除 
     創建簡單的應用程序 
     處理文本或文件  ?
3、創建shell腳本 
  3.1第一步:使用文本編輯器來創建文本文件 
     第一行必須包括shell聲明序列:#! 
     #!/bin/bash 
     添加注釋,注釋以#開頭 
  3.2第二步:運行腳本 
     給予執行權限,在命令行上指定腳本的絕對或相對路徑 
     直接運行解釋器,將腳本作為解釋器程序的參數運行 
4、腳本代碼開頭約定 
  4.1第一行一般為調用使用的語言 
  4.2程序名,避免更改文件名為無法找到正確的文件 
  4.3版本號 
  4.4更改后的時間 
  4.5作者相關信息 
  4.6該程序的作用,及注意事項 
  4.7最后是各版本的更新簡要說明
5、腳本測試
  5.1檢測腳本中的語法錯誤 
     bash -n /path/to/some_script
  5.2調試執行
     bash -x /path/to/some_script 
3A3_)7H{]W(MOWJAUXY1(VV
6、變量 
  6.1強類型:變量不經過強制轉換,它永遠是這個數據類型,不允許隱式的類型轉換。一般定義變量時必
  須指定類型、參與運算必須符合類型要求;調用未聲明變量會產生錯誤 
  如 java,c# 
  6.2弱類型:語言的運行時會隱式做數據類型轉換。無須指定類型,默認均為字符型;參與運算會自動進
  行隱式類型轉換;變量無須事先定義可直接調用 
   如:bash不支持浮點數,php 
  6.3變量命名法則: 
    6.3.1不能使程序中的保留字:例如if, for 
    6.3.2只能使用數字、字母及下劃線,且不能以數字開頭 
    6.3.3見名知義 
  6.4統一命名規則:駝峰命名法 
7、bash中變量的種類 
  根據變量的生效范圍等標準劃分下面變量類型: 
  7.1局部變量:生效范圍為當前shell進程;對當前shell之外的其它shell進程,包括當前shell的
  shell進程均無效 
`3W5F[74$TNZ20J2$)SUL%9
>>------------------------------------------------------------------------------------
  變量賦值:name=‘value’ 
  可以使用引用value: 
   (1) 可以是直接字串; name=“root" 
   (2) 變量引用:name="$USER" 
   (3) 命令引用:name=`COMMAND` name=$(COMMAND) 
 變量引用:${name} $name 
    "":弱引用,其中的變量引用會被替換為變量值 
    '':強引用,其中的變量引用不會被替換為變量值,而保持原字符串 
AQGYGTD659])IA1B~O$3C`9
 顯示已定義的所有變量:set 
(`J%`C@GXN3G{XAAG0M%IHA
 刪除變量:unset name 
注:name=$name和name="$name"有區別,如果name值為多行字符,后者可保持原字符格式,不自動合并
@5N{%0[31YOCT%3@$5FDQ)F
<<------------------------------------------------------------------------------------
  7.2環境(全局)變量:生效范圍為當前shell進程及其子進程 
>>------------------------------------------------------------------------------------
 變量聲明、賦值: 
   export name=VALUE 
   declare -x name=VALUE 
Y)I693QX%ZF9Y898FS$K~M0
---->pstree命令可查看當前進程位置
2}7R~@L}5[]R0VI7SHZ0~6A
6D9B@}E{OVURF3{Y[K0F~S9
 變量引用:$name, ${name} 
 顯示所有環境變量: 
  env 
  printenv 
  export 
  declare -x 
MAK4~6`5}S6YK$T{`YFA
 刪除變量: 
  unset name
<<----------------------------------------------------------------------------------- 
  7.3本地變量:生效范圍為當前shell進程中某代碼片斷,通常指函數 
  7.4位置變量:$1, $2, ...來表示,用于讓腳本在腳本代碼中調用通過命令行傳遞給它的參數 
>>------------------------------------------------------------------------------------
 只讀變量:只能聲明,但不能修改和刪除 
 聲明只讀變量: 
   readonly name 
   declare -r name 
U8@Y_~[9F)4%K~5AUJN0T]X
 查看只讀變量: 
   readonly –p 
1Z2NRHAL0I1E_A7}(KK$X%N
位置變量:在腳本代碼中調用通過命令行傳遞給腳本的參數 
   $1, $2, ...:對應第1、第2等參數,shift [n]換位置 
   $0: 命令本身 
   $*: 傳遞給腳本的所有參數,全部參數合為一個字符串 
   $@: 傳遞給腳本的所有參數,每個參數為獨立字符串 
   $#: 傳遞給腳本的參數的個數 
   $@ $* 只在被雙引號包起來的時候才會有差異 
 set -- 清空所有位置變量 
<<------------------------------------------------------------------------------------
  7.5特殊變量:$?, $0, $*, $@, $#,$$ $_
    $$:當前進程PID
    $_:上一條命令最有一個參數
注:(list)表示在小括號里創建當前進程子進程,運行結束退出,無顯示信息
    { list; }只影響當前進程
L@K21$}SE(IJG~P73UW@M3D
---->x=1;echo $$;(echo $$;echo "subx=$x";x=2;echo "subx2=$x");echo "x=$x"
(}PWWE%(Z7%[TAYCH0~FV29
注:subshell中的$$取到的仍然是父進程bash的pid,如果想要取到subshell的pid,可以使用BASHPID變

8、退出狀態 
 進程使用退出狀態來報告成功或失敗 
   0 代表成功,1-255代表失敗 
   $? 變量保存最近的命令退出狀態 
 例如: 
   ping -c1 -W1 hostdown &> /dev/null 
   echo $??
---->ping命令,通過icmp包協議探測對方主機是否在線,一般局域網使用
   -c :表示ping次數,也就是icmp包個數
   -W:timeout,
9、退出狀態碼 
  bash自定義退出狀態碼 
    exit [n]:自定義退出狀態碼 
  注意:腳本中一旦遇到exit命令,腳本會立即終止;終止退出狀態取決于exit命令后面的數字 
  注意:如果未給腳本指定退出狀態碼,整個腳本的退出狀態碼取決于腳本中執行最后一條命令的狀態碼 
10、算術運算 
  bash中的算術運算:help let 
    +, -, *, /, %取模(取余), **(乘方) 
  實現算術運算: 
   (1) let var=算術表達式 
   (2) var=$[算術表達式] 
   (3) var=$((算術表達式)) 
   (4) var=$(expr arg1 arg2 arg3 ...) 
   (5) declare –i var = 數值 
   (6) echo ‘算術表達式’ | bc 
  乘法符號有些場景中需要轉義,如* 
  bash有內建的隨機數生成器:$RANDOM(0-32767) 
    echo $[$RANDOM%50] :0-49之間隨機數?
賦值 
  增強型賦值: 
    +=, -=, *=, /=, %= 
  let varOPERvalue 
    例如:let count+=3 
    自加3后自賦值 
  自增,自減: 
    let var+=1 
    let var++ 
    let var-=1 
    let var-- 
11、bash的數值測試 
     -v VAR :變量VAR是否設置 
   數值測試: 
    -gt 是否大于 
    -ge 是否大于等于 
    -eq 是否等于 
    -ne 是否不等于 
    -lt 是否小于 
    -le 是否小于等于?
12、字符串測試: 
     == 是否等于 
     > ascii碼是否大于ascii碼 
     < 是否小于 
     != 是否不等于 
     =~ 左側字符串是否能夠被右側的PATTERN所匹配 
 注意: 此表達式一般用于[[ ]]中;擴展的正則表達式 
     -z "STRING“ 字符串是否為空,空為真,不空為假 
     -n "STRING“ 字符串是否不空,不空為真,空為假 
注意:用于字符串比較時的用到的操作數都應該使用引號?
13、Bash的文件測試 
  存在性測試 
   -a FILE:同-e 
   -e FILE: 文件存在性測試,存在為真,否則為假 
  存在性及類別測試 
   -b FILE:是否存在且為塊設備文件 
   -c FILE:是否存在且為字符設備文件 
   -d FILE:是否存在且為目錄文件 
   -f FILE:是否存在且為普通文件 
   -h FILE 或 -L FILE:存在且為符號鏈接文件 
   -p FILE:是否存在且為命名管道文件 
   -S FILE:是否存在且為套接字文件
   -s FILE:是否存在且不是空文件
14、文件權限測試: 
     -r FILE:是否存在且可讀 
     -w FILE: 是否存在且可寫 
     -x FILE: 是否存在且可執行 
   文件特殊權限測試: 
     -u FILE:是否存在且擁有suid權限 
     -g FILE:是否存在且擁有sgid權限 
     -k FILE:是否存在且擁有sticky權限 ?
?15、文件大小測試: 
    -s FILE: 是否存在且非空 
  文件是否打開: 
   -t fd: fd 文件描述符是否在某終端已經打開 
   -N FILE:文件自從上一次被讀取之后是否被修改過 
   -O FILE:當前有效用戶是否為文件屬主 
   -G FILE:當前有效用戶是否為文件屬組?
16、雙目測試: 
   FILE1 -ef FILE2: FILE1是否是FILE2的硬鏈接 
   FILE1 -nt FILE2: FILE1是否新于FILE2(mtime) 
   FILE1 -ot FILE2: FILE1是否舊于FILE2
17、bash的組合測試條件 
  第一種方式: 
   COMMAND1 && COMMAND2 并且 
   COMMAND1 || COMMAND2 或者 
   ! COMMAND 非 
     如:[[ -r FILE ]] && [[ -w FILE ]] 
  第二種方式: 
   EXPRESSION1 -a EXPRESSION2 并且 
   EXPRESSION1 -o EXPRESSION2 或者 
   ! EXPRESSION 
注:必須使用測試命令進行 ?
18、使用read命令來接受輸入 
  使用read來把輸入值分配給一個或多個shell變量 
   -p 指定要顯示的提示 
   -s 靜默輸入,一般用于密碼 
   -n N 指定輸入的字符長度N 
   -d ‘字符’ 輸入結束符 
   -t N TIMEOUT為N秒 
read 從標準輸入中讀取值,給每個單詞分配一個變量 所有剩余單詞都被分配給最后一個變量 
  read -p “Enter a filename: “ FILE?






 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/95621

(0)
parrotparrot
上一篇 2018-04-10 10:49
下一篇 2018-04-10 15:27

相關推薦

  • .

    .

    Linux筆記 2018-05-17
  • 基礎命令

    ]# date -s “2018-3-28”

    2018-03-29
  • CentOS10.5安裝過程詳解

    回顧下CentOS10.5版本的安裝,鞏固學習內容。

    2018-07-22
  • Linux系統網絡管理

    本機索引: 一、基本網絡配置 二、主機、網卡名稱管理 三、網卡別名 四、Bonding技術 五、實現網絡組 六、Linux網絡管理常用命令   一、基本網絡配置: 將Linux主機接入網絡,需要配置網絡相關設置 一般包括以下內容: 主機名 IP/netmask 路由:默認網關 DNS服務器: 主DNS服務器 次DNS服務器   網絡配置文…

    2018-05-03
  • yum

    yum(全稱為 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及SUSE中的Shell前端軟件包管理器。基於RPM包管理,能夠從指定的服務器自動下載RPM包并且安裝,可以自動處理依賴性關系,并且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。yum提供了查找、安裝、刪除某一個、一組甚至全部軟件包的命令,而…

    2018-04-20
  • Linux文件管理類命令

    一,linux 文件管理類命令 ls 命令:list directory contents;列出指定目錄下的內容 SYNOPSIS: ls [OPTION]… [FILE]… OPTION: -a :–al顯示所有文件,包括隱藏文件 -A :–almost-all:顯示除 . 和 ..外的所有文件 -l :–long 長格式顯示列表,即文件的詳細屬性信息 -…

    2018-05-15
欧美性久久久久