linux shell腳本之-變數極速入門與進階(1)

来源:https://www.cnblogs.com/ghostwu/archive/2018/05/29/9101569.html
-Advertisement-
Play Games

1,如果創建shell腳本? 使用任意文本編輯軟體,一般為vim,創建.sh結尾的文件,在文件的最開頭用 #!/bin/bash 註明shell的類型 如: 2,如何執行shell? >把shell文件當做bash的命令行參數 >給shell文件添加可執行許可權,我這裡已經添加過了,使用命令( chm ...


1,如果創建shell腳本?

使用任意文本編輯軟體,一般為vim,創建.sh結尾的文件,在文件的最開頭用 #!/bin/bash 註明shell的類型

如:

ghostwu@dev:~/linux/shell$ cat how_to_use_shell.sh 
#!/bin/bash
ls /

2,如何執行shell?

>把shell文件當做bash的命令行參數

ghostwu@dev:~/linux/shell$ ls -l
total 4
-rwxrwxr-x 1 ghostwu ghostwu 17 5月  28 18:14 how_to_use_shell.sh
ghostwu@dev:~/linux/shell$ bash how_to_use_shell.sh 
backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
boot    etc    lib       media       patch  run   srv   usr  www
ghostwu@dev:~/linux/shell$ /bin/bash how_to_use_shell.sh 
backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
boot    etc    lib       media       patch  run   srv   usr  www
ghostwu@dev:~/linux/shell$ bash ~/linux/shell/how_to_use_shell.sh 
backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
boot    etc    lib       media       patch  run   srv   usr  www
ghostwu@dev:~/linux/shell$ sh how_to_use_shell.sh 
backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
boot    etc    lib       media       patch  run   srv   usr  www

 

>給shell文件添加可執行許可權,我這裡已經添加過了,使用命令( chmod a+x 腳本文件路徑 )

ghostwu@dev:~/linux/shell$ ./how_to_use_shell.sh 
backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
boot    etc    lib       media       patch  run   srv   usr  www
ghostwu@dev:~/linux/shell$ ~/linux/shell/how_to_use_shell.sh 
backup    cdrom  home       lib64       mnt    proc  sbin  sys  var
bin    dev    initrd.img  lost+found  opt    root  snap  tmp  vmlinuz
boot    etc    lib       media       patch  run   srv   usr  www
ghostwu@dev:~/linux/shell$ 

3,單雙引號跟php是一樣的,單引號不解釋變數,雙引號會解釋變數

ghostwu@dev:~/linux/shell$ echo "learning shell program with ghostwu"
learning shell program with ghostwu
ghostwu@dev:~/linux/shell$ echo 'learning shell program with ghostwu'
learning shell program with ghostwu
ghostwu@dev:~/linux/shell$ echo learning shell program with ghostwu
learning shell program with ghostwu
ghostwu@dev:~/linux/shell$ name=ghostwu
ghostwu@dev:~/linux/shell$ echo $name
ghostwu
ghostwu@dev:~/linux/shell$ echo "$name"
ghostwu
ghostwu@dev:~/linux/shell$ echo '$name'
$name
ghostwu@dev:~/linux/shell$ echo $name
ghostwu

4,-n,不會轉義換行符。-e,會轉義字元

ghostwu@dev:~/linux/shell$ echo -n "ghostwu"
ghostwughostwu@dev:~/linux/shell$ man echo
ghostwu@dev:~/linux/shell$ echo "1\t2\t3"
1\t2\t3
ghostwu@dev:~/linux/shell$ echo -e "1\t2\t3"
1    2    3

5,列印彩色輸出

在終端中生成彩色輸出相當好玩,我們可以使用轉義序列來實現。
每種顏色都有對應的顏色碼。比如:重置=0,黑色=30,紅色=31,綠色=32,黃色=33,藍
色=34,洋紅=35,青色=36,白色=37。
要列印彩色文本,可輸入如下命令:
echo -e "\e[1;31m This is red text \e[0m"
\e[1;31 將顏色設為紅色, \e[0m 將顏色重新置回。只需要將 31 替換成想要的顏色碼就可以了。
要設置彩色背景,經常使用的顏色碼是:重置=0,黑色=40,紅色=41,綠色=42,黃色=43,
藍色=44,洋紅=45,青色=46,白色=47。
要列印彩色文本,可輸入如下命令:
echo -e "\e[1;42m Green Background \e[0m"

ghostwu@dev:~/linux/shell$ echo "\e[1;31m Hello Ghostwu \e[0m"
\e[1;31m Hello Ghostwu \e[0m
ghostwu@dev:~/linux/shell$ echo -e "\e[1;31m Hello Ghostwu \e[0m"
 Hello Ghostwu 
ghostwu@dev:~/linux/shell$ echo -e "\e[1;31mHello Ghostwu \e[0m"
Hello Ghostwu 
ghostwu@dev:~/linux/shell$ echo -e "\e[1;31mHello Ghostwu \e[0m!"
Hello Ghostwu !

這個要截圖,才能看出效果

變數:

在Bash中,每一個變數的值都是字元串。
無論你給變數賦值時有沒有使用引號,值都會以字元串的形式存儲

5,反引號(數字1左邊的那個鍵),表示引用命令的執行結果

ghostwu@dev:~/linux/shell$ ls
how_to_use_shell.sh
ghostwu@dev:~/linux/shell$ str=`ls`
ghostwu@dev:~/linux/shell$ echo $str
how_to_use_shell.sh
ghostwu@dev:~/linux/shell$ echo str
str

註意:echo $str 與 echo str。前面表示str變數,後面表示字元串str

反引號的另一種等價寫法,用小括弧括起來: $()

ghostwu@dev:~/linux/shell$ echo str2
str2
ghostwu@dev:~/linux/shell$ str2=$(ls)
ghostwu@dev:~/linux/shell$ echo $str2
how_to_use_shell.sh

str2=$(ls):取得ls命令執行後的結果賦值給str2這個變數【註意:變數=值, 表示變數賦值,或者改寫變數的值,要使用變數的值(訪問變數的值)在變數前面用$】

ghostwu@dev:~/linux/shell$ str=`date "+%F"`
ghostwu@dev:~/linux/shell$ echo $str
2018-05-28
ghostwu@dev:~/linux/shell$ str2=$(date "+%F")
ghostwu@dev:~/linux/shell$ echo $str2
2018-05-28

變數引用的應用:可以把變數返回的值,拿來作為其他的應用,如時間的返回值,常用來備份文件

ghostwu@dev:~/linux/shell$ tar czvf `date "+%F"`_shell.tar.gz how_to_use_shell.sh 
how_to_use_shell.sh
ghostwu@dev:~/linux/shell$ ls
2018-05-28_shell.tar.gz  how_to_use_shell.sh

6,引用命令行的參數,用$1..$9,大於10用大括弧括起來,如:${10} 

ghostwu@dev:~/linux/shell/how_to_use_var$ cat var.sh 
#!/bin/bash
echo $1 $2 $3 ${10}
ghostwu@dev:~/linux/shell/how_to_use_var$ bash var.sh {a..z}
a b c j

給var.sh傳入26個字母作為參數, a--->$1,b--->$2, c----->$3, j---->$10

7,$0表示腳本本身

>如果用bash單純執行腳本,$0就是腳本的名稱

>如果用全路徑執行腳本,那麼$0就是腳本的名稱+路徑

ghostwu@dev:~/linux/shell/how_to_use_var$ bash var.sh 
var.sh
ghostwu@dev:~/linux/shell/how_to_use_var$ bash ~/linux/shell/how_to_use_var/var.sh 
/home/ghostwu/linux/shell/how_to_use_var/var.sh

8,dirname獲取腳本的路徑,basename獲取腳本名稱

ghostwu@dev:~/linux/shell/how_to_use_var$ dirname ~/linux/shell/how_to_use_var/var.sh 
/home/ghostwu/linux/shell/how_to_use_var
ghostwu@dev:~/linux/shell/how_to_use_var$ basename ~/linux/shell/how_to_use_var/var.sh 
var.sh

9,$# 獲取參數的個數

ghostwu@dev:~/linux/shell/how_to_use_var$ cat var.sh 
#!/bin/bash
echo $#
ghostwu@dev:~/linux/shell/how_to_use_var$ bash var.sh {a..j}
10

10,判斷參數的個數,給出一些提示信息 

ghostwu@dev:~/linux/shell/how_to_use_var$ bash var2.sh a
usage:/bin/bash var2.sh arg1 arg2
ghostwu@dev:~/linux/shell/how_to_use_var$ bash var2.sh a b
a b
ghostwu@dev:~/linux/shell/how_to_use_var$ cat var2.sh 
#!/bin/bash
if [ $# -ne 2 ]
    then
        echo "usage:/bin/bash $0 arg1 arg2"
        exit 1
fi
echo $1 $2

11,set -- 設置位置參數,跟命令行傳參差不多

ghostwu@dev:~$ set -- hello ghost wu
ghostwu@dev:~$ echo $#
3
ghostwu@dev:~$ echo $1
hello
ghostwu@dev:~$ echo $2
ghost
ghostwu@dev:~$ echo $3
wu

12,$@, $*,不加引號時,輸出所有參數

ghostwu@dev:~$ set -- hello ghost wu
ghostwu@dev:~$ echo $#
3
ghostwu@dev:~$ echo $1
hello
ghostwu@dev:~$ echo $2
ghost
ghostwu@dev:~$ echo $3
wu
ghostwu@dev:~$ echo $*
hello ghost wu
ghostwu@dev:~$ echo $@
hello ghost wu
ghostwu@dev:~$ for i in $*; do echo $i; done
hello
ghost
wu
ghostwu@dev:~$ for i in $@; do echo $i; done
hello
ghost
wu

加雙引號時,在迴圈遍歷的情況下:"$*" 所有參數當做一個參數。 "$@"輸出所有參數

ghostwu@dev:~$ echo "$*"
hello ghost wu
ghostwu@dev:~$ echo "$@"
hello ghost wu
ghostwu@dev:~$ for i in "$*"; do echo $i; done
hello ghost wu
ghostwu@dev:~$ for i in "$@"; do echo $i; done
hello
ghost
wu

下麵的例子,相當於加引號的 "$@" 

ghostwu@dev:~$ for i;do echo $i; done
hello
ghost
wu

shift:將位置參數左移

ghostwu@dev:~$ echo $# $1 $2 $3
3 hello ghost wu
ghostwu@dev:~$ shift
ghostwu@dev:~$ echo $# $1 $2 $3
2 ghost wu

13,$? 獲取上一條命令的執行狀態返回值( 0 為成功,非0為失敗 )

ghostwu@dev:~$ pwd
/home/ghostwu
ghostwu@dev:~$ echo $?
0
ghostwu@dev:~$ cd /root
bash: cd: /root: Permission denied
ghostwu@dev:~$ echo $?
1

 


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

-Advertisement-
Play Games
更多相關文章
  • 登錄百度 先清理瀏覽器緩存,打開Charles,登錄一次百度主頁,抓取到登錄過程。 參數分析 確定了需要分析的參數,從哪個開始分析呢?隨意吧 一般有些參數之間是有關係的,比如token的請求參數里需要gid參數 這裡我就不一一去分析參數間的關係了,直接來了啊 參數 gid 一方面其他參數需要它,另外 ...
  • 資料庫就是存儲數據的倉庫,其本質是一個文件系統,數據按照特定的格式將數據存儲起來,用戶可以對資料庫中的數據進行增加,修改,刪除及查詢操作。 mysql的dos視窗啟動關閉命令:net start mysql和net stop mysql 登錄命令:(1)mysql -u用戶名 -p密碼 (2)mys ...
  • 我根據自己的理解,對原文的精華部分進行了提煉,併在一些難以理解的地方加上了自己的“可能比較準確”的「翻譯」。 Chapter4 設計與聲明 Designs and Declarations 條款18: 讓介面容易被正確使用,不易被誤用 欲開發一個“容易被使用,不容易被誤用”的介面,首先必須考慮客戶可 ...
  • 環境配置:windows ,VS,SQLite(點擊下載),System.Data.SQLite.DLL(點擊下載)。 目錄: 一、新建項目,添加引用 二、創建資料庫 三、創建表 四、插入數據 五、查詢數據 一、新建項目,添加引用 1.在VS中新建一個控制台應用程式,如下圖 2.添加引用 將下載的S ...
  • 關聯刪除通常是一個資料庫術語,用於描述在刪除行時允許自動觸發刪除關聯行的特征;即當主表的數據行被刪除時,自動將關聯表中依賴的數據行進行刪除,或者將外鍵更新為 或預設值。 資料庫關聯刪除行為 我們先來看一看SQL Server中支持的行為。在創建外鍵約束時,可以指定關聯表在主表刪除行時,對依賴的數據如 ...
  • 上一回實現了一個寬度不均勻的Panel,這次我們編寫一個簡單的BigbangView主體。 首先創建一個模板化控制項,刪掉Themes/Generic.xaml中的<Style TargetType="BigbangView">...</Style>段。 然後打開C:\Program Files (x ...
  • 前言 小李:“胖子,上頭叫你對接我的數據好了沒有?” 胖子:“那是你的事,你都不提供數據源,我咋接?” 小李:“你想要什麼樣的數據源?” 胖子:“我想要一個調用簡單點的!” 小李:“我這個數據源是在linux平臺使用docker封裝發佈的,webapi的怎麼樣?” 胖子:“也行,這項目工期快用完了, ...
  • linux簡介 Linux內核最初只是由芬蘭人李納斯·托瓦茲(Linus Torvalds)在赫爾辛基大學上學時出於個人愛好而編寫的。 Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。 Linux能運行主要的UN ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...