我想創建一個目錄,其中有一堆使用 for 回圈的文本檔案。這是我的代碼:
#!/bin/bash
echo "enter the nums: "
read num1 num2
for (( counter=0; counter<$num2; counter ))
do
if [ $num1 -lt 10 ] && [ $num2 -lt 10 ];
then
mkdir $num1 && touch $num1/$num1$num2.txt
echo "$num1""$num2" > $num1/$num1$num2.txt
else
echo "you weren't supposed to do that"
fi
done
例如,如果用戶輸入:“2 9”,我想發生什么
創建一個名為 2 的目錄,在其中創建名為 290.txt、291.txt、292.txt... 的文本檔案,直到 299.txt。
相反,現在發生的是它創建目錄并給出目錄已經存在的錯誤。我不知道下一步,請幫助。
uj5u.com熱心網友回復:
這里最大的問題是你在回圈中做的事情實際上只應該做一次。具體來說,您遇到的錯誤是因為它每次都嘗試通過回圈創建目錄,但您只能創建一次。此外,如果用戶輸入的數字太大,它會列印多條錯誤訊息(例如,如果num2輸入為 500,它將列印 500 條錯誤訊息)。您需要在回圈之前進行一次錯誤檢查和創建目錄。
第二個問題是您沒有添加$counter到檔案名,因此如果用戶輸入“2 9”,它將創建一個名為29.txt9 次的檔案。
您還有一些更小的問題:通常,錯誤訊息應該列印到標準錯誤而不是標準輸出(您可以使用 重定向它們>&2),如果出現錯誤,腳本應該以非零狀態退出。此外,您應該(幾乎總是)在變數參考周圍加上雙引號,以避免在變數為空白或包含空格或其他一些東西時出現奇怪的結果。touch在寫入檔案之前您也不需要檔案(> somefile如果檔案不存在,則使用將創建檔案)。
修復了這些問題(以及一些風格上的調整),這就是我得到的:
#!/bin/bash
echo "enter the nums: "
read num1 num2
if ! [ "$num1" -lt 10 ] || ! [ "$num2" -lt 10 ]; then
echo "you weren't supposed to do that" >&2 # message send to stderr
exit 1 # exit with error status
fi
mkdir "$num1" || exit $? # if mkdir fails, exit with its error status
for (( counter=0; counter<$num2; counter )); do
echo "${num1}${num2}" > "${num1}/${num1}${num2}${counter}.txt"
done
順便說一句,! [ "$num1" -lt 10 ]測驗可能看起來有點奇怪;為什么不直接使用[ "$num" -ge 10 ]?我是這樣做的,以防萬一$num1和/或$num2不是一個有效的數字,在這種情況下,-lt和-ge測驗都會失敗;使用否定測驗會導致錯誤而不是成功。
uj5u.com熱心網友回復:
我不精通 bash 或任何東西,但它看起來像是mkdir $num1在每個回圈中呼叫。首先找出目錄是否存在。
uj5u.com熱心網友回復:
這個給你!更改 if 和 for 陳述句的父子節點:
#!/bin/bash
echo "enter the nums: "
read num1 num2
if [ $num1 -lt 10 ] && [ $num2 -lt 10 ]; then
mkdir $num1
for i in $(seq 0 $num2); do
touch $num1/$num1$num2$i.txt
echo "$num1""$num2""$i" > $num1/$num1$num2$i.txt
done
else
echo "you weren't supposed to do that"
fi
uj5u.com熱心網友回復:
在 bash 中取消參考變數的正確方法是${variable}. 如果您只使用$var您將多次創建具有相同指標的目錄,這就是您可能收到錯誤的原因。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/407351.html
標籤:
上一篇:如何添加從管道出來的字串
