Shell括号和引号

时间:2012-08-16 00:28:06

标签: linux shell

find /ABC/ \
    -type f \
    -exec \
    sh -c  ' if [  echo "1" > ${1} ] ; then   if [ "$(cat ${1})" != "1" ]; then [ echo ${1} ]  ; fi ; fi ' _ {} \;

我的剧本想要这样做:

查找文件夹中的所有文件。将1写入文件。检查“1”是否写得不正确。打印此文件的名称。

在。我做了两个步骤。 (1)写(2)读取检查。 现在我将这两个结合起来。因为我想在写完一个文件后立即检查。

但我的剧本现在出了点问题。 需要帮忙。 谢谢。 它给出了我的错误:

sh: 1: unknown operand

我觉得有些东西不匹配/因为我对shell没有经验。需要你帮忙

2 个答案:

答案 0 :(得分:1)

if [  echo "1" > ${1} ] ; then

[是一个普通的命令。它几乎每个sh内置,但它仍然正常解析。所以> ${1}表示“将输出重定向到名称作为参数传递的文件”。如果要比较两个数字,请使用-gt运算符:

if [ 1 -gt "$1" ]; then …

如果要将1写入文件,请使用echo命令,而不是[ … ]这是条件命令(也可以在{{1}名称下调用}):

test

请注意,如果if echo 1 >"$1"; then … 成功,那么该文件可能确实包含您放在那里的文本。这不会发生的唯一时间是:

  • 如果echo 1 >"$1"是特殊文件,例如管道或设备(由于它们不会被$1匹配而不会发生);
  • 如果你在一个特殊文件系统上生活,你从文件中读取的内容不是最后写入的内容 - 这将是一个奇怪的文件系统,而不是用于磁盘存储的文件系统;
  • 如果其他一些程序在此期间修改了文件,由于时间窗口不太可能,这不太可能。

答案 1 :(得分:0)

试试这个:

 find . -type f -exec sh -c 'echo "1" >> "${1}"; if [ "$(cat ${1})" != "1" ]; then echo "${1}" ; fi' _ {} \;

我没有测试你的命令,因为它从一开始看起来不正确。

但有几点说明:

echo "1" > "${1}"会破坏文件。如果要追加,请使用>>

[是一个命令(也称为test

then [ echo ${1} ]错误地使用此测试。你不需要在这里进行测试。

根据其他答案,您不需要if [ echo...,所以我完全接受了if测试。