我不知道如何用变量执行命令并得到结果。
我有很多.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
。
答案 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 '{}' \;
通常,如果要使用结果,请不要解析文件名。我所知道的唯一理智的方式是
for file in ./*.[ch] ; do echo "$file" ; done
。仅适用于一个目录。xargs -0
的命令行,可能还有帮助脚本。但这非常麻烦。另外,请确保您使用的相对文件名以./
为前缀。调用mv -from -to
并不安全,但mv ./-from ./-to
是,并且做了你想要的。例如。在结合时,请使用./*.c
而不是*.c
。