执行包含 Bash 变量的命令并存储结果
我不知道如何使用变量执行命令并获取结果。 我有许多 .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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果您需要首先对数据进行某种转换,您可以使用以下语法“捕获”输出:
这里还有一个陷阱:如果您要存储大量带有潜在空格或其他麻烦的数据中的字符,请务必始终引用该变量(
"$result"
而不是$result
),以确保它被视为单个字符串。If you need to do some kind of transformation on the data first, you can "capture" output with the following syntax:
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.我会这样做:
这会动态创建备份,并处理带有空格(不是换行符)的文件。
I'd do as such:
This creates backups on the fly and also handles files with whitespace (not newline characters).
这是一个甚至可以处理换行符的解决方案:
通常,如果要使用结果,则永远不要解析文件名。我知道的唯一明智的方法是
for file in ./*.[ch] ;执行 echo "$file" ;完成
。只适用于一个目录。-exec
结合使用-print0
(将文件名打印为 \0 分隔的字符串)结合使用,并使用输出通过xargs -0
以及可能的帮助程序脚本构建命令行。不过,这相当麻烦。另外,请确保您使用的相对文件名以
./
为前缀。调用mv -from -to
并不安全,但mv ./-from ./-to
是安全的,并且可以执行您想要的操作。例如,当进行通配时,请使用./*.c
而不是*.c
。Here is a solution that even handles newlines:
Generally, never parse filenames if you are going to use the results. The only sane ways I know of are
for file in ./*.[ch] ; do echo "$file" ; done
. Only works for one directory.-exec
-print0
(which prints the filenames as \0-separated strings) and use the output to build commandlines withxargs -0
and probably a helper script. This is quite cumbersome, though.Also, make sure that relative filenames you use are prefixed with
./
. Callingmv -from -to
isn't safe, butmv ./-from ./-to
is, and does what you want. E.g. when globbing, go with./*.c
rather than*.c
.