亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

LINUX下Bash-Script的用法

發布時間:2021-08-26 16:39:39 來源:億速云 閱讀:150 作者:chen 欄目:云計算

本篇內容介紹了“LINUX下Bash-Script的用法”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

第一個Bash-Script

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

#! /bin/sh

echo 'hello world!'

這就是一個最簡單的shell腳本了。 第一行的#!用來告訴系統,這個腳本用什么解釋器來執行(說明:sh和bash本身是不同的Shell,但是在我目前用得CentOS7版本sh和bash是等價的,sh是一個指向bash的符號鏈接)。 echo命令輸出文本到屏幕

如何運行腳本

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

sh test.sh

第二種方式就是授予文件可執行權限

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

執行腳本
./test.sh
變量與參數
變量

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

# 當需要連接兩個變量
your_id=${USER}-on-${HOSTNAME}

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

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

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

當想刪除一個變量的時候直接使用unset var_name即可,注意這個命令不能刪除只讀變量。

參數

那么如何向一個腳本傳遞參數呢? 當我們想向一個腳本傳遞參數的時候,直接在執行腳本的命令后面跟參數即可:

sh ./test.sh parm1 parm2 parm3

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

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

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

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`的輸出來重置位置參數"
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
數組

目前只支持一維數組!!!!!!!!!! 可以通過以下兩種方式來為數組賦值:

#!/bin/bash

my_array=(A B C "D")

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

通過${my_array[idx]}來讀取數組中的值,也可以通過${my_array[*]}${my_array[@]}來一次性讀取數組中的所有元素。通過${#my_array[*]}${#my_array[@]}來獲取數組長度。

#!/bin/bash

my_array=(A B C "D")

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

echo "第一個元素:${my_array[0]}"
echo "通過*來獲取數組所有元素:${my_array[*]}"
echo "通過@來獲取數組所有元素:${my_array[@]}"
echo "通過*來獲取數組長度:${#my_array[*]}"
echo "通過@來獲取數組長度:${#my_array[@]}"


output:
[root@localhost study]# sh test_arr.sh 
第一個元素:A
通過*來獲取數組所有元素:A B C D F G123
通過@來獲取數組所有元素:A B C D F G123
通過*來獲取數組長度:6
通過@來獲取數組長度:6
關于引號
反引號

反引號括起來的字符串被bash解釋為命令行執行,并以它的輸出結果取代整個反引號部分。

#! /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
單引號

單引號擴起來的字符都視作普通字符,所有特殊字符都會失去原油的意義。

#! /bin/sh

str='${PATH}'

echo ${str}


output:
[root@localhost study]# sh qut.sh 
${PATH}
雙引號

由雙引號括起來的字符,除$、\、’、和”這幾個字符仍是特殊字符并保留其特殊功能外,其余字符作為普通字符對待。

while與for
for循環

for循環的一般格式為

for var in [list]
do
  commonds
done

下面來看個例子:

#!/bin/bash

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

echo;echo

# 會將引號內的內容當做一個元素
for var in "A A" "B B B" "C C"
do
  echo "${var}"
done

echo;echo

# 上面兩種寫法有點類似java的for-each

# 如果你用過C,那么你對下面這種寫法更熟悉
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循環

while循環的一般格式為

while [ condition ]
do 
 commands
done

Example:

#!/bin/bash

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

break用來跳出整個循環,continue跳出本次循環。

算術運算

首先來看個例子:

#! /bin/bash

b=1+2

echo "${b}"

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

默認情況下,bash中會把所有的賦值當做字符或字符串,所以看到的輸出是1+2而不是3。 可以用以下三種方式來做算術運算。

#! /bin/bash

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

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

# 3、利用雙括號將表達式括起來
((d=2+3))
echo "((表達式)):$aegqsqibtmh"

echo;echo

# 4、利用單個方括號
echo "[表達式]:$[1+2]"

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


let:2


((表達式)):5


[表達式]:3
test命令

首先需要注意的是在Linux中“0”表示成功。test命令用來檢查某個條件是否成立,它可以進行數值、字符和文件三個方面的測試。

  • 直接使用test這個命令


  • [...]:繼承自test命令,主要用來方便其他語言的程序員。

  • ((...)): 返回其中表達式的計算結果

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
數字測試

數值測試操作符:

  • -eq 或 == : 是否相等

  • -ne 或 != : 不等于

  • -gt 或 > : 大于

  • -lt 或 < : 小于

  • -ge 或 >= : 大于等于

  • -le 或 <= : 小于等于 注意:或選項的用法其實就是講數字當做字符串來比較

Example:

#! /bin/sh

a=4
b=5

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

echo

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

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

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

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

  • : 大于,根據ASCII的排序

  • -z : 字符串是否為空,或長度為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
文件測試

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

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

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

  • -d : 是否是目錄

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

  • -r : 是否對文件有讀權限

  • -w : 是否對文件有寫權限

  • -x : 是否對文件有執行權限

  • -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語句的一般格式:

if condition
then
  commonds
fi

if-else語句的格式

if condition1
then
  commonds
elif condition2
then
  commonds
else
  commonds
fi

case語句的一般格式:

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

在case語句中可以用*號來匹配任意值。

函數

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

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

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

Example:

#! /bin/sh

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

fun

向函數傳遞參數的形式類似執行腳本的傳參: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
讀取鍵盤的輸入

可以通過read命令來讀取標準輸入的值。下面用一個例子來看下在bash中read的常用方式:

#! /bin/sh

# 將讀取到的值賦值給var1這個變量,當我們在行尾加\時,按回車會換到下一行繼續輸入
read var1
echo "var1 is ${var1}"

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

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

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

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

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

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

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

# 有時候可能不希望一直等待用戶輸入,我們可以用-t選項來這只超時時間
TIMELIMIT=5
read -t $TIMELIMIT var3

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

下面是測試的輸出

[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
字符串

在大多數編程語言中,字符串是非常重要、常用的數據類型。 1、字符串長度

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

Example:

#! /bin/sh

str1="fdhjksdf"

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

2、匹配子串長度

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位置開始截取長度為length長的子串,postition的開始索引為0 expr substr $string $position $length從position位置開始截取長度為length長的子串,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},從前面最長匹配刪除 ${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}從前面最長匹配替換 ${string/#substring/replacement}從后面最小匹配替換 ${string/%substring/replacement}從后面最長匹配替換

Debug your Script

在bash中提供了相關的參數供我們進行腳本的調試追蹤。

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

“LINUX下Bash-Script的用法”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丁青县| 绍兴县| 七台河市| 灌南县| 太谷县| 灵石县| 四子王旗| 绍兴县| 广宗县| 新龙县| 连城县| 丰原市| 和平县| 高清| 韶关市| 新竹市| 汤阴县| 象州县| 宝坻区| 义马市| 晴隆县| 留坝县| 临沧市| 洛扎县| 云浮市| 南丰县| 河池市| 太仓市| 大同县| 通海县| 株洲市| 清水河县| 布尔津县| 宁陕县| 上虞市| 玛多县| 利川市| 抚松县| 九龙坡区| 津南区| 松溪县|