如何計算字元串中某個字元出現的次數
主要問題:
編寫一個腳本,確定路徑相對於文件系統根的深度。路徑在命令行上作為參數接收。如果沒有接收到參數,則目前工作目錄被認為是路徑。如果參數不是有效路徑,則將錯誤消息列印到 stderr 並返回非零退出狀態。其他錯誤情況,例如讀取給定路徑的權限不足,應以類似方式處理。如果成功,腳本應該將深度列印到標準輸出並返回 0。
我知道如何處理錯誤情況,但我的主要問題是找到路徑的深度。我正在考慮將給定的路徑保存為字元串併計算“/”幻影的數量。我看到我可以使用這個命令來做到這一點:
grep -o "/" $PWD | wc -l
但是即使我更改了多個目錄,它也會顯示 1。我還在學習 shell 腳本,你能給我詳細介紹一下解決方案嗎?
您的文章 (
grep -o "/" $PWD | wc -l
) 中的命令將嘗試使用 grep$PWD
作為目標,而不是組成該路徑的字元串。為了達到您的預期效果,您可以這樣做
echo $PWD | grep -o "/" | wc -l
。作為替代方案,由於目標是找到路徑的深度,因此您可以計算該路徑中的目錄數量,而不是正斜杠的數量。
例如:
echo "$PWD" | tr " /" "- " | wc -w
tr
將所有空格轉換為“-”字元,將所有“/”轉換為空格。wc -w
然後計算前一個輸出中的單詞數。這樣可以確保每個目錄僅計為一個單詞,即使它們的名稱中包含空格。此外,由於我們沒有計算“/”的數量,因此在根目錄檢查您的深度將指示深度為 0。
- 範例 1:
$ pwd /tmp/test directory $ echo "$PWD" | tr " /" "- " | wc -w 2
- 範例 2:
$ pwd / $ echo "$PWD" | tr " /" "- " | wc -w 0
grep -o "/" $PWD
會將 的內容PWD
作為要讀取的文件的名稱。看起來它應該給您一個錯誤,因為在許多系統上,您無法像讀取文件一樣讀取目錄。(除了可能在某些系統中您仍然可以,但這裡的內容不會很有用。)而是使用
printf "%s\n" "$PWD" | grep -o / | wc -l
. 在 ksh/Bash/zsh/yash 中,您可以使用內置的替換運算符來刪除除斜杠之外的任何內容,然後計算字元數:s=$PWD; s=${s//[^\/]}; num=${#s}
使用
zsh
,您可以將其縮短為num=${#PWD//[^\/]}
。或者,使用標準工具:
printf %s "$PWD" | LC_ALL=C tr -dc / | wc -c
.