String
如果字元串包含換行符的C Shell腳本條件
我不確定如何使用
csh
字元串匹配語法來表達這一點。我想測試一個 csh 變數是否包含換行符。我基本上在尋找:if ($mystr !~ <pattern for strings which contain a newline character>)
*編輯:*在我的特殊情況下,我正在嘗試製作這樣的字元串:
1234ABC
像這樣的字元串失敗:
1234ABC ------- FOOBAR
這些是
sed
命令的輸出,即sed '1d;$d'
. 不確定這是否重要。我試圖檢測換行符而不是
" -------"
為了防禦我正在解析的文件格式的變化的原因。(無論如何,我認為我對文件所做的事情並不重要,因為我只是在尋找檢測換行符的通用解決方案。)
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`"
它將每個非空行儲存在數組的元素中。
看起來不能1將整個命令的輸出儲存到變數 in 中
(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
實現/版本)