1. 程式人生 > >01- Shell指令碼學習--入門

01- Shell指令碼學習--入門

簡介

Shell是一種指令碼語言,那麼,就必須有直譯器來執行這些指令碼。

Unix/Linux上常見的Shell指令碼直譯器有bash、sh、csh、ksh等,習慣上把它們稱作一種Shell。我們常說有多少種Shell,其實說的是Shell指令碼直譯器。

Hello World

開啟文字編輯器,新建一個檔案test.sh,副檔名為.sh(sh代表shell)。

輸入一些程式碼:

#!/bin/bash
echo "Hello World !"

在命令列執行:

chmod +x test.sh
./test.sh

執行結果:

Hello World !

#! 是一個約定的標記,它告訴系統這個指令碼需要什麼直譯器來執行,即使用哪一種Shell

echo命令用於向視窗輸出文字。

註釋

#開頭的行就是註釋,會被直譯器忽略。sh裡沒有多行註釋,只能每一行加一個#號。

# --------
# 這是註釋塊
# --------

列印輸出

echo: 是Shell的一個內部指令,用於在螢幕上打印出指定的字串。

echo arg 
echo -e arg #執行arg裡的轉義字元。echo加了-e預設會換行
echo arg > myfile #顯示結果重定向至檔案,會生成myfile檔案

注意,echo後單引號和雙引號作用是不同的。單引號不能轉義裡面的字元。雙引號可有可無,單引號主要用在原樣輸出中。

printf:格式化輸出語句。
printf

命令用於格式化輸出, 是echo命令的增強版。它是C語言printf()庫函式的一個有限的變形,並且在語法上有些不同。

如同 echo 命令,printf 命令也可以輸出簡單的字串:

printf "hello\n"

printf 不像 echo 那樣會自動換行,必須顯式新增換行符(\n)。

注意:printf 由 POSIX 標準所定義,移植性要比 echo 好。

printf 命令的語法:

printf  format-string  [arguments...]

#format-string 為格式控制字串,arguments 為引數列表。功能和用法與c語言的 printf 命令類似。

這裡僅說明與C語言printf()函式的不同:

  • printf 命令不用加括號
  • format-string 可以沒有引號,但最好加上,單引號雙引號均可。
  • 引數比格式控制符(%)多時,格式控制符可以重用,可以將所有引數都轉換。
  • arguments 使用空格分隔,不用逗號。
# 雙引號
printf "%d %s\n" 10 "abc"
10 abc
# 單引號與雙引號效果一樣 
printf '%d %s\n' 10 "abc" 
10 abc

# 沒有引號也可以輸出
printf %s abc
abc

# 但是下面的會出錯:
printf %d %s 10 abc 
#因為系統分不清楚哪個是引數,這時候最好加引號了。


# 格式只指定了一個引數,但多出的引數仍然會按照該格式輸出,format-string 被重用
$ printf %s a b c
abc
$ printf "%s\n" a b c
a
b
c

# 如果沒有 arguments,那麼 %s 用NULL代替,%d 用 0 代替
$ printf "%s and %d \n" 
and 0

# 如果以 %d 的格式來顯示字串,那麼會有警告,提示無效的數字,此時預設置為 0
$ printf "The first program always prints'%s,%d\n'" Hello Shell
-bash: printf: Shell: invalid number
The first program always prints 'Hello,0'
$

read: 命令列從輸入裝置讀入內容

#!/bin/bash

# Author : lalal

echo "What is your name?"
read NAME #輸入
echo "Hello, $NAME"

執行指令碼:

chmod +x test.sh
./test.sh

What is your name?
lalal

Hello, lalal

變數定義

Shell支援自定義變數。

定義變數

定義變數時,變數名不加美元符號($),如:

variableName="value"

注意,變數名和等號之間不能有空格,這可能和你熟悉的所有程式語言都不一樣。有空格會出錯。

同時,變數名的命名須遵循如下規則:

  • 首個字元必須為字母(a-z,A-Z)。
  • 中間不能有空格,可以使用下劃線(_)。
  • 不能使用標點符號。
  • 不能使用bash裡的關鍵字(可用help命令檢視保留關鍵字)。

變數定義舉例:

myUrl="lalal"
myNum=100

使用變數

使用一個定義過的變數,只要在變數名前面加美元符號($)即可,如:

your_name="lalal"
echo $your_name
echo ${your_name}

變數名外面的花括號是可選的,加不加都行,加花括號是為了幫助直譯器識別變數的邊界,比如下面這種情況:

for skill in C PHP Python Java 
do
    echo "I am good at ${skill}Script"
done

如果不給skill變數加花括號,寫成echo "I am good at $skillScript",直譯器就會把$skillScript當成一個變數(其值為空),程式碼執行結果就不是我們期望的樣子了。

推薦給所有變數加上花括號,這是個好的程式設計習慣。

已定義的變數,可以被重新定義。

在變數前面加readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。

url="http://www.baidu.com"
readonly url
url="http://www.baidu.com"

使用 unset 命令可以刪除變數。語法:

unset variable_name

變數被刪除後不能再次使用;unset 命令不能刪除只讀變數。

變數型別

執行shell時,會同時存在三種變數:
1) 區域性變數
區域性變數在指令碼或命令中定義,僅在當前shell例項中有效,其他shell啟動的程式不能訪問區域性變數。

2) 環境變數
所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常執行。必要的時候shell指令碼也可以定義環境變數。

3) shell變數
shell變數是由shell程式設定的特殊變數。shell變數中有一部分是環境變數,有一部分是區域性變數,這些變數保證了shell的正常執行。

特殊變數

前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數

變數 含義
$0 當前指令碼的檔名
$n 傳遞給指令碼或函式的引數。n 是一個數字,表示第幾個引數。例如,第一個引數是$1,第二個引數是$2
$# 傳遞給指令碼或函式的引數個數。
$* 傳遞給指令碼或函式的所有引數。
[email protected] 傳遞給指令碼或函式的所有引數。被雙引號(" ")包含時,與 $* 稍有不同
$? 上個命令的退出狀態,或函式的返回值。
$$ 當前Shell程序ID。對於 Shell 指令碼,就是這些指令碼所在的程序ID。

示例:

#!/bin/bash
echo "File Name: $0"
echo "First Parameter : $1"
echo "First Parameter : $2"
echo "Quoted Values: [email protected]"
echo "Quoted Values: $*"
echo "Total Number of Parameters : $#"

執行結果:

$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2

$*[email protected] 的區別

$*[email protected] 都表示傳遞給函式或指令碼的所有引數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有引數。

但是當它們被雙引號(" ")包含時,"$*" 會將所有的引數作為一個整體,以"$1 $2 … $n"的形式輸出所有引數;"[email protected]" 會將各個引數分開,以"$1" "$2" … "$n" 的形式輸出所有引數。

示例:

#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\[email protected]=" [email protected]
echo "\"\[email protected]\"=" "[email protected]"
echo "print each param from \$*"
for var in $*
do
    echo "$var"
done
echo "print each param from \[email protected]"
for var in [email protected]
do
    echo "$var"
done
echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done
echo "print each param from \"\[email protected]\""
for var in "[email protected]"
do
    echo "$var"
done

執行 ./test.sh "a" "b" "c" "d",看到下面的結果:

$*=  a b c d
"$*"= a b c d
[email protected]=  a b c d
"[email protected]"= a b c d
print each param from $*
a
b
c
d
print each param from [email protected]
a
b
c
d
print each param from "$*"
a b c d
print each param from "[email protected]"
a
b
c
d

退出狀態

$? 可以獲取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行後的返回結果。

示例:

if [[ $? != 0 ]];then
  echo "error"
  exit 1;
fi

退出狀態是一個數字,一般情況下,大部分命令執行成功會返回 0,失敗返回 1。

不過,也有一些命令返回其他值,表示不同型別的錯誤。

轉義字元

轉義字元    含義
\\  反斜槓
\a  警報,響鈴
\b  退格(刪除鍵)
\f  換頁(FF),將當前位置移到下頁開頭
\n  換行
\r  回車
\t  水平製表符(tab鍵) 
\v  垂直製表符

shell預設是不轉義上面的字元的。需要加-e選項。

舉個例子:

#!/bin/bash
a=11
echo -e "a is $a \n"

執行結果:

Value of a is 10

這裡 -e 表示對轉義字元進行替換。如果不使用 -e 選項,將會原樣輸出:

Value of a is 10\n

可以使用 echo 命令的 -E 選項禁止轉義,預設也是不轉義的;使用 -n 選項可以禁止插入換行符。

命令替換

命令替換是指Shell可以先執行命令,將輸出結果暫時儲存,在適當的地方輸出。

語法:

`command`

注意是反引號,不是單引號,這個鍵位於 Esc 鍵下方。

下面的例子中,將命令執行結果儲存在變數中:

#!/bin/bash
DATE=`date`
echo "Date is $DATE"

變數替換

變數替換可以根據變數的狀態(是否為空、是否定義等)來改變它的值。

可以使用的變數替換形式:

形式 說明
${var} 變數本來的值
${var:-word} 如果變數 var 為空或已被刪除(unset),那麼返回 word,但不改變 var 的值。
${var:=word} 如果變數 var 為空或已被刪除(unset),那麼返回 word,並將 var 的值設定為 word。
${var:?message} 如果變數 var 為空或已被刪除(unset),那麼將訊息 message 送到標準錯誤輸出,可以用來檢測變數 var 是否可以被正常賦值。若此替換出現在Shell指令碼中,那麼指令碼將停止執行。
${var:+word} 如果變數 var 被定義,那麼返回 word,但不改變 var 的值。

一個完整的shell示例

下面的指令碼用於php安裝過程中安裝zip擴充套件。

php_zip_ins.sh

#!/bin/bash
#zip install

if [ -d php-5.4.25/ext/zip ];then
    cd php-5.4.25/ext/zip
else
    tar zxvf php-5.4.25.tar.gz
    cd php-5.4.25/ext/zip
fi
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
[ $? != 0 ] && exit
make install
echo 
grep 'no-debug-zts-20100525' /usr/local/php/etc/php.ini
if [ $? != 0 ];then
        echo '' >> /usr/local/php/etc/php.ini
        echo 'extension_dir=/usr/local/php/lib/php/extensions/no-debug-zts-20100525' >> /usr/local/php/etc/php.ini
fi
grep 'zip.so' /usr/local/php/etc/php.ini
if [ $? != 0 ];then
    echo 'extension=zip.so' >> /usr/local/php/etc/php.ini
fi
echo "zip install is OK"


/usr/local/apache2/bin/apachectl restart
cd -
rm -rf php-5.4.25
echo "all ok!"
ls /usr/local/php/lib/php/extensions/no-debug-zts-20100525/

Shell指令碼學習系列教程github: https://github.com/52fhy/shell-book

相關推薦

01- Shell指令碼學習--入門

簡介 Shell是一種指令碼語言,那麼,就必須有直譯器來執行這些指令碼。 Unix/Linux上常見的Shell指令碼直譯器有bash、sh、csh、ksh等,習慣上把它們稱作一種Shell。我們常說有多少種Shell,其實說的是Shell指令碼直譯器。 Hello World 開啟文字編輯器,新建一個檔

Shell程式設計-01-Shell指令碼初步入門

什麼是Shell     簡單來說Shell其實就是一個命令直譯器,而它的作用就是解釋並執行使用者輸入的命令及程式。使用者每輸入一條命令,Shell就解釋執行一次。這種方式很容易讓大家想起在Windows環境中使用的command命令,我們在cmd視窗輸入一條命令,按下Enter鍵,則執行相應的命令和結果。

shell指令碼學習-3】

part-1:   #!/bin/bash#source,sh,./shell_name :shell指令碼執行方法 # #變數 #declare :修飾x=10/2echo "$x"#將變數修飾為只讀declare -r xx="a" #再次為變數賦值檢驗修飾echo "$x"#將變數修飾為

shell指令碼學習-練習寫一個指令碼1

    # 1.依次展示/etc/passwd中的使用者名稱和UID。格式如:Hello,$USER,your UID is $UID.# 2.統計一個有多少個使用者 #!/bin/bash #Program Description: #Author: Created b

SHELL指令碼學習-練習寫一個指令碼3

  #通過ping命令測試192.168.1段的所有主機是否線上,如果線上就顯示is up並顯示藍色,如果不線上就顯示is down。 #!/bin/bash #Program Description: #Author: Created by ctu_lzq #Date: 2018

Shell指令碼學習總結

    最近一段時間研究語音識別(Automatic Speech Recognition, ASR),接觸到一款優秀的ASR開源專案Kaldi。學習過程中,發現Kaldi大部分指令碼採用Shell語音編寫,所以潛心學習了一段時間的Shell程式設計。總體來說,該語言難度一般

shell指令碼學習第四彈-管道與IO重定向

shell指令碼學習第四彈-管道與IO重定向 一、IO介紹 什麼是IO?簡單的來說,IO就是輸入輸出;在unix裡面,我們必須要標準輸入,標準輸出和標準錯誤。我們可以用程式執行過程來更明顯說明:程式的輸入就是標準輸入,程式處理完之後,輸出結果就是標準輸出,或者報錯就是標準錯誤。

shell指令碼學習第三彈-變數的使用

shell指令碼學習第三彈-變數的使用 一、什麼是變數 相信大家聽到變數這個詞語很敏感吧,我們的C語言中也有所謂的變數,變數即在程式執行過程中它的值是允許改變的量。 也可以這麼說,變數的本質是一種鍵值對,舉個例子來說:str=“123456”,“12345”就是鍵值對中的Val

shell指令碼學習第一彈

shell指令碼學習第一彈 作為一個linux程式設計師,不會shell的指令碼的編寫,可是不合格的呀!!! 今天,我們一起來看看shell指令碼的編寫: 別的先不說,先來一個入門級的案例: 1 #!/bin/bash 2 #當前路徑 3 pwd 4

Shell 指令碼學習-Day1

  Day1: 命令與引數 cd /dev; ls -l ls --color #輸出顏色 #shell識別三種命令:1、內部命令 2、shell函式 3、外部命令(iostat、fio、issdcm..) 引數: echo "Shell 輸出指令碼名稱及引數"; echo "執行的指令

shell指令碼學習方法

1,熟悉shell指令碼基礎知識點,掌握(sed,find,awk,cut等重要的命令。),掌握判斷語句,迴圈語句的使用,和shell指令碼的格式,步驟要寫工整。 2,練習shell指令碼,從簡單的指令碼練起走,自己先敲一邊,在看裡面的內容是如何實現的。在回過頭來看相關的知識點(不用死記硬背,用

Shell指令碼學習&SpringBoot啟動關閉指令碼

一、Shell指令碼學習手冊 傳送門 二、SpringBoot Shell啟動關閉指令碼 springboot 啟動指令碼 #!/bin/sh ps -ef |grep sell-0.0.1-SNAPSHOT.jar |grep -v grep if [ $? -eq 0 ];then echo

Shell指令碼學習 - 運算及一些方法

繼續shell指令碼學習   運算子 bash不支援簡單的數學計算,需要依賴其他命令實現。 expr可以代為實現。 # 表示式一般這麼寫 `expr 4 + 4` 注意點: 1. 引號不是普通單引號,是右斜的引號,在esc鍵下方。表示式用這種右斜的引號括起來,必須成對出現

Shell指令碼學習指南讀書筆記(一)

第1章 背景知識略 第2章 入門 編譯型語言 優點:高效 缺點:多半運作於底層,處理位元組、整數或其他機器層級的物件(C++中就很難將一個目錄所有檔案複製到另一個目錄中) 指令碼程式語言 通常是解釋型的

shell 指令碼學習筆記

前言 基於bash 並參考 菜鳥教程的shell 教程 http://www.runoob.com/linux/linux-shell.html ### shell 的執行方法 chmod +x ./test.sh bash test.sh 輸入輸出 除錯輸出 #!/bin/bash set -

Shell指令碼學習 - 流程控制和函式

繼續Shell的學習   流程控制 if else 流程控制不可為空,如果else沒有語句執行,就不要寫else if: if condition then     command1     command2     .

shell指令碼學習手冊

簡介: Shell 是一個用C語言編寫的程式,它是使用者使用Linux的橋樑。Shell既是一種命令語言,又是一種程式設計語言。 Shell 是指一種應用程式,這個應用程式提供了一個介面,使用者通過這個介面訪問作業系統核心的服務。 Ken Thompson的sh是第一種Unix Shel

shell指令碼學習筆記 (正則表示式)

         正則表示式一般有三個部分組成,他們分別是:字元類,數量限定符,位置限定符。規定一些特殊語法表示字元類、數 量限定符和位置關係,然後用這些特殊語法和普通字元一起表示一個模式,這就是正則

linux之shell指令碼學習(一)

#!/bin/bash echo 'hello' your_name='longxiong' echo $your_name echo ${your_name} for i in `ls /opt`; do echo ${i} done str="1234" echo ${#str} unset s

Shell指令碼學習指南(一)——基本概念

LANG 未設定任何LC_XXX時的預設值 LC_ALL 用來覆蓋所有其他的LC_XXX變數的值 LC_COLLATE 排序規則 LC_CTYPE 字符集