我能做到這一點在命令行上,而不是KSH腳本
這裏面有一個簡單,便攜,可靠的使用定界符解決方案。
#!/usr/bin/env ksh
workfile=abc.txt
outfile=out.txt
IFS= read -r Header <<'EOF'
abc def|ghi jul
EOF
IFS= read -r command <<'EOF'
grep -Fxv "$Header" "$workfile" > "$outfile"
EOF
eval "$command"
說明:
(註釋不能被添加到上面的腳本,因爲它們會影響在定界符線)
IFS= read -r Header <<'EOF' # Line separated literal strings
abc def|ghi jul # Set into the $Header variable
EOF # As if it were a text file
IFS= read -r command <<'EOF' # Command to execute
grep -Fxv "$Header" "$workfile" > "$outfile" # As if it were typed into
EOF # the shell command line
eval "$command" # Execute the command
的上面的例子與稱爲的文本文件相同頭。TXT,其中包含的內容:abc def|ghi jul
和鍵入以下命令:
腳本除了命令行操作不同作爲結果的定界符地址問題引用/擴展/轉義問題。
一個字謹慎關於eval
:
在這個例子中使用的eval
是具體的。請參閱Eval command and security issues以瞭解有關eval
如何被濫用以及可能導致非常有害的結果的信息。
更多詳細內容/備用實例:
爲了完整,清楚,並且這一概念適用於其它情況的能力的緣故,有關定界符和替代示範的一些說明:
這在這個例子中,定界符的實施是SP ecifically設計有以下條件:
- 文字的內容串分配到變量(使用'EOF')
- 使用eval命令的評估和執行heredoc本身內的引用變量。
文件或定界符?使用定界符與的grep -F(fgrep
)相結合的
優勢之一,是把腳本的一部分,就好像它是一個普通文件的能力。
案例文件:
- 你要經常粘貼「模式」行到該文件,並根據需要將其刪除,而不必修改腳本文件。
案例定界符:
- 你在特定的文件已經存在的環境中應用的腳本,你要反對它匹配特定的確切文字圖案。
例子:
這種情況適合這個問題中解決的情況類型。我可以在這個答案中使用的樣板從上面的代碼並修改它如下:
#!/usr/bin/env ksh
workfile=/etc/fstab
IFS= read -r Header <<'EOF'
/dev/xvda1/ ext3 errors=remount-ro,noatime,barrier=0 0 1
EOF
IFS= read -r command <<'EOF'
grep -Fxv "$Header" "$workfile"
EOF
eval "$command"
這將給我一個新的fstab
文件,沒有包含在定界符行。
當人們試圖建立一個變量'$ cmd'然後「運行它」時,通常是因爲他們試圖做一些shell可以通過不同的路徑解決的問題。你真的**需要運行'$ command'嗎?我會重新集中努力獲得一個正常的shell腳本,然後決定是否真的需要這種額外的間接級別。並且不清楚'$ header'中的'|'字符。在grep註冊表中,代表'OR';在殼中,當然,它是一個「管道」。所以這裏有幾個問題還不清楚。更新你的Q(或者改變你的這個問題的策略)。祝你好運。 – shellter
如果答案解決了您的問題,請點擊旁邊的大號複選標記(✓)並選擇性地對其進行投票(增加投票需要至少15個聲望點)才能接受答案。 如果您發現其他答案有幫助,請投票給他們。接受和投票有助於未來的讀者。請參閱[相關幫助中心文章](http://stackoverflow.com/help/someone-answers)。如果您的問題尚未得到充分解答,請提供反饋。如果您覺得自己找到了最佳解決方案,請將其作爲答案和自我接受。 – mklement0