1. 程式人生 > >shell指令碼的作用,shell指令碼變數的定義和三種賦值方式【shell指令碼的學習筆記一】

shell指令碼的作用,shell指令碼變數的定義和三種賦值方式【shell指令碼的學習筆記一】

轉載自:http://blog.csdn.net/u010317005/article/details/50890543

為什麼要用指令碼語言?

以Linux系統為例,linux系統裡面有很多個命令,指令碼可以是一個或者多個命令的集合,通過執行指令碼,達到既定的功能或者效果。

shell與批處理的比較:

Linux環境下有個指令碼語言叫做shell,一般的,shell指令碼檔案以.sh結尾,.sh並沒有什麼實際作用,只是用來標識這是一個shell指令碼語言。

windows環境有個指令碼語言叫批處理,以.bat結尾,windows環境下的.bat有其特定作用,因為.bat的標識可通過MIME協議呼叫指定的應用程式來解釋

介紹完背景,就直接開始shell指令碼的編寫之旅。

國際慣例:第一個程式必須是hello world!

  1. #!/bin/bash  
  2. echo "hello world!"  

#! 是一個特定的標記,用來告訴系統這個指令碼需要用什麼程式來執行

儲存為shell.sh,然後執行


此時發現許可權不夠,通過ls -ls指令檢視shell.sh的詳細資訊


發現沒有執行許可權,因此要修改shell.sh的許可權,可通過chmod指令修改,至少加入執行許可權


建議修改shell指令碼許可權的時候在shell指令碼前加./,即當前目錄下查詢,否則會在PATH下開始查詢,避免不必要的麻煩。

執行指令碼:

[[email protected] /]# ./shell.sh 
hello world!

系統給定的特殊變數:

變數名作用
$0當前指令碼的名字
$n傳遞給指令碼或者函式的引數,n表示第幾個引數
$#傳遞給指令碼或函式的引數個數
$*傳遞給指令碼或函式的所有引數
[email protected]傳遞給指令碼或者函式的所有引數
$$當前shell指令碼程序的PID
$?函式返回值,或者上個命令的退出狀態
$BASHBASH的二進位制檔案問的路徑
$BASH_ENVBASH的啟動檔案
$BASH_VERSINFO[n]BASH版本資訊,有六個元素
$BASH_VERSIONBASH版本號
$EDITOR指令碼所呼叫的預設編輯器
$EUID當前有效的使用者ID
$FUNCNAME當前函式名
$GROUPS當前使用者所屬組
$HOME當前使用者家目錄
$HOSTTYPE主機型別
$LINENO當前行號
$OSTYPE作業系統型別
$PATHPATH路徑
$PPID當前shell程序的父程序ID
$PWD當前工作目錄
$SECONDS當前指令碼執行秒數
$TMOUT不為0時,超過指定的秒將退出shell
$UID當前使用者ID

$* 和 [email protected] 的區別

$* 和 [email protected] 都表示傳遞給函式或指令碼的所有引數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有引數。
但是當它們被雙引號(" ")包含時,"$*" 會將所有的引數作為一個整體,以"$1 $2 … $n"的形式輸出所有引數;"[email protected]" 會將各個引數分開,以"$1" "$2" … "$n" 的形式輸出所有引數。

定義變數:

字串變數:string="value",string為變數名,value為字串

數字變數:num=5,其中num為變數名,5為其對應的值

注意:

1、定義變數時不加$,使用時要加$,用以區別字串,變數名用{}括來是個好習慣,shell會將花括號裡面的字元解釋為一個整體,後面將陣列的時候會體現。

2、不要在等號兩邊加上空格,否則將會報錯!

測試程式碼:

  1. #! /bin/bash
  2. string="I am shell"
  3. num=5  
  4. echo "a=${a},string=${string}"
執行結果:

[[email protected] /]# ./shell.sh 
a=,string=I am shell

變數定義時等號兩邊加空格測試:

[[email protected] /]# cat shell.sh 
#! /bin/bash

string = "I am shell"
num = 5
echo "a=${a},string=${string}"
[[email protected] /]# ./shell.sh 
./shell.sh: line 3: string: command not found
./shell.sh: line 4: num: command not found
a=,string=

發現問題沒有?定義變數時等號兩邊加空格會識別不出來。

還有!錯誤程式碼會提示,而且還會自動跳過!!變數定義還預設為空!

驗證下猜想:

  1. #! /bin/bash  
  2. this is wrong test!  
  3. echo "a = $a"  
執行結果:

[[email protected] /]# cat shell.sh 
#! /bin/bash

this is wrong test!
echo "a = $a"
[[email protected] /]# ./shell.sh 
./shell.sh: line 3: this: command not found
a = 

說明猜想正確!錯誤程式碼會跳過並繼續執行之後的程式碼(解釋性語言特點)!變數預設值為空!

測試變數的特性以及表示式賦值:

  1. #! /bin/bash  
  2. a=5  
  3. b=$a+5  
  4. echo "now b=$b"  
  5. b=8  
  6. echo "after:b=$b"  
執行結果:

[[email protected] /]# cat shell.sh 
#! /bin/bash

a=5
b=$a+5
echo "now b=$b"
b=8
echo "after b=$b"
[[email protected] /]# ./shell.sh 
now b=5+5
after b=8

由結果可發現,shell中變數沒有型別!根據表示式自動改變其型別!還發現一個問題,表示式不能計算結果,變成了字串的拼接!

又有一個新問題,如何執行表示式的結果而不是字串的拼接呢?

三種賦值方式:

1、賦值關鍵字let

使用方法:let 變數名 = 表示式

測試程式碼;

  1. #! /bin/bash  
  2. a=5  
  3. let b=$a+5  
  4. echo "now b=$b"  
  5. let b=8*5  
  6. echo "after:b=$b"  
執行結果:
[[email protected] /]# cat shell.sh 
#! /bin/bash

a=5
let b=$a+5
echo "now b=$b"
let b=8*5
echo "after b=$b"
[[email protected] /]# ./shell.sh 
now b=10
after b=40

2、從終端(stdin)獲取變數賦值:

  1. #! /bin/bash  
  2. echo "who are you?"  
  3. read name  
  4. echo "hello, $name"  
執行結果:

[[email protected] /]# cat shell.sh 
#! /bin/bash

echo "who is you?"
read name
echo "hello,$name"
[[email protected] /]# ./shell.sh 
who is you?
oba      【此為輸入字元】
hello,oba

3、使用$(linux命令)來賦值

  1. #! /bin/bash  
  2. a=$(ls)  
  3. echo "$a"  

執行結果:

[[email protected] /]# ./shell.sh 
bin
boot
dev
etc
home
lab2.sh
lib
lost+found
media
mnt
opt
proc
qt
root
sbin
selinux
Settings
shell.sh
srv
sys
tmp
usr
var

部分內容參考:http://c.biancheng.net/cpp/shell/


相關推薦

shell指令碼作用shell指令碼變數定義方式shell指令碼學習筆記

轉載自:http://blog.csdn.net/u010317005/article/details/50890543為什麼要用指令碼語言?以Linux系統為例,linux系統裡面有很多個命令,指令碼可以是一個或者多個命令的集合,通過執行指令碼,達到既定的功能或者效果。sh

MySQL定義變量

select 類型 param gin data HERE 一個表 arch exp 變量可以在子程序(性能、存儲過程、匿名塊)聲明和使用。這些變量的範圍是在BEGIN...END規劃。 變量的定義 語法格式: DECLARE var_name [, var_name]

Makefile學習記錄4變數不同的方式

   既然makefile是一種指令碼程式,那麼就要支援程式設計語言中通用的概念和操作。所以必然 也會支援定義變數和賦值的操作。但是不同於C語言中,先宣告變數型別、定義變數名字然後賦值。在makefile中不需要宣告變數的型別,makefile中變數只有一種型別,只代表

C/C++學習筆記整理--3.取陣列中的其中將其中幾位組合起來

10.定義一個數組,取陣列中的其中幾位,將其中幾位組合起來 const int f[10]={6,2,5,5,4,5,6,3,7,6}; int match(int num) {     int k=0;     for(int i=n

linux的shell指令碼學習筆記()

書籍《shell從入門到精通》 1.執行shell的方式: 1).bash test.sh   2).chmod 744 test.sh    ./test.sh 3).source test.sh 2.變數的定義: var=123(注意'='左右倆邊不要有空格,

shell指令碼判斷當前使用者是否為root(學習筆記

可以使用env檢視配置檔案找到USER這個看到當前登入的使用者名稱 [[email protected] shell_project]# env | grep USER USER=root 我把 env查詢出來的內容 使用 grep(查詢) USER 這個出來

Shell程式設計學習筆記變數、運算子)

1.Shell是什麼 Shell 是一個命令列直譯器,它為使用者提供了一個向 Linux 核心傳送請求以便執行程式的介面系統級程式,使用者可以用 Shell 來啟動、掛起、停止甚至是編寫一些程式。 Shell(殼)可操控 Core(核心) 2.Shell指令碼的執行方式 (1)

C++的全域性變數靜態全域性變數常全域性變數定義與宣告

標頭檔案中變數如果沒有初始化就是宣告;初始化了就是定義。在C++語言中,變數有且只能有一次定義,但是可以宣告多次,使用變數前必須定義或宣告。 再說到這些變數的宣告與定義前,要知道這些變數的連結性: 外

機器學習有很多關於核函式的說法核函式的定義作用是什麼?

我來舉一個核函式把低維空間對映到高維空間的例子。 下面這張圖位於第一、二象限內。我們關注紅色的門,以及“北京四合院”這幾個字下面的紫色的字母。我們把紅色的門上的點看成是“+”資料,紫色字母上的點看成是“-”資料,它們的橫、縱座標是兩個特徵。顯然,在這個二維空間內,“+”“-”兩類資料不是線性可分的。 &am

shell學習筆記()

image scanner src 判斷 長度 提示信息 $1 描述 id屬性 1、第一行必須以#!/bin/bash     #!表示腳本使用後面的解釋器解釋執行 2、echo 打印輸出   例如 echo "hello world" > aa.txt   

根據內存大小自動匹配綁定自動伸縮策略shell

-a cut ffi else 匹配 nbsp ins num sca #!/bin/bash for x in $(cf a|grep started|tr -s " " |cut -d " " -f 1) do ins_quantity=$(cf

小程式的全域性變數 定義使用

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neu

HTML input文字框隨機字串 JS指令碼

<input type="text" id="sj" name="way" class="am-form-field am-radius" required="required" placeholder="例如:6324upup" readonly /> <scrip

32位jdk中 long 型別的變數多執行緒中操作問題

package im.zxd.test; public class LongTest {     public static  long num = 0;     public static final long value1=-1L;     public stati

Linux指令碼攻略學習筆記()

前言 繼學習Oracle高階程式設計後,在Linux環境下安裝Mysql時,徹底認識到Linux的欠缺。我們都知道Linux在伺服器領域一直處於領先地位,這很大程度要歸功於它的穩定性,安全性及其較低的總擁有成本(TCO)。經過一個為老師的推薦選擇了《Linux

cordova學習筆記02定義開發外掛外掛集成了谷歌的RS232通訊操作的程式碼

1、cordova開發的另外一個難點就在於如何自定義自己的外掛,將自己的原生Android程式碼抽離出來,做成外掛的形式整合到app。中。如何開發自定義外掛,請你先詳細地閱讀完這個網址:https://www.jianshu.com/p/02e17c392144裡面的內容。下

請問一下在js裡面下面在串程式碼定時器為什麼我沒有申明一個變數就可以 obj.timer=呢?

在JavaScript函式中啊,函式有形參和實引數,形參就是function Book( obj ){}小括號裡面的,表示是你在呼叫這個函式傳進去的值,你在外面呼叫的時候,傳的是什麼就是什麼! var 是宣告一個變數,只要是宣告一個變數都需要使用到var,= 等於是賦值的過程,將右邊的表示式賦值給左

2 手寫實現SpringMVC第二節:自定義註解及反射

還是回到最終要實現的效果。 可以發現,這裡面使用了大量的自定義註解,並且還有autuwire的屬性也需要被賦值(Spring的IOC功能)。 先來建立自定義註解 注意,根據不同的註解使用的範圍來定義@Target,譬如Controller,Service能註解到類,R

類中static成員變數定義宣告

類中static成員變數的定義和宣告:在VS2010中,只能在類外定義同時賦值,在類中宣告。不能再類中宣告時賦值!! #include<iostream> using namespace std; class A { public: static int a

使用者定義變數, 變數定義引用。

使用場景:一組API根據業務流程製作成測試指令碼,想要移植到其他測試環境時,由於資料庫發生了變更,有些初始化資料也相應發生了變化,例如環境地址、請求路徑等等。博主甚至把伺服器地址和介面的部分共同請求路徑都做成了自定義變數。1、新增方式執行緒組 右鍵->新增->配置