1.shell學習之常用語句

来源:https://www.cnblogs.com/lifexy/archive/2018/12/22/10159634.html
-Advertisement-
Play Games

本章學習內容: 1.常見符號 2.命令分隔符-分號";" 3.雙分號 ";;" 4. '單引號和"雙引號 5.`反引號和$() 6.${}和$ 7.冒號: 8.()小括弧 9.(())雙括弧 10.{}大括弧 11.[]和[[]]之間的條件測試區別 12.~波浪號 13.延時 14.變數賦值的註意 ...


本章學習內容:

  • 1.常見符號
  • 2.命令分隔符-分號";"
  • 3.雙分號 ";;"
  • 4. '單引號和"雙引號
  • 5.`反引號和$()
  • 6.${}和$
  • 7.冒號:
  • 8.()小括弧
  • 9.(())雙括弧
  • 10.{}大括弧
  • 11.[]和[[]]之間的條件測試區別
  • 12.~波浪號
  • 13.延時
  • 14.變數賦值的註意

 

1.常見符號

  • $0   當前腳本的文件名
  • $n        傳遞給腳本的參數n,比如$1表示第一個參數
  • $#        傳遞給腳本或函數的參數個數。
  • $*,$@  傳遞給腳本或函數的所有參數
  • $?        上個命令的退出狀態,或函數的返回值。
  • $$         當前Shell腳本所在的進程ID

示例:

#!/bin/bash

for var in $*
do
   echo "$var"           #for迴圈列印所有參數
done

 

2.命令分隔符分號";"

  • 作用:可以在同一行上寫兩個或兩個以上的命令

示例:

if [ "$filename" == "$1" ]; then     #執行兩條命令
echo "File $filename exists.";fi

 

3.雙分號;;

  • 作用:用在case語句,類似於C裡面的case,用來承擔break作用

shell的case語法如下所示:

case "變數" in
  "變數1")
      ...
  ;;          #這裡的雙分號類似於break
"變數2") ... ;;
*) #匹配剩下的變數n ... ;;
esac #case結束語句

示例:

#!/bin/base

variable=xyz

case "$variable" in
abc) echo "\$variable = abc" ;;
xyz) echo "\$variable = xyz" ;; 
esac

列印:

 

 

4. '單引號和"雙引號

  • 單引號:  將會阻止所有特殊字元的解釋,被單引號括住的內容都是普通字元串
  • 雙引號: 引號包圍起來的字元串,部分特殊字元將起到它們的作用

示例:

#!/bin/bash

a="this is a"
b="this is b"

echo '${a}'
echo "${b}"

列印:

${a}
this is b

 

5.`反引號和$()

  • 都是用來實現命令替換的,可以通過這個將命令的輸出賦值到一個變數中去

示例:

echo $(date "+ %Y/%m/%d %H:%M:%S")     #運行date命令
echo `date "+ %Y/%m/%d %H:%M:%S"`      #運行date命令
c=$(echo hello)                        #列印: c=hello

 

6.${}和$

  • 都是變數替換,不過${}的好處在於,可以精確變數名稱(也可以實現字元串替換等,下章來學習)

比如:

A=123

echo $AB      #錯誤,將列印空的一行,因為運行時預設會去找變數值AB的解釋
echo ${A}B    #正常列印:123B

 

7.冒號:
空命令,一個什麼都不幹的命令,該命令的返回值為0(true).
示例如下:

:
echo $?    # 列印上個命令的返回值,為0

 

由於冒號的返回值為0,所以可以通過>將一個文件清空,但是不會修改該文件許可權

示例如下:

: > data.xxx         #如果該文件不存在,則會創建, 與cat /dev/null >data.xxx的作用相同

 

8.()小括弧

8.1當用作命令組時
()會啟動一個子shell順序運行,需要註意的是, 由於()里的變數位於子shell中,並不是當前shell中,所以退出()後,變數還是不會變的
示例:

a=1
(a=2; echo "a = $a")    #列印a=2
echo "a = $a"           #列印a=1,說明變數a並沒有改變

 

8.2當用作初始化數組時
示例-遍曆數組: 

arr=(1 2 3)             #等價於array[0]=1 array[1]=2 array[2]=3

for(( i=0;i<${#arr[@]};i++)) 
do
echo ${arr[i]};
done;

 

8.3當用作命令替換時
示例:

echo $(date "+ %Y/%m/%d %H:%M:%S")    #運行date命令

 

9.(())雙括弧

9.1用於for迴圈時
示例:

for(( i=0;i<5;i++));do
echo $i;done


9.2轉換運算進位時,可以通過(())將任意數據轉為10進位
示例:

echo $((16#ff))    #列印255

 

9.3 用於整數判斷時
示例:

if (("$a" < "$b"))
if (("$a" <= "$b"))
if (("$a" > "$b"))
if (("$a" >= "$b"))

 

 

10.{}大括弧
10.1當用做代碼塊時
像一個匿名函數,但是{}里的變數對其它代碼來說是可見的, 並且不會開啟新的子shell
示例1:

a=1
{
   a=2
   echo "a = $a"   #列印a=2
} 
echo "a = $a"      #列印a=2,說明已被修改

示例2-寫入文件:

#!/bin/bash
{
echo 'hello'
echo 'this is test file'
echo 'end'
}  > ./test

效果:

 

10.2當用做遍歷時
示例:

echo {1..10}        #列印1 2 3 4 5 6 7 8 9 10
for var in {a..z}
do
echo $var           #列印a~z字母
done

 

10.3也可以用作字元變數截取替換時
未完待續,在下一章將學習.

 

11.[ ]和[[]]之間的條件測試區別
11.1 [ ]的參數有以下幾種

  • -z: 判斷字元串長度為0則為真
  • -n: 判斷字元串長度非0則為真
  • -o: 或
  • -a: 與
  • -x: 可執行
  • -r:  可讀
  • -w: 可寫

11.2當用作文件判斷時,有以下幾種參數:

  • -e filename  :如果 filename存在,則為真
  • -d filename  :如果 filename為目錄,則為真
  • -f filename   :如果 filename為常規文件,則為真
  • -L filename  : 如果 filename為符號鏈接,則為真
  • -r filename   :如果 filename可讀,則為真
  • -w filename  :如果 filename可寫,則為真
  • -x filename  :如果 filename可執行,則為真
  • -s filename  :如果文件長度不為0,則為真
  • -h filename  :如果文件是軟鏈接,則為真  
  • filename1 -nt filename2 :如果 filename1比 filename2新,則為真。
  • filename1 -ot filename2 :如果 filename1比 filename2舊,則為真。

示例-檢查當前目錄的test文件是否存在:

#!/bin/bash

testfile="${PWD}/test"

if [ -e "$testfile" ];then
      echo " $testfile is exist"
fi

 

11.3 在比較整數時,都使用-eq -ne –gt –ge –lt -le等
示例:

//-eq 判斷等於(equal)
if [ "$a" -eq "$b" ]

//-ne 判斷不等於(no equal)
if [ "$a" -ne "$b" ]

//-gt 大於(greater than)
if [ "$a" -gt "$b" ]

//-ge 大於等於
if [ "$a" -ge "$b" ]

//-lt 小於(less than)
if [ "$a" -lt "$b" ]

//-le 小於等於
if [ "$a" -le "$b" ]

 

11.4比較字元串時,只能使用!=和=,如果使用大於小於時,則需要加 \ 轉義
示例:

a="abcde"
b="abc"

if [ -n "$a" -o "$a" \> "$b" ] #判斷a非0,且a>b
then
echo "a > b"
fi

 

11.5而[[]]也能適用於整數和字元串,而且對於整數或者字元串而言,它們都可以支持&&、||、<和>、!=、==
示例:

a=11
b=11
c="abc"
e="abcd"

if [[ "$a" == "$b" && "$c" < "$e" ]]
then
echo "a = b,c < e"
fi

 

12.~波浪號

  • ~    為home目錄
  • ~+  為當前目錄,等價於$PWD

示例:

A=~
B=~+
echo $A            #列印home目錄
echo $B            #列印當前目錄

 

13.延時

  • 在shell中,延時使用sleep命令

示例:

sleep 1     #延時1秒
sleep 0.5   #延時0.5秒
sleep 1m    #睡眠1分
sleep 1h    #睡眠1小時

 

14.變數賦值時的註意

  • 如果變數里存在空白,則必須加上引用

示例:

a= 1 2 3     #將會出錯,正確的用法應該是a="1 2 3"

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • RabbitMQ配置環境花費了好多時間,特記錄此筆記,方便下次部署安裝。筆記中將常見的安裝錯誤問題、解決辦法與安裝過程一同展示。 ...
  • 第一次寫隨筆 應該寫的不是太好 請多多見諒 我這次是在網上發現了一個三級聯動 也是給新人一個福利 這個是你需要新建個 JavaScript 文件 並複製到你新建的文件裡面 1 var provinces = [ 2 { 3 "name": "北京市", 4 "city": [ 5 { 6 "name ...
  • 環境 本地 win7 伺服器:Virtual Box 上的Centos ssh工具: Xshell 文件傳輸: xftp 1.在本地創建asp.net core應用發佈 1.1 使用Vs2017 新建一個asp.netcore項目 步驟略(一路next),當然你也可以用命令行創建。 1.2 發佈項目 ...
  • 列印預覽XAML代碼: <controls:WindowEx x:Class="SunCreate.Vipf.Client.UI.MapPrintPreview" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xm ...
  • 之前有寫過c#區域網桌面共用軟體製作(https://www.cnblogs.com/liuxiaobo93/p/3675387.html),完成了一個簡易的點對點的桌面共用demo,使用的就是Tcp協議,當時由於接收端接收數據用了一個比較大的byte數組來一次性接收完整張圖片數據,所以有人提出了問... ...
  • DncZeus 前言 關於 DncZeus DncZeus = Dnc + Zeus "Dnc" .Net Core 的縮寫; "Zeus" 中文譯為 宙斯 ,是古希臘神話中的眾神之王,奧林匹斯十二主神之首,統治宇宙萬物的至高無上的主神(在古希臘神話中主神專指宙斯),人們常用“眾神和人類的父親”、“ ...
  • 本篇我將帶著大家一起來對Dapper進行下封裝並實現基本的增刪改查、分頁操作的同步非同步方法的實現(已實現MSSQL,MySql,PgSQL)。同時我們再實現一下倉儲層的代碼生成器,這樣的話,我們只需要結合業務來實現具體的業務部分的代碼就可以了,可以大大減少我們重覆而又繁瑣的增刪改查操作,多留點時間給 ...
  • Windows -- cmd命令: ipconfig 和 nbtstat ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...