Tcsh

將命令儲存在文件中

  • March 7, 2012

我正在嘗試將命令儲存在一個文件中,所以我可以輕鬆地呼叫該文件並使用下面的程式碼;

./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可能不會導致任何問題,但擁有它是一種很好的做法。(注意:這不適用於shbash腳本;對於那些外殼,-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.

如果您要編寫大量腳本,則應考慮使用shorbash而不是cshor tcsh這篇文章解釋了原因。

最後(這可能是這裡最重要的一課),您實際上並沒有告訴我們您要做什麼。我你想修改某些文件的內容,用連字元替換下劃線。或者你想改變他們的名字而不是他們的內容?無法確定您正在嘗試做什麼,因為您向我們展示的只是一段不起作用的程式碼。向我們展示不工作的程式碼並沒有錯,但是除非您用英語告訴我們您要完成的工作,否則我們無法建議您如何修復它。

從 shell 命令行嘗試你正在做的事情充滿了問題。您必須echo重定向每一行,並且必須引用任何 shell 元字元,以免它們被目前 shell 解釋,而不是將其放入您正在創建的文件中。您最好使用文本編輯器來編輯您的test文件並直接在那裡輸入 shell 命令。

引用自:https://unix.stackexchange.com/questions/33525