Bash Shell指令碼高階

2021-08-17 12:36:54 字數 2891 閱讀 3944

shell指令碼中會有一些命令列中不常用的命令,但是在指令碼中卻非常有用的命令。還有在指令碼中有一些常用的功能,有的是自己專案中見到的,有的是網上搜到的,慢慢積累。

echo -n "please enter a count:"

#加-n表示輸出不換行

mkdir -p /home/user/ #一次建立多個目錄

用於設定shell特性引數的,通過它可以改變shell執行時的一些特性。

set -x #在指令碼執行時先輸出指令碼的內容

set -u #遇到未定義的變數時,顯示錯誤

parent_dir=$(dirname $(readlink -f

$0)) #獲取當前指令碼所在目錄

me=`basename $0` #獲取當前指令碼的名字

current_user=$(id -un) #獲取當前使用者名稱

輸出各種標誌性資訊特別有用。

function echo_green

()

"}

echo -ne "$$

$"

} echo_green "a green message"

其中,32m表示綠色, 31m表示紅色,34m表示藍色,33m表示黃色。

使用shift命令,這個命令的作用是位置引數左移,shift 1就會是$2變為$1,因此可以一直左移來持續判斷$1的方式來處理命令列引數,這樣引數誰先誰後就沒什麼影響了。

while [ $#

-gt0 ]; do

case

$1in

'--option_a' )

# todo 處理--option_a相關的引數

# 1)如果--option_a是乙個布林型的引數,那麼,直接設定相關的變數,然後shift 1以便處理後面的引數

# 2)如果--option_a後面需要跟上乙個輸入值,那麼$2就是相應的輸入值,拿到$2後shift 2以便處理後面的引數。

'--enable_logging')

enable_logging=1

shift 1

;; #注意:這裡必須是兩個分號

'--file')

file=$2;

shift

;;

'help' | '-h' | '--help')

printhelpandexit

;;

*)

info "invalid operation $1";

printhelpandexit;;

esac

done

#去掉字首

path="target/doc.txt"

echo

$#去掉字尾得到檔名

file=foo.tar.gz

echo

$

starttime=$(date +%s)  

# some time consuming command

endtime=$(date +%s)

timediff=$(( $endtime - $starttime ))

timediff中國儲存了兩個時間差,以秒為單位。

我們常會有需要在幾個主機間操作的需求,比如在本地主機登入到另外乙個主機然後執行一些命令。而我們一般般是使用ssh命令,但是在指令碼中自動執行我們還是會遇到一些問題,比如怎麼輸入密碼,當然在第一次輸入密碼後我們可以把公鑰加入到遠端主機的信任列表來免密碼登入。而輸入密碼我們會使用到expect,如果沒有安裝就需要先安裝。

#!/bin/bash

#將本機加入指定遠端主機的信任列表

username="abc"

ipaddress="192.168.0.22"

password="abc123"

ssh_dir="$/.ssh"

#在指定檔案生成公私鑰

if [ ! -f

$/id_rsa.pub ]; then

ssh-keygen -t rsa -f

$/id_rsa -q -n ""

echo

"create $/id_rsa.pub"

fi#將以.pub結尾的公鑰複製到伺服器的~/.ssh/authorized_keys列表中

expect -c "

set timeout -1

spawn ssh-copy-id -i $/id_rsa.pub -o stricthostkeychecking=no -o userknownhostsfile=/dev/null $@$

expect

}"

在上面指令碼執行後,執行ssh就不需要密碼了,而通過ssh就可以在遠端主機上執行一些命令了。

#簡單執行幾個命令,可以通過將命令寫在雙引號裡面。

ssh user@remotenode "cd /home ; ls"

#比較多的時候可以寫成乙個指令碼

ssh user@remotenode -o stricthostkeychecking=no -o userknownhostsfile=/dev/null < test.sh

其實以上的功能有一些工具可以實現了,比如python的一些庫,所以當指令碼比較複雜時,可以考慮使用python這種比較高階的語言以及它豐富的庫,避免重複造輪子。

幾個bash shell指令碼

今天剛學習linux shell程式設計,隨便寫幾個短小的指令碼練練語法,寫了這個才發現,一些命令及引數還是要記住的 例1.這是乙個數 算1 2 3 4 5 bin bash let s 0 p 1 let 表示數 算 while test p le 5 do test命令用於檢查某個條件是否成立,...

BASH SHELL指令碼語法說明

shift shift 1 命令每執行一次,變數的個數 減一 之前的 1變數被銷毀,之後的 2就變成了 1 而變數值提前一位。同理,shift n後,前n位引數都會被銷毀.bin sh arch 1 shift arch2 1 shift echo shell指令碼本身的名字 0 echo 傳給sh...

bash shell指令碼執行方法總結

bash shell 指令碼的方法有多種,現在作個小結。假設我們編寫好的shell指令碼的檔名為hello.sh,檔案位置在 data shell目錄中並已有執行許可權。方法一 切換到shell指令碼所在的目錄 此時,稱為工作目錄 執行shell指令碼 cd data shell hello sh....