目錄
- 前言
- 代碼
- 撰寫 adduser.sh 檔案
- 撰寫 readd.sh檔案
- 執行結果
- 代碼講解
- 傳參
- 對 a,b,c 的解釋
- 遞回部分
前言
作業系統:Fedora
將某目錄下面所有的檔案名后面加上所有者的名字,比如 a.txt 的所有者為 owner ,修改后為 a[owner].txt 檔案,
基本要求:
(1)使用方法:usage:程式名稱 目錄名稱,若沒有 “目錄名稱” 引數,則修改當前目錄下檔案名稱
(2)對目錄中的子目錄不做變化
(3)給出實驗結果
選作要求:
(1)對目錄中的子目錄也執行同樣功能,也就是說遞回執行
(2)將修改后的檔案的名稱復原,即將 a[owner].txt 檔案名稱改為 a.txt
本文為作者班級作業,同班同學參考借鑒的話,別直接拿本文的截圖交差啊 : )
代碼
撰寫 adduser.sh 檔案
利用 VI 編輯器編輯如下的 shell 程式,并保存名稱為 adduser.sh 檔案
呼叫命令為
./adduser.sh #當前目錄下檔案名稱
./adduser.sh Desktop #當前目錄下的Desktop目錄下檔案名稱
./adduser.sh Desktop 1 #當前目錄下的Desktop目錄及其子目錄下檔案名稱(包括子目錄的子目錄)(0:則不修改子目錄)
adduser.sh 檔案內容
#!/bin/bash
function adduser()
{
test $2 -ne 2 && cd $1
for eachfile in `ls`
do
a=`expr "$eachfile" : '.*\..*'` #對于沒有后綴的檔案,a=0
b=`expr "$eachfile" : '.*'` #檔案名(包括后綴)的長度
if [ $a -eq $b ];then #如果有后綴
filename=${eachfile%%.*} #檔案名
suffix=${eachfile#*.} #后綴
user="huazi"
mv $filename.$suffix $filename[$user].$suffix
else
filename=${eachfile%.*} #檔案名
user="huazi"
mv $filename $filename[$user]
if [ $2 -eq 1 ];then
if [ -d $filename[$user] ];then
local nowfile=`pwd`
adduser $filename[$user] 1
cd $nowfile
fi
fi
fi
done
}
if [ $# -eq 0 ];then
adduser 0 2
elif [ $# -eq 1 ];then
adduser $1 0
elif [ $# -eq 2 ];then
adduser $1 $2
else
echo "usage:./adduser or ./adduser p1 p2"
exit 1
fi
撰寫 readd.sh檔案
呼叫命令為
./readd.sh #當前目錄下檔案名稱
./readd.sh Desktop #當前目錄下的Desktop目錄下檔案名稱
./readd.sh Desktop 1 #當前目錄下的Desktop目錄及其子目錄下檔案名稱(包括子目錄的子目錄)(0:則不修改子目錄)
readd.sh 檔案內容
#!/bin/bash
function readd()
{
test $2 -ne 2 && cd $1
for eachfile in `ls`
do
a=`expr "$eachfile" : '.*\..*'` #對于沒有后綴的檔案,a=0
b=`expr "$eachfile" : '.*'` #檔案名(包括后綴)的長度
c=`expr "$eachfile" : '.*\[.*'` #對于沒有[]的檔案,c=0
if [ $b -eq $c -a $a -eq $b ];then #如果有后綴和[]
filename=${eachfile%[*} #檔案名
suffix=${eachfile#*.} #后綴
user="huazi"
mv $eachfile $filename.$suffix
elif [ $a -ne $b ];then #如果沒有后綴
filename=${eachfile%[*\]} #檔案名
user="huazi"
if [ $b -eq $c ];then #如果沒有后綴,但有[]
mv $eachfile $filename
fi
if [ $2 -eq 1 ];then #如果這是個檔案目錄且引數為1
if [ -d $filename ];then
local nowfile=`pwd`
readd $filename 1
cd $nowfile
fi
fi
fi
done
}
if [ $# -eq 0 ];then
readd 0 2
elif [ $# -eq 1 ];then
readd $1 0
elif [ $# -eq 2 ];then
readd $1 $2
else
echo "usage:./readd or ./readd p1 p2"
exit 1
fi
執行結果
執行前,檔案名沒帶 [user]

執行 ./adduser.sh 檔案目錄
子目錄下檔案沒變

執行 ./adduser.sh 檔案目錄 1
子目錄下檔案改變,由于 app 目錄下的檔案被執行了兩次,所以有兩個 [user]

執行 ./readd.sh 檔案目錄
子目錄下檔案沒變,第一次執行 app 下檔案的檔案名去掉一個 [user],第二次執行再去掉一個 [user]

執行 ./readd.sh 檔案目錄 1
子目錄下檔案改變,由于 app 目錄下的檔案沒有 [user] ,所以不變

執行 ./adduser.sh
修改當前目錄下檔案名稱,子目錄下檔案沒變

執行 ./readd[huazi].sh
改回當前目錄下檔案名稱,子目錄下檔案不變(多加一個 [huazi] ,是因為 readd.sh 的檔案名剛剛被改變了)

代碼講解
傳參
adduser.sh 檔案的最后幾行
if [ $# -eq 0 ];then
adduser 0 2
elif [ $# -eq 1 ];then
adduser $1 0
elif [ $# -eq 2 ];then
adduser $1 $2
else
echo "usage:./adduser or ./adduser p1 p2"
exit 1
fi
結合函式開頭的
test $2 -ne 2 && cd $1
這兩段代碼的功能將四種傳參的情況分類處理:
(1)./adduser.sh
不傳參,第一個引數默認當前目錄,默認不對子目錄操作
(2)./adduser.sh Desktop
第一個引數為:當前目錄下的Desktop目錄,不對子目錄操作
(3)./adduser.sh Desktop 1
第一個引數為:當前目錄下的Desktop目錄,
第一個引數為1:修改子目錄(0:則不修改子目錄)
對于 readd.sh檔案同理
對 a,b,c 的解釋
a=`expr "$eachfile" : '.*\..*'` #對于沒有后綴的檔案,a=0
b=`expr "$eachfile" : '.*'` #檔案名(包括后綴)的長度
c=`expr "$eachfile" : '.*\[.*'` #對于沒有[]的檔案,c=0
正則運算式內容
注意 `expr 中 expr 左邊的符號不是單引號,是鍵盤上方 數字1 鍵左邊哪個,為命令替換符號,一般成對出現
遞回部分
if [ $2 -eq 1 ];then
if [ -d $filename[$user] ];then
local nowfile=`pwd`
adduser $filename[$user] 1
cd $nowfile
fi
fi
注意事項:
(1)遞回呼叫函式后,要用 cd 命令把目錄切換回來
(2)不能用 cd - 命令把目錄切換回來,因為當遞回超過三層時,cd - 會切換成子目錄的子目錄
(3)nowfile 要宣告為區域變數,否則在 遞回呼叫后會被改變,導致 cd $nowfile 無法切換回來
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/273311.html
標籤:其他
上一篇:Mallet演算法及濾波器
