use*_*786 8 linux bash shell awk sed
我写了一个简单的脚本,它正在读取文件内容并在该文件中增加一个数字,然后我使用awk保持更改,当我尝试使用'>'重定向新的String时,整个字符串被重定向到一个线和不像原来的是4行.
#!/bin/bash -x
# This script is for Incrementing build numbers
path=/home/RND/abrodov
file=tst.txt
tst=`cat $path/$file`
printf "this is the content of the file before incrementing: \n $tst"
newexpr=`awk '/^Build Number/{$4=$4+1;}1' /home/RND/abrodov/tst.txt`
printf "\n the new content \n $newexpr"
echo $newexpr > $path/$file
Run Code Online (Sandbox Code Playgroud)
这是运行脚本之前的原始文件:
Major Release Number = 4
Minor Release Number = 1
Service Pack Release Number = 2
Build Number = 22
Run Code Online (Sandbox Code Playgroud)
这是我使用脚本后的内容:
Major Release Number = 4 Minor Release Number = 1 Service Pack Release Number = 2 Build Number = 23
Run Code Online (Sandbox Code Playgroud)
我试图找出如何以4行的原始格式重定向文本.
Tom*_*ech 17
您需要用双引号包装变量:
echo "$newexpr" > "$path/$file"
Run Code Online (Sandbox Code Playgroud)
$path/$file
在这种情况下,周围的报价实际上并不是必需的,但它们没有任何危害.
更一般地说,你也应该使用$( )
而不是反引号:
newexpr=$(awk '/^Build Number/{$4=$4+1;}1' "$path/$file")
Run Code Online (Sandbox Code Playgroud)
如果要实现"就地"更改文件的效果,则无需使用变量.你可以使用这样的临时文件:
awk '/^Build Number/{$4=$4+1;}1' "$path/$file" > /tmp/file && mv /tmp/file "$path/$file"
Run Code Online (Sandbox Code Playgroud)
双引号保留了数据的原始格式.请参阅此简单示例,该示例set -x
用于激活调试模式.shell正在执行的命令显示在以+
.开头的行上.其实我看到你已经在使用了#!/bin/bash -x
.set -x
做同样的事情.:
$ s="1
> 2"
$ set -x
$ echo $s
+ echo 1 2
1 2
$ echo "$s"
+ echo '1
2'
1
2
Run Code Online (Sandbox Code Playgroud)
原始字符串包含换行符,但如果echo
没有引号,则将其解释为两个参数echo
,而不是包含换行符的一个参数.这称为场分裂.通过阅读本维基文章,您可以了解更多关于使用双引号的重要性.