Linux bash shell環境變數以及語法規範
賦值語句 : var=value
變數解析 : ${var}
命令解析 : ${command}
雙引號 " " : 變數內容,並做轉義
單引號 ' ' : 變數內容,但不做轉義
反單引號 ` ` : 同 $()
End Of File : "EOF"
[email protected]:~$ version=v1.0 [email protected]:~$ echo $version v1.0 [email protected]:~$ v2="$(uname) abc ${version}" [email protected]:~$ echo $v2 Linux abc v1.0 [email protected]:~$ echo "$LANG" en_US.UTF-8 [email protected]:~$ echo '$LANG' $LANG [email protected]:~$ echo `uname -r` 3.2.0-33-generic-pae
Shell命令結構和規範
Shell作為外圍軟體生態群其中一個非常重要的元件。它是作業系統最外層的介面,負責直接面向用戶互動並提供核心服務,包括命令列介面(CLI)或圖形介面介面(GUI)兩種形式。以CLI為例,它提供一套命令規範,是一種解釋性語言,將使用者輸入經過直譯器(interpreter)輸出使其轉化成真正的系統呼叫,實現人機互動的功能。
命令結構和規範
Thompson Shell命令語言結構和規範的基礎,其直譯器具有跨平臺的可移植性,並影響到了後來包括Bourne Shell在內的各種指令碼語言設計實現。Bourne Shell的5個特性和命令規範,可以通過sh(1)手冊檢視原始資料。
過濾器/管道線(filter/pipeline)。這絕對是要載入Unix史冊的發明,創立者是Douglas McIlroy,Thompson Shell引入並實現了這個偉大的概念——一個或多個命令組成一根過濾器的鏈條,由’|'或’^'符號分隔。除最後一個命令之外,每個命令的標準輸出都被作為下一個命令的標準輸入。這樣每個命令都作為一個獨立的程序來執行,並通過管道與鄰近的程序相連線。圓括弧內的命令序列整體上可以替代單個命令作為過濾器實現,比如使用者可以輸入”(A;B)|C”。
命令序列和後臺程序
I/O重定向。它利用了Unix設計上的一個重要特性——一切皆檔案,用三個符號表示:”重定向輸出,如果檔案不存在則建立它,如果檔案存在則截斷它;’>>’追加模式重定向輸出,如果檔案不存在則建立它,如果檔案存在則追加輸出至末尾處。
萬用字元擴充套件(globbing)。萬用字元的概念源自於正則表示式,使得直譯器智慧地處理使用者不完全輸入,比如記不清檔名、一次性輸入多個檔案等。’?'匹配任意單一字元;’*'匹配任意字串(包括空串);成對’['和']‘定義了字元集合一個類,可匹配方括號內任意成員,用’-'兩端可指定一系列連續字元匹配範圍。
引數傳遞。這裡主要引入了位置引數和選項引數的概念:’$n’指示shell呼叫的第n個引數替代;還定義了兩個選項引數’-t’和’-c’,前者用於互動,導致shell從標準輸入中讀入一行作為使用者執行的系統命令,後者指示shell將附帶的下一個引數作為命令執行(可正確處理換行符),是對’-t’的補充,特別是呼叫者已經讀取了命令其中某些字元的情況下。如果不帶選項引數則直接讀取檔名。
注:
萬用字元(wildcard)
*: 代表任意個任意字元
?: 代表1個任意字元
[abc]: 代表a或b或c中的一個
[a-z]: 代表 a~z這個範圍
[^abc] : 代表除了a或b或c以外的字元
資料流重定向:
0: STDIN 標準輸入
1: STDOUT 標準輸出
2: STDERR 標準錯誤輸出
>, >>: 輸出流重定向, > 為 覆蓋,>> 為追加
cat infile 1> outfile 2>&1
將 2 重定向到 1, 再將 1 重定向到 outfile 檔案,意思是將標準錯誤輸出和標準輸出都存入outfile
find /home 2> /dev/null
將錯誤輸出 /dev/null, /dev/null是垃圾黑洞,可以將資訊忽略
< : 輸入重定向
cat > catfile < ~/test
用 test 檔案的內容代替STDIN輸入到 catfile裡
<<: eof符號
cat > catfile << 'eof'
你可以使用STDIN(鍵盤輸入)來輸入到catfile,當輸入eof時,輸入結束,相當於點了 ctrl + d
命令執行依據 ; && ||
; : 順序執行
&& : 且 邏輯, cmdA && cmdB, 只有cmdA成功了才會繼續執行cmdB,成功的依據就是 $? 這個狀態回傳碼
|| : 或邏輯, cmdA || cmdB 只有cmdA執行失敗才會繼續執行cmdB
管道(pipe | )
管道可以將前一個命令的stdout當作後一個命令的stdin,只有特定的管道命令才能使用
管道命令有 cut,grep,sort,wc,uniq,tee,tr,col,join,paste,expand等
而ls cd這些命令則不是管道命令,如果需要使用管道則需要用xargs作引數代換
- 號的用途
- 號可以代替 STDOUT STDIN
tar -czv -f - /home | tar -xzv -f -
第一個 - 代替stdout,第二個 - 代替stdin,想當於用tar來實現cp
算數運算
$((a*b)) : 計算a與b的乘積,只支援整數
變數操作
export與子程序:
如果需要在子程序(在一個shell中開啟另一個shell)中使用父程序的變數,則需要使用export將自定義變數轉為環境變數
[email protected]:~$ name=alexis [email protected]:~$ echo $name alexis [email protected]:~$ bash [email protected]:~$ echo $name [email protected]:~$ exit [email protected]:~$ export name [email protected]:~$ bash [email protected]:~$ echo $name alexis [email protected]:~$ exit
unset: 取消變數
[email protected]:~$ name=liu [email protected]:~$ echo $name liu [email protected]:~$ unset name [email protected]:~$ echo $name
read, array, declare
read: 讀取使用者輸入到某個變數
[email protected]:~$ read -p "Please enter your name: " name Please enter your name: Alexis [email protected]:~$ echo $name Alexis
螢幕會輸出 Please enter your name: 並等待使用者輸入,最後將輸入賦值到name
array: bash陣列的賦值與輸出
[email protected]:~$ arr[0]=1 [email protected]:~$ arr[1]=2 [email protected]:~$ arr[2]=3 [email protected]:~$ echo ${arr} 1 [email protected]:~$ echo ${arr[1]} 2 [email protected]:~$ echo ${arr[2]} 3
declare: 宣告變數型別
declare -x name: 將 name 變成環境變數
declare +x name: 將 name 恢復成自定義變數
declare -i product=10*10: 將product定義成整形,這樣後面的表示式就會得到計算
[email protected]:~$ declare -i product=10*10 [email protected]:~$ echo $product 100
declare -r name: 將 name 定義成只讀變數
declare -a product: 將 product 定義成陣列型別
declare -p product: 檢視 product 的型別資訊
變數微調
變數內容的刪除
[email protected]:~$ path=${PATH} [email protected]:~$ echo ${path} /usr/local/glassfish3/jdk7/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games [email protected]:~$ echo ${path#/*bin:} /usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games [email protected]:~$ echo ${path} /usr/local/glassfish3/jdk7/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games [email protected]:~$ echo ${path##/*bin:} /usr/games
${path#/*bin:}
path: 需要微調的變數名
#: 從左邊開始刪除所匹配的最短的字串,類似與正則裡的非貪婪匹配
##: 表示從左邊開始刪除匹配的最長的字串,類似與正則的貪婪匹配
/*bin: : 表示以 / 開頭, *是萬用字元表示任意個任意字元, 以 bin: 結尾的字串
注意執行這個表示式以後原來的path並不會被修改,我們只是將修改後的值輸出了而已
如果要從右邊開始匹配則用 % , %% 替換 #, ##
變數內容的替換
var=${str-val}: 當變數str未設定,則 var=val, 若變數str已經設定,則var=str
var=${str:-val}: 當變數str未設定或者為空串, 則var=val
var=${str+val}: 當變數str已經設定, 則var=val,否則var=空串
var=${str:+val}: 當變數str已經設定且非空串,則var=val,否則var=空串
var=${str=val}: 若str已經設定,則var=val,str不變,若str未設定,則var=str=val
var=${str:=val}: 若str已經設定且非空,則var=val,str不變,若str未設定或為空串,則var=str=val
var=${str?val}: 若str未設定,則輸出str到stderr,若str已經設定,則var=str
var=${str:?val}: 若str為設定或者為空串,則輸出str到stderr,若str已經設定切非空,則var=str
source命令*--shell指令碼編寫
source命令用於執行shell指令碼,它與bash/sh或者直接以路徑執行指令碼的區別在於,source是在父程序中執行,而bash是在子程序中執行,在子程序中產生的變數在父程序中將不可見,所以在執行系統配置指令碼的時候應該使用source
檔案比較運算子
運算子 描述 示例
-e filename 如果 filename 存在,則為真 [ -e /var/log/syslog ]
-d filename 如果 filename 為目錄,則為真 [ -d /tmp/mydir ]
-f filename 如果 filename 為常規檔案,則為真 [ -f /usr/bin/grep ]
-L filename 如果 filename 為符號連結,則為真 [ -L /usr/bin/grep ]
-r filename 如果 filename 可讀,則為真 [ -r /var/log/syslog ]
-w filename 如果 filename 可寫,則為真 [ -w /var/mytmp.txt ]
$? 上一個指令的返回值
比較運算子
-x filename 如果 filename 可執行,則為真 [ -L /usr/bin/grep ]
$# 與 [email protected]
$0 : 指令碼名稱
$1 , $2 , $3 ... : 引數 1 2 3 ...
$# : 指令碼引數個數
[email protected] : 指令碼所有引數名
if ... elif ... then ... fi 條件判斷語句
#!/bin/bash # 使用 if then else fi 獲取埠狀態 testing=$(netstat -tualn | grep ":80") if [ "$testing" != "" ]; then echo "WWW port 80 is running in your system" fi testing=$(netstat -tualn | grep ":21") if [ "$testing" != "" ]; then echo "FTP port 21 is running in your system" fi testing=$(netstat -tualn | grep ":22") if [ "$testing" != "" ]; then echo "SSH port 22 is running in your system" fi testing=$(netstat -tualn | grep ":25") if [ "$testing" != "" ]; then echo "MAIL port 25 is running in your system" fi
case ... esac 選擇語句
#!/bin/bash #test case ... esac echo "Exit system?" echo "1.yes 2.no" read -p "Enter your choice: " choice case $choice in "1") echo "Exit now" ;; "2") echo "Not exit" ;; *) echo "Plase enter 1 or 2" ;; esac
function函式
#!/bin/bash #use function() function printit() { echo "$0 Printing $1" } printit "myparam"
while 迴圈
#!/bin/bash # test while loop while [ "$yn" != "yes" -a "$yn" != "no" ] do read -p "Please input yes/no: " yn done echo "Good!" i=0 s=0 while [ "$i" -lt 100 ] do i=$(($i+1)) s=$(($s+$i)) done echo "The sum is $s"
for的用法
1.使用 for ... in ... do ... done
#!/bin/bash # test for ... in ... do ... done # 檢視子網是否聯通 ip="192.168.1" for sitenu in $(seq 1 100) do ping -c 1 -w 1 "${ip}.${sitenu}" &> /dev/null && result=1 || result=0 if [ "$result" == 1 ]; then echo "${ip}.${sitenu} is ON" else echo "${ip}.${sitenu} is DOWN" fi done
#!/bin/bash #檢視目錄下所有檔案許可權 read -p "Enter a directory: " dir if [ "$dir" == "" -o ! -d "$dir" ]; then echo "The $dir is NOT exist in your system." exit 1 fi filelist=$(ls $dir) for filename in $filelist do perm="" test -r "$dir/$filename" & perm="$perm readable" test -w "$dir/$filename" & perm="$perm writable" test -x "$dir/$filename" & perm="$perm executable" echo "The file $filename's permission is $perm" done
2. 使用 for (()) 語法
#!/bin/bash # test for if [ $# != 1 ]; then echo "Usage $0 {maxnum}" exit 1; fi s=0 for (( i=1; i<=$1; i++ )) do s=$(($s+$i)) done echo "The sum of 1+2+3..+$1 is $s"
1 #!/bin/bash #表明該指令碼使用sh或bash 2 #This is a sample 3 4 #usage of variable 5 year=1999; #變數賦值語句 6 7 #usage of expression 8 year=`expr $year + 1`; #變數運算,使用expr或let 9 echo $year 10 year="olympic'"$year #字串直接連線,不需要連線符 11 echo $year 12 13 #usage of if statement 14 if [ $year = 1999 ] 15 then 16 echo "greate" 17 else 18 echo "not greate" 19 fi #語句使用相反的單詞結束 20 21 #usage of function and local variable 22 function echoyear { 23 local year=1998; #區域性變數使用local修飾 24 echo $year 25 }相關推薦
Linux bash shell環境變數以及語法規範
賦值語句 : var=value 變數解析 : ${var} 命令解析 : ${command} 雙引號 " " : 變數內容,並做轉義 單引號 ' ' : 變數內容,但不做轉義 反單引號 ` ` : 同 $() End Of File : "EOF" [email protected]:
linux bash Shell特殊變數:Shell $0, $#, $*, [email protected], $?
在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。 例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: [[email protected] /]$ ec
【Shell】linux bash Shell特殊變數:Shell $0, $#, $*, [email protected]<
在linux下配置shell引數說明 前面已經講到,變數名只能包含數字、字母和下劃線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。 例如,$ 表示當前Shell程序的ID,即pid,看下面的程式碼: $echo $$ 執行結果 29949
Linux bash shell中變數的設定和使用
給變數賦值直接使用符號=,如name=kylin 使用這個變數時需要在前邊加上$符號,如echo $name, 另外,如果變數中的內容比較複雜,使用大括號是比較安全的辦法,如${name}, 如果變數所賦值中需要有空格則要加上雙引號或者單引號。 雙引號和單引號的區別在於,雙
Linux bash中環境配置以及配置檔案的讀取順序
在Linux中系統有一些環境配置檔案,讓bash在啟動是直接讀取這些配置檔案,以規劃好bash的操作環境。配置檔案可分為全體的配置檔案以及使用者個人偏好配置檔案。像 login 與 non-login shell 的概念 以及 各種配置檔案的讀取順序,我經常忘記
Linux(高階程式設計)2————環境變數以及設定
什麼是環境變數? 環境變數:一般是指作業系統在執行時指定作業系統執行環境的一些引數。Linux是多使用者作業系統,Linux為每個使用者都配置有自己的環境變數,這樣每個使用者都有自己的環境變數,預設情況下每個使用者的環境變數是一樣的。每個使用者可以通過配置環境變數來修改自己的執行環境。
Linux程式設計 12 (預設shell環境變數, PATH變數重要講解)
一 .概述 預設情況下, bash shell會用一些特定的環境變數來定義系統的環境。這些預設環境變數可以理解是上篇所講的系統全域性環境變數。 1.1 bash shell支援的Bourne變數 Bourne shell 是 UNIX 最初使用的 shell。下面例舉幾個常用的變數名。
Linux Bash Shell學習(十五:變數型別和整型運算
本文也即《Learning the bash Shell》3rd Edition的第六章Command-Line Options and Typed varilables之讀書筆記之二,但我們將不限於此。 在之前,我們涉及的變數基本上是字串,也有整數,例如便是引數個數的$
Linux shell 環境變數及有效範圍
每當我們使用ssh客戶端遠端登陸一個服務時,作業系統就會給我們分配一個新的shell,並且這個shell繼承了作業系統的永久環境變數。在當前的shell執行一個sh檔案,都會臨時產生一個子shell,該檔案執行完畢後,將自動返回到父shell。 子shell會繼承父shell的所有永久環境變數和
Part2 Linux Bash Shell變數和重定向
直譯器 理解其他命令,並且命令執行起來 理解語句,並且根據流程控制機制讓語句按需執行: 編譯器 理解源程式,並且能夠將源程式轉換為二進位制格式,而後讓其夠執行 程式檔案:原始碼 直譯器: 由直譯器負責讀取一句執行一句 編譯器: 事先,將整個程式轉換成二進位制格式,而後執
linux 設定環境變數以及檢視環境變數
1、設定linux環境變數 在/etc/profile檔案中新增變數【對所有使用者生效(永久的)】 用VI在檔案/etc/profile檔案中增加變數,該變數將會對Linux下所有使用者有效,並且是“永久的”。 &n
arm-linux-gcc安裝及自定義bash指令碼環境變數設定
2。 解壓 arm-linux-gcc-3.4.1.tar.bz2 #tar -jxvf arm-linux-gcc-3.4.1.tar.bz2 解壓過程需要一段時間,解壓後的檔案形成了 usr/local/ 資料夾,進入該資料夾,將 arm資料夾拷貝到/usr/local/下 # cd
shell指令碼一次性配置Linux中java環境變數
只需bash一下,很輕鬆有木有QAQ詳見程式碼:#!bin/bash nowLoad=`pwd` goalPath="/usr/java" #我們把jdk放在這兒 environmentPath="/home/kzl/.bash_profile" #kzl是我的使用者名
linux命令之檢視當前shell環境變數-env
linux下執行程式程序經常出現由於環境問題導致的程式找不到動態庫的情況,因為一般程式是通過ld_library_path這個環境變數查詢使用者動態庫的。 不過也可以指定使用者定義環境變數,還有就是一個叫pkg-config的工具,可以通過工具的pc檔案中配置查詢動態庫的路
Linux下配置java環境變數以及Eclipse配置
1. 去java.sun.com/j2se/1.4.2/download.html">http://java.sun.com/j2se/1.4.2/download.html 下載一個Linux Platform的JDK,建議下載RPM自解壓格式的(RPM in sel
Linux登入shell和非登入(互動式shell)環境變數配置
![](http://static.oschina.net/uploads/img/201601/07175805_qTMP.gif) 使用Jenkins執行shell指令碼的時候, 碰到`command not found`. 比如`java mvn`, 這些環境變數配置在`/etc/profile` 中
linux bash shell中for的用法and示例
bash shell腳本中for的用法關於linux bash shell中的for語句 在linux中shell是必不可少的一部分,但是在bash shell中有while,for,until等循環命令,今天就介紹一下關於for的一些用法。文中任何錯誤希望大佬們一一指出,不勝感激。bash sh
bash shell最基本的語法
ssi expr express 一個空格 元素 res 空格 pre file 1 shell語句的基本構成 shell每個基本的構成元素之間都相隔一個空格。 比如[ -e file ],[、-e、file、]這四個基本元素之間都相隔了一個空格。 同樣的道理[ ! -e
linux bash shell 判斷目錄是否為空的函數
http urn $1 參考 empty 判斷 details art lin #!/bin/sh ##方法一 判斷輸出字符數統計為0 is_empty_dir(){ return `ls -A $1|wc -w` } ##方法二 判斷輸出string為空 #i
LINUX系統JDK環境變數配置
1、下載Jar包 (可自行去Oracle官網下載 本人使用示例: jdk-7u79-linux-x64.tar.gz) 2、將jdk-7u79-linux-x64.tar.gz上傳到Linux伺服器 3、執行命令 tar -xvf jdk-7u79-linux-x64.tar