执行包含 Bash 变量的命令并存储结果

发布于 2024-12-18 19:20:45 字数 440 浏览 0 评论 0原文

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

所以我做:

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

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

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

并存储结果,因为 iconv 打印到标准输出。

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

echo $result

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

I don't know how to execute a command with a variable and get the result of this.
I have many .h and .c files and I need convert each from ISO-8859 to UTF-8.

So I make:

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

And in my script, the filename is in variable $1. Now I need to perform

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

and store result of this, because iconv prints to stdout.

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

echo $result

This seems to be not working, because it gives me some mismatch instead of converted $1.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

锦爱 2024-12-25 19:20:45

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

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

这里还有一个陷阱:如果您要存储大量带有潜在空格或其他麻烦的数据中的字符,请务必始终引用该变量("$result" 而不是 $result),以确保它被视为单个字符串。

If you need to do some kind of transformation on the data first, you can "capture" output with the following syntax:

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

There is a gotcha here as well: if you are going to be storing large amounts of data with potential whitespace or other meddlesome characters in it, be sure to always quote the variable ("$result" instead of $result) to ensure it gets treated as a single string.

贱贱哒 2024-12-25 19:20:45

我会这样做:

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

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

I'd do as such:

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

This creates backups on the fly and also handles files with whitespace (not newline characters).

菊凝晚露 2024-12-25 19:20:45

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

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

通常,如果要使用结果,则永远不要解析文件名。我知道的唯一明智的方法是

  1. 使用 shell glob,例如 for file in ./*.[ch] ;执行 echo "$file" ;完成。只适用于一个目录。
  2. find-exec 结合使用
  3. 使用“find”与 -print0 (将文件名打印为 \0 分隔的字符串)结合使用,并使用输出通过 xargs -0 以及可能的帮助程序脚本构建命令行。不过,这相当麻烦。

另外,请确保您使用的相对文件名以 ./ 为前缀。调用 mv -from -to 并不安全,但 mv ./-from ./-to 是安全的,并且可以执行您想要的操作。例如,当进行通配时,请使用 ./*.c 而不是 *.c

Here is a solution that even handles newlines:

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

Generally, never parse filenames if you are going to use the results. The only sane ways I know of are

  1. Use shell globs, e.g. for file in ./*.[ch] ; do echo "$file" ; done. Only works for one directory.
  2. Use find in combination with -exec
  3. Use 'find' in combination with -print0 (which prints the filenames as \0-separated strings) and use the output to build commandlines with xargs -0 and probably a helper script. This is quite cumbersome, though.

Also, make sure that relative filenames you use are prefixed with ./. Calling mv -from -to isn't safe, but mv ./-from ./-to is, and does what you want. E.g. when globbing, go with ./*.c rather than *.c.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文