Linux shell程式設計(一)shell指令碼中的變數詳解
shell指令碼與Windows/Dos下的批處理相似,也就是用各類命令預先放入到一個檔案中,方便一次性執行的一個程式檔案,
主要是方便管理員進行設定或者管理用的。相對於Perl、Python等指令碼語言優勢在於它能處理底層業務,
因為有大量Linux命令作為支撐,“自動安裝”等用shell指令碼寫就會非常簡單。
Linux下的shell指令碼預設為bash ,sh其實是bash的一個連結。
(1)檢視預設shell的兩種方法:
1)echo $SHELL
/bin/bash
2)grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
(2)樣例指令碼:
基於這個指令碼來學習一下簡單的shell指令碼。
#!bin/bash
#變數定義
ETC_DIR=/etc/sysconfig/network-scripts
NET_DIR=/etc/sysconfig
ROOT_UID=0
#if條件判斷
if [ "$UID" -ne "$ROOT_UID" ] #判斷是否為root許可權
then
echo "Must be root to run this script"
exit 1
fi
cd $ETC_DIR || {
echo "Cannot change to necessary directory,">&2
exit 1
}
#清除原來的網路卡配置檔案
cat /root/init_ip >ifcfg-eth0 && echo "write eth0 sucessfully"
cd $NET_DIR || {
echo "Cannot change to necessary directory,">&2
exit 1
}
service network restart #重啟網路命令
exit 0 #返回成功
(2)UID說明
UID是一個系統變數,當前是root許可權 UID=0,當前非root許可權UID不等於0
所以我們在這設定了一個變數ROOT_UID=0,來判斷當前是否為root狀態,因為我們對系統的配置檔案進行修改必須使用root許可權。所以執行的時候必須加sudo。
指令碼執行時候會先呼叫環境變數,去找相關變數,有的變數是系統已經定義可直接使用,如上文用到的UID。
1)cat /etc/profile (全域性)
2)cat /etc/profile.d (全域性)可以把變數放在這裡面就可以直接用
3).bashrc:使用者環境變數
4).bash_profile:使用者環境變數
(3)清空檔案的三種方法:
清空日誌的三種方法:
1、echo "">test.log
2、echo >test.log
3、cat /dev/null >test.log
/dev/null稱之為黑洞
在程式碼中用的是第三種方法:cat /dev/null >network
(4)&&與||的使用:
cat /dev/null >ifcfg-eth0 && echo "clean ifcfg-eth0 ok!"
1.&&表示只有當前面的命令執行成功以後才執行後面的命令。
2.||表示前面執行不成功就執行後面命令。
在這兩個符號後面,用大括號,可以寫入多條命令
cd $NET_DIR || {
echo "Cannot change to necessary directory,">&2
exit 1
}
如果不能夠進入到該目錄下,就列印錯誤資訊。
1)&0表示標準輸入。
2)&1表示標準輸出。
3)&2表示標準出錯,
(5)指令碼執行的三種方法:
1)bash或sh + 指令碼名 (檔案無可執行許可權,或者沒指定直譯器)
2)絕對路徑/指令碼名 (需要可執行許可權)或者./(和第一種方法類似,不過需要可執行許可權)
3)source +指令碼名 或者. 指令碼名
bash或sh 指定的bash執行指令碼,然後啟動子shell去執行,比如,沒有在指令碼第一行指定使用哪一種指令碼命令,就要在執行時指定直譯器。
一般指令碼都會在第一行寫上‘#!/bin/bash’,且只能放在第一行,放在其他行就作註釋處理,則需要用使用第一種方法。但是在Linux系統預設是bash,所以無需指定也可以,但是在其他系統就不行了。
(6)source xxx.sh
source和.命令是Shell的內建命令,這種方式也不會建立子Shell,直接在當前的shell中執行,並且呼叫系統預設的shell去執行指令碼,不管指令碼中是不是指定shell命令解析器。
source和.命令不啟動子shell,所以會直接執行子shell裡的語句,並把變數傳給父shell。指令碼里面所有新建、改變變數的語句都會儲存在當前shell裡面。
主要是方便管理員進行設定或者管理用的。相對於Perl、Python等指令碼語言優勢在於它能處理底層業務,
因為有大量Linux命令作為支撐,“自動安裝”等用shell指令碼寫就會非常簡單。
Linux下的shell指令碼預設為bash ,sh其實是bash的一個連結。
(1)檢視預設shell的兩種方法:
1)echo $SHELL
/bin/bash
2)grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
(2)樣例指令碼:
基於這個指令碼來學習一下簡單的shell指令碼。
#!bin/bash
#變數定義
ETC_DIR=/etc/sysconfig/network-scripts
NET_DIR=/etc/sysconfig
ROOT_UID=0
#if條件判斷
if [ "$UID" -ne "$ROOT_UID" ] #判斷是否為root許可權
then
echo "Must be root to run this script"
exit 1
fi
cd $ETC_DIR || {
echo "Cannot change to necessary directory,">&2
exit 1
}
#清除原來的網路卡配置檔案
cat /dev/null >ifcfg-eth0 && echo "clean ifcfg-eth0 ok!"
cat /root/init_ip >ifcfg-eth0 && echo "write eth0 sucessfully"
cd $NET_DIR || {
echo "Cannot change to necessary directory,">&2
exit 1
}
service network restart #重啟網路命令
exit 0 #返回成功
(2)UID說明
UID是一個系統變數,當前是root許可權 UID=0,當前非root許可權UID不等於0
所以我們在這設定了一個變數ROOT_UID=0,來判斷當前是否為root狀態,因為我們對系統的配置檔案進行修改必須使用root許可權。所以執行的時候必須加sudo。
指令碼執行時候會先呼叫環境變數,去找相關變數,有的變數是系統已經定義可直接使用,如上文用到的UID。
1)cat /etc/profile (全域性)
2)cat /etc/profile.d (全域性)可以把變數放在這裡面就可以直接用
3).bashrc:使用者環境變數
4).bash_profile:使用者環境變數
(3)清空檔案的三種方法:
清空日誌的三種方法:
1、echo "">test.log
2、echo >test.log
3、cat /dev/null >test.log
/dev/null稱之為黑洞
在程式碼中用的是第三種方法:cat /dev/null >network
(4)&&與||的使用:
cat /dev/null >ifcfg-eth0 && echo "clean ifcfg-eth0 ok!"
1.&&表示只有當前面的命令執行成功以後才執行後面的命令。
2.||表示前面執行不成功就執行後面命令。
在這兩個符號後面,用大括號,可以寫入多條命令
cd $NET_DIR || {
echo "Cannot change to necessary directory,">&2
exit 1
}
如果不能夠進入到該目錄下,就列印錯誤資訊。
1)&0表示標準輸入。
2)&1表示標準輸出。
3)&2表示標準出錯,
(5)指令碼執行的三種方法:
1)bash或sh + 指令碼名 (檔案無可執行許可權,或者沒指定直譯器)
2)絕對路徑/指令碼名 (需要可執行許可權)或者./(和第一種方法類似,不過需要可執行許可權)
3)source +指令碼名 或者. 指令碼名
bash或sh 指定的bash執行指令碼,然後啟動子shell去執行,比如,沒有在指令碼第一行指定使用哪一種指令碼命令,就要在執行時指定直譯器。
一般指令碼都會在第一行寫上‘#!/bin/bash’,且只能放在第一行,放在其他行就作註釋處理,則需要用使用第一種方法。但是在Linux系統預設是bash,所以無需指定也可以,但是在其他系統就不行了。
(6)source xxx.sh
source和.命令是Shell的內建命令,這種方式也不會建立子Shell,直接在當前的shell中執行,並且呼叫系統預設的shell去執行指令碼,不管指令碼中是不是指定shell命令解析器。
source和.命令不啟動子shell,所以會直接執行子shell裡的語句,並把變數傳給父shell。指令碼里面所有新建、改變變數的語句都會儲存在當前shell裡面。
相關文章
- LINUX Shell指令碼程式設計例項詳解(一)上Linux指令碼程式設計
- Shell指令碼程式設計規範與變數(shell指令碼必須要知道的規矩!)指令碼程式設計變數
- shell指令碼程式設計學習筆記——變數指令碼程式設計筆記變數
- Shell程式設計-shell變數1程式設計變數
- 【學習】Linux Shell指令碼程式設計Linux指令碼程式設計
- Shell程式設計-04-Shell中變數數值計算程式設計變數
- Shell程式設計-02-Shell變數程式設計變數
- Linux Shell指令碼程式設計-基礎1Linux指令碼程式設計
- Shell變數型別有哪些?linux運維shell程式設計變數型別Linux運維程式設計
- Shell 指令碼程式設計陷阱指令碼程式設計
- Linux Shell指令碼程式設計while語句案例Linux指令碼程式設計While
- shell指令碼中的變數及應用指令碼變數
- shell程式設計學習筆記(二):Shell中變數的使用程式設計筆記變數
- shell程式設計–bash變數程式設計變數
- linux shell指令碼中 =~ 的作用Linux指令碼
- Shell程式設計-01-Shell指令碼初步入門程式設計指令碼
- 【Linux】什麼是shell指令碼?shell變數分為哪幾類?Linux指令碼變數
- shell指令碼程式設計筆記指令碼程式設計筆記
- 7.shell指令碼程式設計指令碼程式設計
- Linux之19——Shell程式設計基礎詳解Linux程式設計
- shell高效程式設計:shell指令碼從未如此美麗程式設計指令碼
- Linux Shell指令碼Linux指令碼
- Shell程式設計-shell變數2-位置變數和預定義變數程式設計變數
- shell指令碼中/dev/null 2>&1詳解指令碼devNull
- linux常用的shell指令碼Linux指令碼
- Linux Shell變數Linux變數
- Shell程式設計規範與變數程式設計變數
- shell程式設計–bash變數介紹程式設計變數
- Linux命令列與shell指令碼程式設計入門經驗Linux命令列指令碼程式設計
- Linux_day06_01_Shell指令碼程式設計_Bash基礎Linux指令碼程式設計
- 什麼是Shell指令碼?Shell指令碼在Linux運維工作中的地位!指令碼Linux運維
- Shell指令碼基本編輯規範及變數(詳細)指令碼變數
- [轉]Shell向Perl指令碼中傳遞變數的方法指令碼變數
- Linux shell:執行shell指令碼的幾種方式Linux指令碼
- Linux之shell程式設計Linux程式設計
- Linux Shell程式設計(1)Linux程式設計
- Linux Shell程式設計(2)Linux程式設計
- Shell指令碼——Linux系統中的時間猜數字指令碼Linux