我试图实现以下目标:
#!/bin/bash
if [ -f file2 ]; then
cat file2 > file1
sed -i 's#some operation' file1
cat file3 >> file1
exit 0
elif [ ! -f file2 ]; then
cat file1 > file2
sed -i 's#some operation' file1
cat file3 >> file1
exit 0
else
echo "something"
exit 1
fi
任何想法如何更简单? 没有使用那么多猫和文件?
谢谢!
答案 0 :(得分:2)
原始问题:
cat file1 > file1.bak
sed -i 's# some operation' file1.bak
cat file2 >> file1.bak
echo -n > file1
cat file1.bak > file1
rm -f file1.bak
更简单的答案是(正如我在评论中所说):
sed -i 's# some operation' file1
cat file2 >> file1
对于编辑过的问题 - 更多解释。
在您的情况下:
#!/bin/bash
if [ -f file2 ]; then
...
elif [ ! -f file2 ]; then
...
else
...
fi
else
永远不会发生。 如果file1
存在并且是常规文件。 if-then
将会运行,如果您否定上述内容,则会运行elif-then
。例如。你可以将它简化为
if [ -f file2 ]; then
...
else
...
fi
现在采取行动:
在:
cat file2 > file1
sed -i 's#some operation' file1
cat file3 >> file1
与:
相同sed 's#some operation' <file2 >file1
cat file3 >> file1
和:
cat file1 > file2
sed -i 's#some operation' file1
cat file3 >> file1
没问题 - 您正在创建file1
到file2
的备份(副本)。这也可以写成cp file1 file2
。
比较这两个部分,你们都做同样的事情:
cat file3 >> file1
所以,DRY(不要重复自己) - 并在if
后执行此操作,因为这两个部分都很常见。
所以,我们得到:
if [ -f file2 ]; then
sed 's#some operation' <file2 >file1
else
cp file1 file2 #make the copy
sed -i 's#some operation' file1
fi
cat file3 >> file1
另外,
sed 's#some operation' <file2 >file1
#and
sed -i 's#some operation' file1
非常相似 - 例如sed
操作的结果始终进入file1
。此外,在else
您将file1
复制到file2
以便
cat file1 > file2
sed -i 's#some operation' file1
也可以写成
cp file1 file2
sed 's#some operation' <file2 >file1
我们得到了两个案例的缩进sed
命令,所以 - 再次干。
if [ -f file2 ]; then
: #do nothing here...
else
cp file1 file2 #make the copy
fi
sed 's#some operation' <file2 >file1
cat file3 >> file1
但do nothing
部分是不必要的,所以我们得到了:
if [ ! -f file2 ]; then
cp file1 file2 #make the copy
fi
sed 's#some operation' <file2 >file1
cat file3 >> file1
这可以使用[[ condition ]] && ...
缩短,但现在不需要。 :)
也可以非常更精确地命名您的文件。 file1
等等 - 告诉你内容。
答案 1 :(得分:0)
x = 3
def fn():
var = 'x'
g = globals()
if var in g: del g[var]
print(x)
fn()
print(x) #NameError: name 'x' is not defined