將命令儲存在文件中
我正在嘗試將命令儲存在一個文件中,所以我可以輕鬆地呼叫該文件並使用下面的程式碼;
./test
我需要執行這段程式碼;
Set n=0 ; foreach sql ( *_*.sql) foreach? sed “s/_/-/g” $sql foreach? @ n ++ foreach? End echo You changed $n files
我輸入以下內容;
set n = 0 > test foreach sql ( *_*.sql) >> test
當我到達這一點時,我在終端中出現了一個空白行,所以我輸入了以下 3 行盲;
foreach? sed “s/_/-/g” $sql foreach? @ n ++ foreach? End
然後我完成:
echo 'echo You changed $n files' >> test
一旦我完成輸出文件只包含這個:
foreach? sed "s/_/-/g" $sql foreach? @ n ++ foreach? end echo You changed $n file
完全錯過了 set 命令和 foreach 循環的開始。我在這裡想念什麼?還是不可能?
已編輯
#!/bin/tcsh set n=0 foreach sql ( *_*.sql ) sed "s/_/-/g" $sql @ n ++ end echo You changed $n files chmod 777 test
您的腳本中仍然存在多個問題。
首先,文本編輯器是99% 的時間創建腳本*的正確方法。*使用 echo 命令逐行手動建構它很乏味,而且根本沒有任何優勢。(另外 1% 涵蓋了您使用的系統沒有您熟悉的編輯器的情況,或者有充分理由使用程序自動生成腳本的情況,這兩種情況都不適用於您的案子。)
第一行應該是
#!/bin/tcsh -f
,不是#!/bin/tcsh
。-f
告訴它不要獲取您的啟動文件(,.tcshrc
,.cshrc
).login
,因此您的腳本將是獨立的。缺少-f
可能不會導致任何問題,但擁有它是一種很好的做法。(注意:這不適用於sh
或bash
腳本;對於那些外殼,-f
完全意味著其他東西。)這一行:
sed "s/_/-/g" $sql
讀取每個文件,將所有下劃線更改為連字元 - 但輸出寫入標準輸出,而不是返回輸入文件。文件本身沒有改變。由於您稍後會這樣做:
echo You changed $n files
我想這不符合你的計劃。
就地修改文件實際上相當棘手。我會做這樣的事情:
sed "s/_/-/g" $sql > $sql.tmp && mv $sql.tmp $sql
這會修改文件
$sql
,將修改後的版本寫入臨時文件。 如果成功,則將臨時文件重命名為$sql
.還有一個
-i
選項sed
可以做類似的事情;另一種方法是:sed -i.bak "s/_/-/g" $sql
縮進是你的朋友。
foreach
和行之間的所有內容都end
應該縮進以顯示程式碼的結構。(我自己使用 4 個空格;有些人喜歡不同數量的空格,或者使用製表符。)最後,
chmod 777 test
不應該在test
腳本本身中。您需要從命令行執行該命令,以使test
腳本可執行。而且777
是個壞主意;它使您的腳本對系統上的每個人都可讀、可執行和可寫。改為使用chmod +x test
。確保通過鍵入來執行腳本
./test
,而不僅僅是test
. (您的問題表明您已經這樣做了。)否則,您可能會執行內置test
命令而不是腳本。test
只要您 (a) 始終使用語法./test
來呼叫它,並且 (b) 您.
的$PATH
.如果您要編寫大量腳本,則應考慮使用
sh
orbash
而不是csh
ortcsh
。 這篇文章解釋了原因。最後(這可能是這裡最重要的一課),您實際上並沒有告訴我們您要做什麼。我想你想修改某些文件的內容,用連字元替換下劃線。或者你想改變他們的名字而不是他們的內容?無法確定您正在嘗試做什麼,因為您向我們展示的只是一段不起作用的程式碼。向我們展示不工作的程式碼並沒有錯,但是除非您用英語告訴我們您要完成的工作,否則我們無法建議您如何修復它。
從 shell 命令行嘗試你正在做的事情充滿了問題。您必須
echo
重定向每一行,並且必須引用任何 shell 元字元,以免它們被目前 shell 解釋,而不是將其放入您正在創建的文件中。您最好使用文本編輯器來編輯您的test
文件並直接在那裡輸入 shell 命令。