Shell筆記系列二
read
從鍵盤或標準輸入中讀入文字,可以使用read以互動的形式讀取使用者輸入
⑴從輸入中讀取N個字元並存入變數varibale_name
read - n number_of_chars variable_name;
⑵使用read顯示提示資訊:
read -p "enter input:" var
⑶在給定時間內讀取輸入
read -t timeout var
⑷使用特定的定界符作為輸入行的結束
read -d delim_char var
欄位分隔符和迭代器
內部字元安分隔符(Internal Field Separator,IFS)是shell指令碼程式設計的一個重要的概念,作為分隔符,IFS有其特殊的用途,,它是一個環境變數,其中儲存了用於分隔的字元,它是當前shell環境使用的預設丁姐字串。場景:需要迭代一個字串或逗號分隔型數值(CSV)中的單詞,可以使用IFS=",".IFS的預設值為空白字元;
FIGHTING...cat ifs.sh
#!bin/bash
data="zhao,qian,sun,li,zhou"
oldIFS=$IFS
IFS=,
for item in $data;
do
echo Item:$item
done
IFS=$oldIFS
FIGHTING...bash ifs.sh
Item:zhao
Item:qian
Item:sun
Item:li
Item:zhou
FIGHTING...
迴圈
面向列表的for迴圈:
for var in list;
do
echo $var;
done
迭代指定範圍的數字:
for((i=0;i<10;i++))
{
echo "biubiubiu";
}
while迴圈
while true
do
echo "pipipi"
done
比較和測試
if和if else if else
算術比較:比較條件通常被放置在封閉的中括號內,注意在[和]與運算元之間有一個空格。
[ $var -eq 0 ] : 判斷$var 等於 0 ,返回真
[ $var -nq 0 ] : 判斷$var 不為 0 , 返回真
[ $var -gt 0 ] : 判斷$var 大於 0 , 返回真
-[ $var -lt 0 ] : 判斷$var 小於 0 , 返回真
-ge 大於或等於 -le 小於或等於。
-a邏輯與,-o邏輯或,
[ $var -ne 0 -a $var -gt 2 ]
[ $var -ne 0 -o $var -get 2 ]
與檔案相關:
[ -f $file_var ] : 給定的變數是否包含正常的檔案路徑或檔名,則返回真
[ -x $var ] : 檔案是否可執行, -w 是否可寫 , -r 是否可讀
[ -d $var ] : 檔案是否是目錄,則返回真。-e 是否存在
[ -b $var ] :是否是塊狀檔案, -L 是否是符號連結, -c 是否是字元裝置檔案的路徑。
字元比較:
[[ $str == $str2 ]] :當str 等於str2時,返回真。
[[ $str != $str2 ]] :當str不等於str2時,返回真。
[[ $str > $str2 ]] : 如果str的字母序比str2大,則返回真。
[[ $str < $str2 ]] :如果str的字母序比str2小,則返回真。
[[ -z $str ]] :: 如果str為空串,則返回真
[[ -n $str ]] : 如果str不為空串,則返回真。
cat
cat命令用於顯示或拼接文字的內容。
列印單個檔案的內容:
FIGHTING...cat test.txt
hello world
toady is a fine day.
-name : liudong
列印多個檔案的內容:
FIGHTING...cat LOG.TXT test.txt
THIS IS A GENERATED FILE. DO NOT TO EDIT.
hello world
toady is a fine day.
-name : liudong
將stdin和另一個檔案的資料組合在一起:
FIGHTING...echo "hello " | cat - test.txt
hello
hello world
toady is a fine day.
-name : liudong
去掉多餘的空白行:(注意,不是將空白行去掉,而是將兩個連續的空白行壓縮成一個空白行)
FIGHTING...cat test2.txt
123
456
789
123
456
999
FIGHTING...cat -s test2.txt
123
456
789
123
456
999
在輸出的每一行前面加上行號:
FIGHTING...cat -n test.txt
1 hello world
2 toady is a fine day.
3 -name : liudong
4
查詢
find命令可以沿著檔案層次結構向下遍歷,匹配符合條件的檔案,執行相應的操作,預設的操作時打印出檔案和目錄,可以使用-print選項來指定.
find base_path :base_path可以是任意位置,find會從該位置開始往下查詢。
FIGHTING...find . -print
.
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session
根據檔名或正則表示式進行搜尋
find /home/ld/ -name '*.txt" -print 注意:使用單引號可以使該字串能夠原封不動地傳給find命令。
FIGHTING...find /home/ld/ -name '*.txt' -print
/home/ld/.mozilla/firefox/fvqnd6nl.default/AlternateServices.txt
/home/ld/.mozilla/firefox/fvqnd6nl.default/SecurityPreloadState.txt
/home/ld/.mozilla/firefox/fvqnd6nl.default/SiteSecurityServiceState.txt
/home/ld/.mozilla/firefox/fvqnd6nl.default/revocations.txt
/home/ld/.cache/tracker/db-version.txt
/home/ld/.cache/tracker/db-locale.txt
/home/ld/.cache/tracker/parser-sha1.txt
/home/ld/.cache/tracker/locale-for-miner-user-guides.txt
......
find -a和-and可以執行邏輯與操作,-o和-or可以執行邏輯或操作
FIGHTING...find /home/ld/ \( -name '*te*t'.txt -and -name '*s*' \)
/home/ld/app/hive234/examples/files/dynpart_test.txt
/home/ld/app/hive234/examples/files/escapetest.txt
/home/ld/workspace/test.txt
-path引數可以限制所匹配檔案的路徑以及名稱
使用正則表示式進行匹配
FIGHTING...find . -regex '.*\.\(py\|txt\)$'
./test.txt
./test2.txt
FIGHTING...find . -iregex '.*\.\(py\|txt\)$'
./test.txt
./LOG.TXT
./test2.txt
./TEST.TXT
使用!排除匹配到的模式
FIGHTING...find . ! -name '*.txt' -print
.
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./typescript
./timing.log
./output.session
./TEST.TXT
基於目錄深度的搜尋
預設情況下,find會從指定的搜尋目錄一直往下搜尋,如果碰到指向自身的連結,find命令就會陷入死迴圈中,可以使用-maxdepth和-mindepth選項可以限制find命令遍歷的目錄深度。-L命令可以強制其跟隨符號連結,find命令預設不跟隨符號連結。
FIGHTING...find -L /home/ld -maxdepth 2 -name '*.txt'
/home/ld/workspace/test.txt
/home/ld/workspace/test2.txt
根據檔案型別搜尋
檔案型別引數有:-f 表示檔案 -d 表示目錄 -l 錶鏈接 -c 字元裝置 -b 塊裝置 -s 套接字
FIGHTING...find . -type d
.
FIGHTING...find . -type f
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session
./TEST.TXT
FIGHTING...find . -type l
根據時間戳進行搜尋
Linux系統中的每個檔案有三種時間戳:
訪問時間(-atime):使用者最近一次訪問檔案的時間
修改時間(-mtime):檔案內容最後一次被修改的時間
變化時間(-ctime):檔案元資料最後一次改變的時間。
打印出最近7天內被訪問過的所有檔案
FIGHTING...find . -type f -atime -7 -print
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session
./TEST.TXT
列印恰好在7天前被訪問過的所有檔案
FIGHTING...find . -type f -atime 7 -print
FIGHTING...
打印出訪問時間超過7天的所有檔案
FIGHTING...find . -type f -atime +7 -print
FIGHTING...
-mtime,-ctime同理,-atime,-mtime,-ctime都是以“天”為單位來計時的,find命令還支援以分鐘為計時單位的選項。如-amin,
-mmin,-cmin.
根據檔案大小搜尋:
檔案大小引數有:-b:塊(512位元組) -c: 位元組 -w:字(2位元組) -k:千位元組(1024k) -M:兆位元組(1024k) -G:吉位元組(2014M)
FIGHTING...find . ls -al
total 19556
drwxrwxr-x. 2 ld ld 200 Dec 8 21:24 .
drwx------. 20 ld ld 4096 Dec 8 21:24 ..
-rw-rw-r--. 1 ld ld 0 Dec 7 21:36 3
-rw-rw-r--. 1 ld ld 33 Dec 7 01:16 helloworld.sh
-rw-rw-r--. 1 ld ld 137 Dec 7 21:56 iff.sh
-rw-rw-r--. 1 ld ld 269 Dec 7 21:28 ifs.sh
-rw-rw-r--. 1 ld ld 42 Dec 7 07:53 LOG.TXT
-rw-rw-r--. 1 ld ld 8921088 Dec 8 21:56 output.session
-rw-rw-r--. 1 ld ld 205 Dec 7 10:24 std.sh
-rw-rw-r--. 1 ld ld 29 Dec 8 20:54 test2.txt
-rw-rw-r--. 1 ld ld 55 Nov 30 06:05 test.txt
-rw-rw-r--. 1 ld ld 2 Dec 8 21:24 TEST.TXT
-rw-rw-r--. 1 ld ld 65536 Dec 8 21:40 timing.log
-rw-rw-r--. 1 ld ld 8921088 Dec 8 21:56 typescript
FIGHTING...find . find . -type f -size +100k
./typescript
./output.session
FIGHTING...find . find . -type f -size +100M
基於檔案許可權和所有權的匹配
FIGHTING...find . -type f -perm 664 -print
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session
./TEST.TXT
FIGHTING...find . find . -type f -perm 777 -print
FIGHTING...
FIGHTING...find . -type f -user ld -print
./test.txt
./helloworld.sh
./LOG.TXT
./std.sh
./ifs.sh
./3
./iff.sh
./test2.txt
./typescript
./timing.log
./output.session
./TEST.TXT
FIGHTING...find . -type f -user lx -print
find: ‘lx’ is not the name of a known user
......其他的find操作。
參考《Linux Shell指令碼攻略》