BASH脚本 - 执行带变量和存储结果的命令

时间:2011-11-29 22:37:10

标签: bash shell unix

我不知道如何用变量执行命令并得到结果。 我有很多.h.c个文件,我需要将每个文件从ISO-8859转换为UTF-8。

所以我做了:

ls | grep "\.[ch]" | xargs myscript.sh

在我的脚本变量$1中是文件名。现在我需要执行

iconv -f ISO-8859 -t UTF-8 $1

并存储此结果,因为iconv打印到stdout。

result=`iconv -f ISO-8859 -t UTF-8 $1`

echo $result 

这似乎不起作用,因为它给了我一些不匹配而不是转换$1

3 个答案:

答案 0 :(得分:6)

如果您需要先对数据进行某种转换,可以使用以下语法“捕获”输出:

result="$(iconv -f ISO-8859 -t UTF-8 $1)"

此处还有一个问题:如果您要存储大量具有潜在空白或其他有问题的字符的数据,请务必始终引用变量("$result"而不是{{1确保将其视为单个字符串。

答案 1 :(得分:3)

我会这样做:

while read filename; 
do
    mv "$filename" "$filename.bck" && \
        iconv -f ISO-8859 -t UTF-8 "$filename.bck" > "$filename"
done < find -iname '*.[hc]'

这可以动态创建备份,还可以处理带有空格的文件(不是换行符)。

答案 2 :(得分:3)

这是一个甚至可以处理换行的解决方案:

find -name '*.[ch]' \
    -exec mv '{}' '{}.backup' \; \
    -exec iconv -f ISO-8859 -t UTF-8 '{}.backup' -o '{}' \;

通常,如果要使用结果,请不要解析文件名。我所知道的唯一理智的方式是

  1. 使用shell globs,例如for file in ./*.[ch] ; do echo "$file" ; done。仅适用于一个目录。
  2. 将find与-exec
  3. 结合使用
  4. 将find与-print0结合使用(将文件名打印为\ 0分隔的字符串)并使用输出构建带有xargs -0的命令行,可能还有帮助脚本。但这非常麻烦。
  5. 另外,请确保您使用的相对文件名以./为前缀。调用mv -from -to并不安全,但mv ./-from ./-to是,并且做了你想要的。例如。在结合时,请使用./*.c而不是*.c