我在運行下面的代碼時遇到了不同的錯誤(它計算了每個用戶目錄中 .mp3 檔案的數量):
for us in /home/*
do
if [ -d $us ]
then
LT=$(find $us -name "*.jpg" -o -name "*.mp4" -o -name "*.mp3")
N_MP3=$("$LT" | grep "\.mp3$" | wc -l)
N_MP3=$($LT | grep "\.mp3$" | wc -l)
N_MP3=$(find $us -name "*.jpg" -o -name "*.mp4" -o -name "*.mp3" | grep "\.mp3$" | wc -l)
fi
done
考慮到我們在某個用戶目錄中,假設 user=ubuntu,檔案:
- 樣本.jpg
- 樣本.mp3
那么讓我們運行代碼:
(1)做“$LT” | ...,我收到訊息:
/home/ubuntu/Desktop/Songs/sample.mp3 /home/ubuntu/Desktop/Images/sample.jpg: 沒有那個檔案或目錄
這意味著執行了“$LT”命令并在我的用戶中找到了所有 .mp4、.mp3 或 .jpg 檔案,然后給出了該錯誤。
(2)做 $LT | ...,相當于$(find $us -name " .jpg " -o -name " .mp4" -o -name "*.mp3") | ...我收到訊息/home/ubuntu/Desktop/Songs/sample.mp3: Permission denied。這意味著 $LT 命令已執行,但只找到 .mp3 檔案,然后給出該錯誤。
如果我從我的 user=ubuntu 中洗掉 sample.jpg,那么在這兩種情況下我都會收到相同的錯誤訊息:/home/ubuntu/Desktop/Songs/sample.mp3: Permission denied。
我知道(但不知道為什么)我應該在 $LT 之前使用 echo 命令,但我想知道在我之前沒有使用 echo 的這些情況下發生了什么。拜托,有人可以闡明這些錯誤嗎?
uj5u.com熱心網友回復:
LT=$( ...)
您正在使用命令替換,因此您沒有存盤字串供以后重用,您正在嘗試執行 find 命令的輸出;那是行不通的。
稍微優雅一點:
function lt() { find $1 -name "*.jpg" -o -name "*.mp4" -o -name "*.mp3"; }
for us in /home/*
do
if [ -d "$us" ]; then
N_MP3=$(lt "$us" | grep "\.mp3$" | wc -l)
fi
done
uj5u.com熱心網友回復:
這是由于分詞造成的。
當你分詞時,第一個詞將成為命令名稱,其余詞將成為引數。
當你不分詞時,整個值將用作命令名稱。
Bash 會在找不到時顯示您嘗試執行的命令名稱,這就是錯誤訊息中反映這些值的原因:
$ var="foo bar baz"
$ foo bar baz
-bash: foo: command not found
$ $var
-bash: foo: command not found
$ "foo bar baz"
-bash: foo bar baz: command not found
$ "$var"
-bash: foo bar baz: command not found
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/536280.html
標籤:狂欢壳句法寻找管道
上一篇:從AD中檢索特定的用戶登錄ID
