天天看點

Shell 的簡單常用文法Shell 中的 $0, $#, $*, $@, $?, $$和指令行參數

邏輯比較符号

-eq           //等于

-ne           //不等于

-gt            //大于 (greater )

-lt            //小于  (less)

-ge            //大于等于

-le            //小于等于
           

指令的邏輯關系:

- 在linux 中 指令執行狀态:0 為真,其他為假
           

邏輯與: &&

- 第一個條件為假時,第二條件不用再判斷,最終結果已經有;第一個條件為真時,第二條件必須得判斷;
           
  • 邏輯或: ||
  • 邏輯非: !

shell 中 while 的使用

  • 利用while循環計算1到100的和:
#!/bin/bash
i=1
sum=0
while [ $i -le 100 ]
do
 let sum=sum+$i
 let i++
done
echo $sum
           
  • 利用while循環列印一個5x5的 *
#!/bin/bash
i=1
j=1
while [ $i -le 5 ]
do
 while [ $j -le 5 ]
 do
   echo -n "* "
   let j++
 done
 echo
 let i++
 let j=1
done
           
  • 使用read結合while循環讀取文本檔案:
#!/bin/bash
file=$1         #将位置參數1的檔案名複制給file
if [ $# -lt 1 ];then   #判斷使用者是否輸入了位置參數
 echo "Usage:$0 filepath"
 exit
fi
while read -r line  #從file檔案中讀取檔案内容指派給line(使用參數r會屏蔽文本中的特殊符号,隻做輸出不做轉譯)
do
 echo $line    #輸出檔案内容
done  < $file

           
  • 按列讀取檔案内容
#!/bin/bash
file=$1
if [[ $# -lt 1 ]]
then
 echo "Usage: $0 please enter you filepath"
 exit
fi
while read -r f1 f2 f3  #将檔案内容分為三列
do
 echo "file 1:$f1 ===> file 2:$f2 ===> file 3:$f3"  #按列輸出檔案内容
done < "$file"
           
  • while循環中的死循環:
    • 示例:利用死循環,讓使用者做選擇,根據客戶的選擇列印相應結果
#!/bin/bash
#列印菜單
while :
do
 echo "********************"
 echo "    menu    "
 echo "1.tima and date"
 echo "2.system info"
 echo "3.uesrs are doing"
 echo "4.exit"
 echo "********************"
 read -p "enter you choice [1-4]:" choice
#根據客戶的選擇做相應的操作
 case $choice in
  1)
  echo "today is `date +%Y-%m-%d`"
  echo "time is `date +%H:%M:%S`"
  read -p "press [enter] key to continue..." Key  #暫停循環,提示客戶按enter鍵繼續
  ;;
  2)
  uname -r
  read -p "press [enter] key to continue..." Key
  ;;
  3)
  w
  read -p "press [enter] key to continue..." Key
  ;;
  4)
  echo "Bye!"
  exit 0
  ;;
  *)
  echo "error"
  read -p "press [enter] key to continue..." Key
  ;;
 esac
done
           

linux 下 EOF 的寫法

  • EOF是 END Of File 的縮寫,表示自定義終止符.既然自定義,那麼EOF就不是固定的,可以随意設定别名,在linux按ctrl-d就代表EOF.
  • EOF一般會配合cat能夠多行文本輸出.

其用法如下:

<<EOF //開始

EOF //結束

  • 還可以自定義,比如自定義:

<<BBB //開始

BBB //結束

  • 通過cat配合重定向能夠生成檔案并追加操作,在它之前先熟悉幾個特殊符号:
< :輸入重定向
> :輸出重定向
>> :輸出重定向,進行追加,不會覆寫之前内容
<< :标準輸入來自指令行的一對分隔号的中間内容.
           

Shell 中的 $0, $#, $*, $@, $?, $$和指令行參數

  • 位置參數
$0	目前腳本的檔案名
$n	傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$#	傳遞給腳本或函數的參數個數。
$*	傳遞給腳本或函數的所有參數。
$@	傳遞給腳本或函數的所有參數。被雙引号(" ")包含時,與 $* 稍有不同,下面将會講到。
$?	上個指令的退出狀态,或函數的傳回值。
$$	目前Shell程序ID。對于 Shell 腳本,就是這些腳本所在的程序ID。
           
  • $* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引号(" “)包含時,都以”$1" “ 2 " … " 2" … " 2"…"n” 的形式輸出所有參數。
  • 但是當它們被雙引号(" “)包含時,”$*" 會将所有的參數作為一個整體,以"$1 $2 … n " 的 形 式 輸 出 所 有 參 數 ; " n"的形式輸出所有參數;" n"的形式輸出所有參數;"@" 會将各個參數分開,以"$1" “ 2 " … " 2" … " 2"…"n” 的形式輸出所有參數。
  • 退出狀态
    • $? 可以擷取上一個指令的退出狀态。所謂退出狀态,就是上一個指令執行後的傳回結果。退出狀态是一個數字,一般情況下,大部分指令執行成功會傳回 0,失敗傳回 1。