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 字符集