我不確定如何使用csh
字串匹配語法來表達這一點。我想測試 csh 變數是否包含換行符。我基本上是在尋找:
if ($mystr !~ <pattern for strings which contain a newline character>)
編輯:在我的特殊情況下,我試圖創建一個像這樣的字串:
1234ABC
像這樣的字串會失敗:
1234ABC
-------
FOOBAR
這些是命令的輸出sed
,即sed '1d;$d'
.不確定這是否重要。
我之所以嘗試偵測換行符,而不是" -------"
為了防禦我正在解析的檔案格式的變更。 (無論如何,我認為我對文件所做的事情並不重要,因為我只是在尋找用於檢測換行符的通用解決方案。)
答案1
if ($mystr:q =~ *'\
'*) echo yes
應該可以在某些實作和版本中工作csh
(例如Debian 上的csh
和tcsh
)。在其他一些系統中(例如 Solaris 10 上的系統),您可能會運氣更好
set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes
csh
到目前為止,大多數人已經放棄嘗試編寫可靠的腳本。為什麼要csh
在本世紀使用?
這段程式碼對我有用(輸出no
)tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,color,filec
set mystr = '1234ABC\
-------\
FOOBAR'
if ($mystr:q !~ *'\
'*) then
echo yes
else
echo no
endif
請注意,如果您這樣做:
set var = `some command`
csh
將輸出的每個單字(空白分隔)儲存在陣列some command
的多個元素中var
。
和:
set var = "`some command`"
它將每個非空行儲存在陣列的元素中。
看起來無法將整個命令的輸出儲存到 中的變數中(t)csh
,因此您唯一的選擇是:
set var = "`some command`" # note that it removes the empty lines
if ($#var == 1)...
1嚴格來說,這不是真的,人們可以這樣做:
set x = "`some command | paste -d. /dev/null -`"
set var = ""
set nl = '\
'
foreach i ($x:q)
set i = $i:s/.//:q
set var = $var:q$i:q$nl:q
end
(當然,它可能不適用於所有csh
實現/版本)