Bash語法非常的簡單,Bash是一個命令解釋程序,單使用Bash做不了什麼,但是Bash結合Linux命令就很強大了,幾乎可以完成Linux所有的事情,早年第一個接觸Bash的時候,可以追溯到2010年了,當時在一家互聯網虛產品的公司,那是個時候WEB虛機還很流行的,底層WEB虛機的創建,開戶都用Shell腳本實現。當時我作為Java開發人員,但有幸參與到shell腳本開發中,當時對Shell並不是很熟,從那個時候算是對Shell第一次試水,並沒有進行深入的學習,之後工作重點後來又轉向Java開發,但從那個時候就起就感覺shell這個東西很好玩,最近想重新把這塊東西撿起來,一點一滴的記錄下來,學習shell一定要把學習Linux命令分開,要不然一開始學可能會一頭霧水,這是我的一點建議,隨著對Linux命令的掌握,再加上shell腳本的威力,就可以在Linux的高手。
系統為這三個文件分配了文件標識符fd(file descripter),在Linux系統下,一切皆是文件,對文件的操作,一般要用到文件標識符。它們的文件標識符,分別為0,1,2,關系如下表:
文件描述符 名稱 通用縮寫 默認值 0 標准輸入 stdin 鍵盤 1 標准輸出 stdout 屏幕 2 標准錯誤 stderr 屏幕2.1 環境變量
通過使用printenv可以顯示當前的環境變量
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20[root@IDC-D-1699 ~]
# printenv
HOSTNAME=IDC-D-1699
TERM=xterm
SHELL=
/bin/bash
HISTSIZE=1000
SSH_CLIENT=111.200.23.36 31752 22
QTDIR=
/usr/lib64/qt-3
.3
QTINC=
/usr/lib64/qt-3
.3
/include
SSH_TTY=
/dev/pts/3
USER=root
MAIL=
/var/spool/mail/root
PATH=
/usr/local/java/jdk1
.8.0_101
/bin
:
/usr/lib64/qt-3
.3
/bin
:
/usr/local/sbin
:
/usr/local/bin
:
/sbin
:
/bin
:
/usr/sbin
:
/usr/bin
:
/root/bin
PWD=
/root
JAVA_HOME=
/usr/local/java/jdk1
.8.0_101
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=
/root
LOGNAME=root
Shell不需要明確定義類型,事實上Shell變量的值都是字符串,比如我們定義var=45,其實var的值是字符串而非整數,shell變量不需要事先定義就可以使用,如果使用沒有定義的變量,這字符串取值為空字符串。
變量名稱=”變量Value”,“=”的兩邊不能有空格,否則shell解釋成名稱和命令參數。
獲取變量使用 $變量名稱
2 3a=
"ywq"
echo
$a
可以使用*、?、[]對文件名代換
匹配符 說明 * 匹配0個多個任意字符 ? 匹配一個任意字符 [] 匹配方括號中任意一個字符的一次出現將命令替換為命令輸出,所有的shell支持使用反引號的方式進行命令替換,命令替換可以嵌套,需要注意的是如果使用反引號的形式,在內部反引用前必須使用反斜槓轉移
匹配符 說明 `` 例如 echo ${pwd} $() 例如 echo `pwd`‘\’用作轉義字符。
單引號內的所有字符都保持它本身字符的意思,而不會被bash進行解釋。
除了$、``、/外,雙引號內所有的字符保持字符本身的含義。
在shell中用if,then,elif,else,fi這幾條命令實現分支控制,這種流程控制語句本質上也是由若干個邏輯判斷組成,需要注意的是。
例如:
2 3 4if
[ -f $a ];
then
echo
"hello world!"
fi
case結構用於多種情況的條件判斷,類似於其它語言的switch/case,但從語法結構上有很大的不同,常用格式。
2 3 4 5 6 7 8 9 10 11 12case
字符串
in
模式)
語句
;;
模式2 | 模式3)
語句
;;
*)
默認執行的 語句
;;
esac
例如
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16#!/bin/bash
read
-p
"請輸入要查查詢的區號:"
num
case
$num
in
*)
echo
-n
"中國"
;;&
03*)
echo
-n
"河南省"
;;&
??71)
echo
"鄭州市"
;;
??72)
echo
"安陽市"
;;
??73)
echo
"新鄉市"
;;
??73)
echo
"許昌市"
;;
07*)
echo
-n
"江西省"
;;&
??91)
echo
"南昌市"
;;
??92)
echo
"九江市"
;;
??97)
echo
"贛州市"
;;
esac
注意
當程序指定到條件語句;;&時,不會停止,直到執行到;;esac
不管是if還是case,他們的結尾都很有意思,if的結尾是fi,而case的結尾是easc,首位和尾部正好相反。
例如:
打印目錄下所有的文件
2 3 4 5#!/bin/bash
for
i
in
$(
ls
);
do
echo
item: $i
done
打印序列
2 3 4 5 6#!/bin/bash
for
n
in
$(
seq
1 10);
do
echo
$n
done
例如:
2 3 4 5 6 7 8#!/bin/bash
counter=$1
while
[ $counter -lt 10 ];
do
echo
the counter is $counter
counter=$(($counter+1))
done
例如:
2 3 4 5 6 7 8#!/bin/bash
counter=$1
until
[ $counter -lt 10 ];
do
echo
the counter:$counter
let
counter=counter-1
done