1. 程式人生 > >Shell筆記系列二

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指令碼攻略》