shell指令碼學習第一天

來源:互聯網
上載者:User

shell指令碼與Windows/Dos下的批處理相似,也就是用各類命令預先放入到一個檔案中,方便一次性執行的一個程式檔案,主要是方便管理員進行設定或者管理用的。相對於Perl、Python等指令碼語言優勢在於它能處理底層業務,因為有大量Linux命令作為支撐,如“警示業務”,“一鍵安裝”等用shell指令碼寫就會非常簡單。

Linux下的shell指令碼預設為bash ,sh其實是bash的一個連結。

查看預設shell的兩種方法:

>echo $SHELL/bin/bash>grep root /etc/passwdroot:x:0:0:root:/root:/bin/bash
一個簡單的指令碼:

之前在這篇文章中配置橋接的靜態IP的時候是手動操作的,下次換了一個網路又要重新設定,所以寫了個指令碼來自動設定。基於這個指令碼來學習一下簡單的shell指令碼。

#!bin/bashETC_DIR=/etc/sysconfig/network-scriptsNET_DIR=/etc/sysconfigROOT_UID=0if [ "$UID" -ne "$ROOT_UID" ]  #判斷是否為root許可權then   echo "Must be root to run this script"   exit 1ficd $ETC_DIR || {    echo "Cannot change to necessary directory,">&2    exit 1}cat /dev/null  >ifcfg-eth0 && echo "clean ifcfg-eth0 ok!"#寫入eth配置:cat /home/yangni/staticip/myip >ifcfg-eth0 && echo "write eth0 sucessfully"cd $NET_DIR || {    echo "Cannot change to necessary directory,">&2    exit 1}cat /dev/null  >network   #清空network#將預設閘道相關配置寫入networkcat /home/yangni/staticip/mynetwork > network && echo "write network sucessfully"service network restart   #重啟網路命令exit 0
1、UID是一個系統變數,當前是root許可權 UID=0,當前非root許可權UID不等於0


所以我們在這設定了一個變數ROOT_UID=0,來判斷當前是否為root狀態,因為我們對系統的設定檔進行修改必須使用root許可權。所以執行的時候必須加sudo。 2、清空檔案的三種方法:

清空日誌的三種方法:1、echo "">test.log2、echo  >test.log3、cat /dev/null >test.log

在改代碼中我們用的是第三種方法:cat /dev/null >network 3、&&與||的使用:

cat /dev/null  >ifcfg-eth0 && echo "clean ifcfg-eth0 ok!"

這裡&&表示,只有當前面的命令執行成功以後才執行後面的命令。
而 || 則是表示前面執行不成功就執行後面命令。

cd $NET_DIR || {    echo "Cannot change to necessary directory,">&2    exit 1}

所以如果不能夠進入到該目錄下,就列印錯誤資訊。&2表示標準出錯,&0表示表示標準輸入。&1表示標準輸出。 指令碼執行:

指令碼執行時候會先調用環境變數,去找相關變數,有的變數是系統已經定義可直接使用,如上文用到的UID。

cat /etc/profile (全域)cat /etc/profile.d  (全域)可以把變數放在這裡面就可以直接用.bashrc:使用者環境變數
指令碼執行的三種方法: bash或sh + 指令碼名 (檔案無可執行許可權,或者沒指定解譯器) 絕對路徑/指令碼名 (需要可執行許可權)或者./(和第一種方法類似,不過需要可執行許可權) source +指令碼名 或者 . 指令碼名

>bash xxx.sh
>bash >xxx.sh
bash或sh 指定的bash執行指令碼,然後啟動子shell去執行。如果沒有在指令碼第一行指定使用哪一種指令碼命令(`#!/bin/bash,只能放在第一行,放在其他行就作注釋處理),則需要用使用第一種方法。但是在Linux系統預設是bash,所以無需指定也可以,但是在其他系統就不行了。

>source xxx.sh
>. xxx.sh
source或者.命令是Shell的內建命令,這種方式也不會建立子Shell,直接在當前的shell中執行,並且調用系統預設的shell去執行指令碼,不管指令碼中是不是指定shell命令解析器。

所以用 . 和sh運行時就會出現如下現象:

因為 . 不啟動子shell,所以會直接執行子shell裡的語句,並把變數傳給父shell。指令碼裡面所有建立、改變變數的語句都會儲存在當前shell裡面。 執行結果截圖:

如果沒有使用root許可權:

加上sudo之後:

貼上myip和mynetwork兩個檔案:
myip:

DEVICE=eth0HWADDR=00:0C:29:03:4D:EC  #物理地址無需修改BOOTPROTO=staticNM_CONTROLLED=yes        #即時生效,修改後無需要重啟網卡立即生效IPADDR=192.168.0.27BROADCAST=192.168.0.255NETMASK=255.255.255.0GATEWAY=192.168.0.1ONBOOT=yes          #開機啟用網路設定。TYPE=EthernetDNS1=8.8.8.8IPV6INIT=noUSERCTL=no

mynetwork:

NETWORKING=yesHOSTNAME=yangniGATEWAY=192.168.0.1    #添加網關地址
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.