shell建立新資料夾

2021-06-21 12:34:34 字數 3878 閱讀 5218

#!/bin/bash

read dir1

for d in $dir1

do mkdir $

cd $

for file in

doecho "cur dir: $, create file: $.c"

touch $.c

done

cd ..

done

echo "create file success!"

awk 'beginend'  ./test.txt

變數替換:

一:簡單賦值和替換

a=bcd

$ echo $a  

bcd$ echo $

bcd二:變數擴充

除了shell中的meta,其它的[^a-za-z0-9_]幾乎都可以作單詞邊界。

同sed中關於單詞邊界[^a-za-z0-9_]的描述。

這些功能有時候會在程式中有意想不到的作用!

例如:$ a=bcd

$ echo $.b

bcd.b

$ echo $a.php

bcd.php

$ echo $a%b

bcd%b

$ echo /$a/bc

/bcd/bc

對於shell中的meta字元,則backslash。

$ echo $a\*b

bcd*b

三:變數中的變數

$ a=bcd

$ b=efg

$ c=$a$b

$ echo $c

bcdefg

$ d=$c.ghi

$ echo $d

bcdefg.ghi

思考:若變數互相巢狀,會怎樣呢?

四:變數的特異功能

到網中人的啦!(ps:重寫真是沒激情啊)

file=/dir1/dir2/dir3/my.file.txt

我們可以用 $ 分別替換獲得不同的值:

$:從變數file的字串左邊開始,刪除字元直到第乙個「/」:dir1/dir2/dir3/my.file.txt

$:從變數file的字串左邊開始,刪除字元直到最後乙個「/」:my.file.txt

$:從變數file的字串左邊開始,刪除字元直到第乙個「.」:file.txt

$:從變數file的字串左邊開始,刪除字元直到最後乙個「.」:txt

其實,在「#」後面,無非就是乙個匹配問題,不限於兩個,你可以放任意個字元,還可以用shell中另外的萬用字元「?」「[…]」「[!…]」,例如:

$ echo $

1/dir2/dir3/my.file.txt

$ echo $

/dir2/dir3/my.file.txt

$ echo $

/dir3/my.file.txt

「#」:相當於最小匹配,遇到乙個最小的符合其後表示式的字串(單個或多個)即中止匹配動作;

「##」:相當於最大匹配,它盡可能的匹配更多的字元。

我們可以拿「*」來說明:  

*  在shell中表示匹配任何符號包括空。當它在只有乙個 # 的變數替換中,受最小匹配的影響,它不會匹配任何可列印字元,只匹配乙個空,也就是什麼也不匹配,你完全可以忽略它的存在;

當在有兩個 ## 的變數替換中,受最大匹配的影響,乙個 * 表示匹配整個字串。

如果想匹配字元「*」時,要在「*」前加乙個「\」,其後的「*」失去萬用字元的功能。

但是還有一種例外情況(請接著看)

例:$ file2=abcd.efgh.ijkl.oopp

$ echo $

$ echo $

想想上面兩個的輸出是什麼?

$ echo $

oopp

$ echo $

空??知道為什麼嗎?因為:「*」匹配任何符號包括空。遇到乙個「#」時,最後乙個「*」就匹配「空」去了。看下面的:

$ echo $

opp$ echo $

opp$ echo $

opp$ echo $

空do you know?

$ echo $file3

*ab*de*cd

看看下面將輸出什麼?

$ echo $       

*de*cd

$ echo $

*ab*de*cd

$ echo $

空$ echo $

*de*cd

$ echo $

ab*de*cd

$ echo $

空$ echo $

b*de*cd

$ echo $

b*de*cd

不知各位有沒有發現,「*」在乙個「#」中時,並不一定代表「空」,它可能代表乙個字元「*」也可能代表其他的什麼字元,如上例的:

「$ echo $」輸出為「b*de*cd」,其實這還是符合最小匹配理論的。這個表示式的意思是:從變數file3的字串左邊開始刪除字元,直到遇到第乙個字元「a」。所以不要和「$ echo $」混淆,雖然兩個結果是一樣,但意思是不一樣的。

再舉幾個例子,相信大家更容易理解這段話:

$ echo $file3

*ab*de*cd*ab*de                     //注意:出現兩個「*ab」

$ echo $

b*de*cd*ab*de                         //刪除字元,直到出現第乙個「a」,「*」為萬用字元

$ echo $

b*de                                           //刪除字元,直到出現第二個「a」,「*」為萬用字元

$ echo $

b*de*cd*ab*de                         //刪除字串「*a」,「*」在「\」表示字元「*」

除了萬用字元「*」比較難理解一點,其他的shell萬用字元就都很容易了。

至於「%」,和「#」不同的地方,就是從變數字串右部開始。

$:從右部開始拿掉字元,直到遇到(從右部數起的)第乙個「/」 :/dir1/dir2/dir3

$:從右部開始拿掉字元,直到遇到(從右部數起的)最後乙個「/」:(空值)

$:從右部開始拿掉字元,直到遇到(從右部數起的)第乙個「.」:/dir1/dir2/dir3/my.file

$:從右部開始拿掉字元,直到遇到(從右部數起的)最後乙個「.」:/dir1/dir2/dir3/my

單匹配格式$

全匹配格式$

例子:[test]# echo $ 

[email protected]

[test]# echo $ 

324,2354.329.5324

[test]# echo $

324 2354.329.5324

[test]# echo $

324 2354 329 5324

[test]# echo $

324,2354,329,5324

[test]# echo $

[email=324@2354@329@5324]324@2354@329@5324[/email]

總結一點結果.${}中:

/代表字串的替換.

:代表字串的提取.

#和%公別代表左截和右截.

root@ubuntu:/home/jason# awk -f":" '' /etc/passwd

判斷當前路徑乙個檔名的檔案是否存在。

#! /bin/sh

echo "please input file name:"

read filename

if [ -f "$filename" ]; then

echo "yes"

else

echo "no"

fi

shell獲取最新檔案

背景 交易所每天發檔案給券商,但是字首一樣,名字字尾為月日,但是節假日不一定在交易日生成某些檔案,所以需要獲取同名字最新生成的檔案 引數說明 a 顯示所有檔案及目錄 開頭的隱藏檔案也會列出 l 除檔名稱外,亦將檔案型態 許可權 擁有者 檔案大小等資訊詳細列出 r 將檔案以相反次序顯示 原定依英文本母...

python建立新檔案 python建立和刪除檔案

usr bin python coding utf 8 指定編碼格式,python預設unicode編碼 import os directory dir os.chdir directory 切換到directory目錄 cwd os.getcwd 獲取當前目錄即dir目錄下 print curre...

Linux 修改檔案時間及建立新檔案

檔案時間 modification time mtime 當該檔案的 內容資料 更改時,就會更新這個時間。內容資料指的是檔案的內容,而不是檔案的屬性或許可權 status time ctime 當該檔案的 狀態 改變時,就會更新這個時間,舉例來說,像是許可權與屬性被更改了都會更新這個時間 acces...