1. 程式人生 > >linux之bash指令碼特殊字元

linux之bash指令碼特殊字元

在這裡插入圖片描述

在括號中的命令列表,將會作為一個子 shell 來執行。

在括號中的變數,由於是在子shell中,所以對於指令碼剩下的部分是不可用的。父程序,也就是指令碼本身,將不能夠讀取在子程序中建立的變數,也就是在子shell 中建立的變數

1.括號

#!/bin/bash

a=123
( a=321; )

echo "$a" #a的值為123而不是321,因為括號將判斷為區域性變數
輸出 123

大括號({})
2.陣列

建立陣列

#!/bin/bash
array={1 4 5 7 9 14}
echo ${array[3]}

輸出 7

3.副檔名
複製 t.txt 的內容到 t.back 中

#!/bin/bash
if [ ! -w 't.txt' ]
then touch t.txt
fi
echo ' test test ' >> t.txt
cp t.{txt,back}

4.程式碼塊
程式碼塊,又被稱為內部組,這個結構事實上建立了一個匿名函式(一個沒有名字的函式)。然而,與“標準”函式不同的是,在其中宣告的變數,對於指令碼其他部分的程式碼來說還是可見的

#!/bin/bash
a=123
{ a=321; }
echo "a=$a"

輸出 a =321

中括號([])
1.條件測試
條件測試表達式放在[ ]中。下列練習中的-lt (less than)表示小於號

#!/bin/bash
a=5
if [ 5 -lt 10 ]
then echo "a=$a"
else 
 echo 'a > 10'
fi

輸出 a=5

2.陣列元素
在一個array結構的上下文中,中括號用來引用陣列中每個元素的編號

#!/bin/bash
array=(1 4 5 6)
echo ${array[0]}

輸出 1

尖括號(<>)
重定向
test.sh > filename:重定向test.sh的輸出到檔案 filename 中。如果 filename 存在的話,那麼將會被覆蓋。

test.sh &> filename:重定向

test.sh 的 stdout(標準輸出)和 stderr(標準錯誤)到 filename 中。

test.sh >&2:重定向 test.sh 的 stdout 到 stderr 中。

test.sh >> filename:把 test.sh 的輸出追加到檔案 filename 中。如果filename 不存在的話,將會被建立。

豎線(|)

分析前邊命令的輸出,並將輸出作為後邊命令的輸入。這是一種產生命令鏈的好方法。

#!/bin/bash

tr 'a-z' 'A-Z'
exit 0

現在讓我們輸送ls -l的輸出到一個指令碼中:

$ chmod 755 test26.sh
$ ls -l | ./test26.sh

輸出的內容均變為了大寫字母
在這裡插入圖片描述

破折號(-)
1.選項,字首
在所有的命令內如果想使用選項引數的話,前邊都要加上“-”。

#!/bin/bash

a=5
b=5
if [ "$a" -eq "$b" ]
then
    echo "a is equal to b."
fi

輸出 a is equal to b

2.用於重定向stdin或stdout

下面指令碼用於備份最後24小時當前目錄下所有修改的檔案

#!/bin/bash

BACKUPFILE=backup-$(date +%m-%d-%Y)
# 在備份檔案中嵌入時間.
archive=${1:-$BACKUPFILE}
#  如果在命令列中沒有指定備份檔案的檔名,
#  那麼將預設使用"backup-MM-DD-YYYY.tar.gz".

tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
gzip $archive.tar
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."

exit 0

破浪號~
表示home目錄