LINUX下Bash-Script的用法

本篇內(nèi)容介紹了“LINUX下Bash-Script的用法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)沙洋,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):18982081108

第一個(gè)Bash-Script

LINUX shell的種類非常之多,但是目前用得最為廣泛的還是Bash,本文也是基于Bash的Shell環(huán)境。 下面是一個(gè)簡(jiǎn)單的示例:

#! /bin/sh

echo 'hello world!'

這就是一個(gè)最簡(jiǎn)單的shell腳本了。 第一行的#!用來(lái)告訴系統(tǒng),這個(gè)腳本用什么解釋器來(lái)執(zhí)行(說(shuō)明:sh和bash本身是不同的Shell,但是在我目前用得CentOS7版本sh和bash是等價(jià)的,sh是一個(gè)指向bash的符號(hào)鏈接)。 echo命令輸出文本到屏幕

如何運(yùn)行腳本

一種方式就是將腳本作為解釋器的參數(shù),如:

sh test.sh

第二種方式就是授予文件可執(zhí)行權(quán)限

chmod +x test.sh
或者
chmod 755 test.sh

執(zhí)行腳本
./test.sh
變量與參數(shù)
變量

Bash是一種弱類型的語(yǔ)言,你只需要直接定義變量名=value即可。當(dāng)需要引用這個(gè)變量的時(shí)候使用$var_name或者${var_name}即可。 $var_name${var_name}的一種簡(jiǎn)寫形式,但是在某些情況下只能使用${var_name},例如:

# 當(dāng)需要連接兩個(gè)變量
your_id=${USER}-on-${HOSTNAME}

# 或者會(huì)與其他字符串寫在一起的時(shí)候
echo '${num}instance running!'

所以建議在寫shell的時(shí)候統(tǒng)一使用${var_name}的風(fēng)格。 bash中變量是弱類型的,那么不管你傳給他的是字符串、數(shù)字或者數(shù)組他都統(tǒng)統(tǒng)會(huì)接收,有時(shí)候這就會(huì)導(dǎo)致一些問題,比如你想做個(gè)計(jì)算器,這時(shí)候傳給了變量一個(gè)'ABCDEFG',那么這時(shí)候我們就想這個(gè)變量只能接收數(shù)字。又或者你想定義一個(gè)常量,不想用戶修改。那么以上這些我們可以使用declare來(lái)聲明變量的一些屬性。 declare常用參數(shù)如下:

-r 定義一個(gè)只讀變量,也可以使用"readonly var_name"將變量定義為只讀變量 -i 定義變量類型為整型 -a 定義變量類型為數(shù)組 -f 定義一個(gè)函數(shù) -x 定義一個(gè)全局變量

當(dāng)想刪除一個(gè)變量的時(shí)候直接使用unset var_name即可,注意這個(gè)命令不能刪除只讀變量。

參數(shù)

那么如何向一個(gè)腳本傳遞參數(shù)呢? 當(dāng)我們想向一個(gè)腳本傳遞參數(shù)的時(shí)候,直接在執(zhí)行腳本的命令后面跟參數(shù)即可:

sh ./test.sh parm1 parm2 parm3

在腳本中使用$n(n是一個(gè)數(shù)字,如:$1獲取第一個(gè)參數(shù))來(lái)接收傳入的參數(shù)即可。下面是可能經(jīng)常用到的參數(shù)變量:

$0 當(dāng)前腳本的文件名。 $n 傳遞給腳本或函數(shù)的參數(shù)。n是一個(gè)數(shù)字。例如,第一個(gè)參數(shù)是 $1 。 $# 傳遞給腳本或函數(shù)的參數(shù)個(gè)數(shù)。 $* 傳遞給腳本或函數(shù)的所有參數(shù)。 $@ 傳遞給腳本或函數(shù)的所有參數(shù)。被雙引號(hào) (" ")包含時(shí)與$*不同。 $? 上個(gè)命令的退出狀態(tài),或函數(shù)的返回值。 $_ 上一個(gè)命令的最后一個(gè)參數(shù)

我們經(jīng)常用到的Linux命令中有一種叫option的東西,基本模式-optionname或者--longoptionname。如果在我們編寫腳本的時(shí)候需要option的話,簡(jiǎn)單的腳本直接把他當(dāng)普通參數(shù)手工處理即可,面對(duì)比較復(fù)雜的可以使用getopt或者getopt。 這里感覺有必要提一下set這個(gè)命令,我覺得很牛逼、很厲害、很有用但是我從來(lái)沒在腳本中使用過(guò)的命令。 set命令用來(lái)改變內(nèi)部腳本的變量或者選項(xiàng)。一種應(yīng)用就是來(lái)改變options來(lái)影響腳本的行為。另一種應(yīng)用就是利用set `commond` 的輸出來(lái)重置位置參數(shù)。

Example

#!/bin/bash

echo "Command-line argument #1 = $1"
echo "Command-line argument #2 = $2"
echo "Command-line argument #3 = $3"


echo "--------------------------------------"
echo "利用`uname -a`的輸出來(lái)重置位置參數(shù)"
set `uname -a`

echo "Field #1 of 'uname -a' = $1"
echo "Field #2 of 'uname -a' = $2"
echo "Field #3 of 'uname -a' = $3"

exit 0



output:
[root@localhost study]# sh test_set.sh one two three
Command-line argument #1 = one
Command-line argument #2 = two
Command-line argument #3 = three
--------------------------------------
Sets the positional parameters to the output of the commond `uname -a`
Field #1 of 'uname -a' = Linux
Field #2 of 'uname -a' = localhost.localdomain
Field #3 of 'uname -a' = 3.10.0-514.el7.x86_64
數(shù)組

目前只支持一維數(shù)組?。。。。。。。。?! 可以通過(guò)以下兩種方式來(lái)為數(shù)組賦值:

#!/bin/bash

my_array=(A B C "D")

my_array[4]=F
my_array[5]="G"

通過(guò)${my_array[idx]}來(lái)讀取數(shù)組中的值,也可以通過(guò)${my_array[*]}${my_array[@]}來(lái)一次性讀取數(shù)組中的所有元素。通過(guò)${#my_array[*]}${#my_array[@]}來(lái)獲取數(shù)組長(zhǎng)度。

#!/bin/bash

my_array=(A B C "D")

my_array[4]=F
my_array[5]="G123"

echo "第一個(gè)元素:${my_array[0]}"
echo "通過(guò)*來(lái)獲取數(shù)組所有元素:${my_array[*]}"
echo "通過(guò)@來(lái)獲取數(shù)組所有元素:${my_array[@]}"
echo "通過(guò)*來(lái)獲取數(shù)組長(zhǎng)度:${#my_array[*]}"
echo "通過(guò)@來(lái)獲取數(shù)組長(zhǎng)度:${#my_array[@]}"


output:
[root@localhost study]# sh test_arr.sh 
第一個(gè)元素:A
通過(guò)*來(lái)獲取數(shù)組所有元素:A B C D F G123
通過(guò)@來(lái)獲取數(shù)組所有元素:A B C D F G123
通過(guò)*來(lái)獲取數(shù)組長(zhǎng)度:6
通過(guò)@來(lái)獲取數(shù)組長(zhǎng)度:6
關(guān)于引號(hào)
反引號(hào)

反引號(hào)括起來(lái)的字符串被bash解釋為命令行執(zhí)行,并以它的輸出結(jié)果取代整個(gè)反引號(hào)部分。

#! /bin/sh

str=`echo $PATH`

echo ${str}


output:
[root@localhost study]# sh qut.sh 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
單引號(hào)

單引號(hào)擴(kuò)起來(lái)的字符都視作普通字符,所有特殊字符都會(huì)失去原油的意義。

#! /bin/sh

str='${PATH}'

echo ${str}


output:
[root@localhost study]# sh qut.sh 
${PATH}
雙引號(hào)

由雙引號(hào)括起來(lái)的字符,除$、\、’、和”這幾個(gè)字符仍是特殊字符并保留其特殊功能外,其余字符作為普通字符對(duì)待。

while與for
for循環(huán)

for循環(huán)的一般格式為

for var in [list]
do
  commonds
done

下面來(lái)看個(gè)例子:

#!/bin/bash

# 如果后面的list不加引號(hào),則默認(rèn)以空格分割
for var in A B C D
do
  echo "${var}"
done

echo;echo

# 會(huì)將引號(hào)內(nèi)的內(nèi)容當(dāng)做一個(gè)元素
for var in "A A" "B B B" "C C"
do
  echo "${var}"
done

echo;echo

# 上面兩種寫法有點(diǎn)類似java的for-each

# 如果你用過(guò)C,那么你對(duì)下面這種寫法更熟悉
for ((a=1, b=1; a <= 5 ; a++, b++))
do
  echo -n "$a-$b "
done



output:
[root@localhost study]# sh for-loop.sh 
A
B
C
D


A A
B B B
C C


1-1 2-2 3-3 4-4 5-5
while循環(huán)

while循環(huán)的一般格式為

while [ condition ]
do 
 commands
done

Example:

#!/bin/bash

while (( a <= 5 ))
do                       
  echo -n "$a "
  let "a+=1"
done
break與continue

break用來(lái)跳出整個(gè)循環(huán),continue跳出本次循環(huán)。

算術(shù)運(yùn)算

首先來(lái)看個(gè)例子:

#! /bin/bash

b=1+2

echo "$"

output:
[root@localhost study]# sh test.sh 
1+2

默認(rèn)情況下,bash中會(huì)把所有的賦值當(dāng)做字符或字符串,所以看到的輸出是1+2而不是3。 可以用以下三種方式來(lái)做算術(shù)運(yùn)算。

#! /bin/bash

# 1、使用`declare`來(lái)聲明變量為整型。
declare -i b
b=1+2

echo "declare:$"
echo;echo
# 2、let命令
let "c=1+1"
echo "let:${c}"
echo;echo

# 3、利用雙括號(hào)將表達(dá)式括起來(lái)
((d=2+3))
echo "((表達(dá)式)):$cdofm4k"

echo;echo

# 4、利用單個(gè)方括號(hào)
echo "[表達(dá)式]:$[1+2]"

output:
[root@localhost study]# sh test.sh 
declare:3


let:2


((表達(dá)式)):5


[表達(dá)式]:3
test命令

首先需要注意的是在Linux中“0”表示成功。test命令用來(lái)檢查某個(gè)條件是否成立,它可以進(jìn)行數(shù)值、字符和文件三個(gè)方面的測(cè)試。

  • 直接使用test這個(gè)命令

  • [...]:繼承自test命令,主要用來(lái)方便其他語(yǔ)言的程序員。

  • ((...)): 返回其中表達(dá)式的計(jì)算結(jié)果

Example:

[root@localhost ~]# test 1 -lt 2
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ 1 -lt 2 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ 2 -eq 2 ]]
[root@localhost ~]# echo $?
0
[root@localhost ~]# (( 2 == 2 ))
[root@localhost ~]# echo $?
0
數(shù)字測(cè)試

數(shù)值測(cè)試操作符:

  • -eq 或 == : 是否相等

  • -ne 或 != : 不等于

  • -gt 或 > : 大于

  • -lt 或 < : 小于

  • -ge 或 >= : 大于等于

  • -le 或 <= : 小于等于 注意:或選項(xiàng)的用法其實(shí)就是講數(shù)字當(dāng)做字符串來(lái)比較

Example:

#! /bin/sh

a=4
b=5

if [ ${a} -ne $ ]
then
  echo "${a} is not equal to $
fi

echo

if [ ${a} != $ ]
then
  echo "${a} is not equal to $."
fi
字符串測(cè)試
  • = : 判斷兩個(gè)字符串是否相等。if [ "$a" = "$b" ]

  • == : 判斷兩個(gè)字符串是否相等,=的一個(gè)同義詞

  • != : 判斷字符串是否不等

  • < : 小于,根據(jù)ASCII的排序,注意在[ a < b ]需要轉(zhuǎn)義,在[[ a < b ]]可以直接使用,>同理

  • : 大于,根據(jù)ASCII的排序

  • -z : 字符串是否為空,或長(zhǎng)度為0

  • -n : 字符串是否非空

Example:

#! /bin/sh

str1=""
if [ -z ${str1} ]
then
 echo "str1 is null"
fi

echo 
str1="abc"
if [ -n ${str1} ]
then
 echo "str1 is not null"
fi

echo

str2="cdef"

if [ "${str1}" != "${str2}" ]
then
 echo "${str1} is not equal to ${str2}"
fi
文件測(cè)試

下面列舉一些常用的文件操作:

  • -e : 文件或目錄是否存在

  • -f : 是否是一個(gè)文件(而非目錄)

  • -d : 是否是目錄

  • -s : 文件大小是否為0

  • -r : 是否對(duì)文件有讀權(quán)限

  • -w : 是否對(duì)文件有寫權(quán)限

  • -x : 是否對(duì)文件有執(zhí)行權(quán)限

  • -O : 是否是文件所有者

  • -G :是否與文件組用戶相同

Example:

#! /bin/sh

filename="/study/bash/test_file.txt" 

if [ -e "${filename}" ]
then
  echo "${filename} file exists."
fi

if [ -f "${filename}" ]
then
  echo "${filename} is a regular file."
fi

if [ -s "${filename}" ]
then
  echo "${filename} not a zero file."
fi
if & case

if語(yǔ)句的一般格式:

if condition
then
  commonds
fi

if-else語(yǔ)句的格式

if condition1
then
  commonds
elif condition2
then
  commonds
else
  commonds
fi

case語(yǔ)句的一般格式:

case 值 in
模式1)
    commonds
    ;;
模式2)
    commonds
    ;;
esac

在case語(yǔ)句中可以用*號(hào)來(lái)匹配任意值。

函數(shù)

平時(shí)在一些簡(jiǎn)單的腳本里面基本用不到函數(shù),但是在復(fù)雜的腳本中用來(lái)組織代碼以及封裝常用邏輯,在bash中還是很好用的東西。 函數(shù)的定義格式如下:

[ function ] funname [()]{
    action;
    [return ${result};]
}

1、我們可以function funname方式來(lái)定義,也可以直接funname()。 2、可以顯示的加return來(lái)返回結(jié)果或者直接返回最后一條命令的執(zhí)行結(jié)果。

Example:

#! /bin/sh

fun(){
  echo "it's a function"
}

fun

向函數(shù)傳遞參數(shù)的形式類似執(zhí)行腳本的傳參:fun_name arg1 arg2 Example:

#! /bin/sh

fun(){
  if [ ${1} -gt ${2} ]
  then
    echo "${1} bigger than ${2}."
  elif [ ${2} -gt ${1} ]
  then
    echo "${2} bigger than ${1}."
  else
    echo "${1} equal to ${2}."
  fi
}

fun 10 20
讀取鍵盤的輸入

可以通過(guò)read命令來(lái)讀取標(biāo)準(zhǔn)輸入的值。下面用一個(gè)例子來(lái)看下在bash中read的常用方式:

#! /bin/sh

# 將讀取到的值賦值給var1這個(gè)變量,當(dāng)我們?cè)谛形布覾時(shí),按回車會(huì)換到下一行繼續(xù)輸入
read var1
echo "var1 is ${var1}"

echo "==============================="

# 直接read,可以使用$REPLY來(lái)獲取讀取到的值
read
echo "read $REPLY"

echo "==============================="

# -r參數(shù)會(huì)按字符串解釋\,而不會(huì)換行
read -r mul_line
echo "mul_line:${mul_line}"

echo "==============================="

# 上面的方式都會(huì)在屏幕上打印輸入值,在交互式的bash中是不友好的,我們可以加-s選項(xiàng)來(lái)屏蔽輸入的打印
read -s var2
echo "dont echo input:${var2}"

echo "==============================="

# 有時(shí)候可能不希望一直等待用戶輸入,我們可以用-t選項(xiàng)來(lái)這只超時(shí)時(shí)間
TIMELIMIT=5
read -t $TIMELIMIT var3

if [ -z ${var3}]
then
  var3="time out"
fi
echo "timed read:${var3}"

下面是測(cè)試的輸出

[root@localhost study]# sh read_test.sh 
read value to var2\
new line
var1 is read value to var2new line
===============================
read had no var
read read had no var
===============================
read with -r option\
mul_line:read with -r option\
===============================
dont echo input:do not echo input
===============================
timed read:time out
字符串

在大多數(shù)編程語(yǔ)言中,字符串是非常重要、常用的數(shù)據(jù)類型。 1、字符串長(zhǎng)度

${#string} expr length $string expr "$string" : '.*'

Example:

#! /bin/sh

str1="fdhjksdf"

echo "${#str1}"
echo "`expr length ${str1}`"
echo "`expr "${str1}" : '.*'`"

2、匹配子串長(zhǎng)度

expr match "$string" '$substr_regxp' expr "$string" : '$substr_regxp'

Example:

#!/bin/sh

str1="str;str-str;strend"


sub_regxp="[a-z]*;"

echo "`expr match "${str1}" "${sub_regxp}"`"
echo "`expr "${str1}" : "${sub_regxp}"`"

3、子串開始索引

expr index $string $substring

Example

#! /bin/sh


str="abc;efg;higj"
rgx_str=";.*;"

echo "`expr index ${str} ${rgx_str}`"

4、字符串截取

${string:position}截取從postition位置開始的字符串 ${string:position:length}從position位置開始截取長(zhǎng)度為length長(zhǎng)的子串,postition的開始索引為0 expr substr $string $position $length從position位置開始截取長(zhǎng)度為length長(zhǎng)的子串,postition的開始索引為1 expr match "$string" '$sub_regxp'截取匹配正則的子串 expr "$string" : '$sub_regxp'截取匹配正則的子串

Example

#! /bin/sh

str="abc;defg;hijk;lmnpq"

echo "\${string:position}"
echo "${str:4}"

echo "==================================="

echo "\${string:position:length}"
echo "${str:4:4}"

echo "==================================="

echo "expr substr \$string \$position \$length"
echo "`expr substr ${str} 5 4`"

echo "==================================="

sub_regxp=".*;\(.*\);"
echo "expr match "\$string" '${sub_regxp}'"
echo "`expr match "${str}" ${sub_regxp}`"

echo "==================================="
echo "expr "\$string" : '\$sub_regxp'"
echo "`expr "${str}" : ${sub_regxp}`"



output:
[root@localhost study]# sh sub_str.sh 
${string:position}
defg;hijk;lmnpq
===================================
${string:position:length}
defg
===================================
expr substr $string $position $length
defg
===================================
expr match $string '.*;\(.*\);'
hijk
===================================
expr $string : '$sub_regxp'
hijk

5、刪除子串

${string#substring},從前面最小匹配刪除 ${string##substring},從前面最長(zhǎng)匹配刪除 ${string%substring},從后面最小匹配刪除 ${string%%substring},從后面最小匹配刪除

Example

#! /bin/sh

str=abcABC123ABCabc

reg_str='a*C'

echo ${str#$reg_str}      # 123ABCabc
echo ${str##$reg_str}     # abc

reg_str='b*c'
echo ${str%$reg_str}      # abcABC123ABCa
echo ${str%%$reg_str}     # a

6、子串替換

${string/substring/replacement}從前面最小匹配替換 ${string//substring/replacement}從前面最長(zhǎng)匹配替換 ${string/#substring/replacement}從后面最小匹配替換 ${string/%substring/replacement}從后面最長(zhǎng)匹配替換

Debug your Script

在bash中提供了相關(guān)的參數(shù)供我們進(jìn)行腳本的調(diào)試追蹤。

sh [-nvx] script.sh 參數(shù): -n:不執(zhí)行基本,只檢查語(yǔ)法問題 -v:執(zhí)行腳本前,先將腳本內(nèi)容輸出到屏幕上 -x:將使用到的內(nèi)容顯示到屏幕上

“LINUX下Bash-Script的用法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)頁(yè)題目:LINUX下Bash-Script的用法
分享鏈接:http://muchs.cn/article14/pioede.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、網(wǎng)站策劃面包屑導(dǎo)航、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站改版域名注冊(cè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站