Bash 在Unix中不同时写入文件
变量中有字符串,我想将其从变量写入文件,但前提是此字符串和文件内容不同。您可以使用以下脚本:Bash 在Unix中不同时写入文件,bash,file,unix,Bash,File,Unix,变量中有字符串,我想将其从变量写入文件,但前提是此字符串和文件内容不同。您可以使用以下脚本: string="foo" # Use diff to check if the file's content and the variable differ # <(...) is called "process substitution" diff file <(cat <<< "$string") # diff returns 0 if both inputs ar
string="foo"
# Use diff to check if the file's content and the variable differ
# <(...) is called "process substitution"
diff file <(cat <<< "$string")
# diff returns 0 if both inputs are the same
[ $? -ne 0 ] || cat <<< "$string" > file
string=“foo”
#使用diff检查文件的内容和变量是否不同
#>echo hello world>文件
>>cat文件
你好,世界
>>str=“你好,世界”
>>如果[“$(diff file),则必须将文件内容存储在变量中,并检查变量是否相同。例如:
[[ "$var" != "$checkvar" ]] && echo "$var" >> file || echo "content same"
测试:
现在,如果文件很大,有很多行,那么这将变得更加混乱和复杂。变量中需要有显式的新行
$ var=jaypalsingh$'\n'jaypal # Variable with new line
$ echo "$var"
jaypalsingh
jaypal
$ cat file
jaypalsingh
jaypal
$ checkvar=$(<file)
$ [[ "$var" != "$checkvar" ]] && echo "$var" >> file || echo "content same"
content same
$var=jaypalsingh$'\n'jaypal#带新行的变量
$echo“$var”
杰帕尔辛格
杰帕尔
$cat文件
杰帕尔辛格
杰帕尔
$checkvar=$(>文件| |回显“内容相同”
内容相同
在[..]]周围加引号
是不需要的,但此处的使用将防止出现注释中建议的元字符。他还就echo
的使用提出了另一个有效的观点。printf
将更适合在此处生成变量。为什么不直接编写它?是否需要保持修改时间不变?另外,请e显示您当前的尝试。@Levlevsky这可能是answer@LevLevitsky一般来说,您是对的,但在这种情况下,每次写入此文件时,我还必须连接网络接口。因此,我希望在必要时写入文件,但感谢您的评论。@user1825271该评论将此问题深入了”我们需要更多信息“territory”。问题已解决。我想感谢大家的帮助。这三个想法都很好。再次感谢:)这将查找名为foo
的文件,并且不会将文件内容与字符串“foo”进行比较“+1表示最正确。您也可以使用diff-q
或cmp
来避免生成完整的修补程序,并且可以选择只在同一行上执行&
,而不是单独检查$?
谢谢您的建议!它们都是+1:)…我将保留我的答案,以便让其他人看到如何通过您的建议来改进它。(尽管在您告诉我之后,差异和最终的cat不在一行-加上| |-看起来不再令人满意…)如果str=“-n”
,str=“*”
或str=“foo bar”,这是行不通的
@另一个人感谢你的提示,你有没有找到一种方法来挽救我的解决方案,使其能够正确处理这种特殊情况?你可以使用printf“%s\n”$str而不是echo$str
@另一个人谢谢你。每天学习新东西。:@thatotherguy谢谢,添加了引号。+1感谢他是一个纯粹的bash。然而,像这样使用echo
意味着如果var='-n'
@thatotherguy又一次提出了一个好的观点。:)
已经添加了一个关于这一点和使用printf的可能性的注释
。非常感谢您的反馈。感谢您改进了答案。此方法会使最后一行的换行符$稍有不准确(如果echo“$var”>>文件
发生IO故障,也可能会出现另一个问题。不太可能,但如果发生这种情况,可能会导致echo“内容相同”
被调用。在这种情况下,true
操作行可能出现错误时,使用if..else
语句会更好。像[[case]]&&true | | false
这样的表单在Bash中是可以接受的快捷方式,但在我看来,这一次表单是一个肮脏的表单。
$ var=jaypalsingh # Create a variable
$ cat file # Content of the file
jaypalsingh
$ checkvar=$(<file) # Add the content of the file to variable
$ [[ "$var" != "$checkvar" ]] && echo "$var" >> file || echo "content same"
content same
$ var=jaypal
$ [[ "$var" != "$checkvar" ]] && echo "$var" >> file || echo "content same"
$ cat file
jaypalsingh
jaypal
$ var=jaypalsingh$'\n'jaypal # Variable with new line
$ echo "$var"
jaypalsingh
jaypal
$ cat file
jaypalsingh
jaypal
$ checkvar=$(<file)
$ [[ "$var" != "$checkvar" ]] && echo "$var" >> file || echo "content same"
content same