尝试在单引号 Bash 中使用变量

Posted

技术标签:

【中文标题】尝试在单引号 Bash 中使用变量【英文标题】:Trying to use a variable in Single Quotes Bash 【发布时间】:2016-11-25 07:42:22 【问题描述】:

我正在尝试在下面的这个 sn-p 中使用变量 $y,但一直遇到显示为 $y.pdf 的文件名

ls -v *.jpg | tr '\n' ' ' | sed 's/$/\ $y.pdf/' | xargs convert

我也尝试过以下方法:

ls -v *.jpg | tr '\n' ' ' | sed 's/$/\'"$y.pdf"'/' | xargs convert

ls -v *.jpg | tr '\n' ' ' | sed 's/$/\ $y.pdf/' | xargs convert

顶部的通常会失败,因为 sed 期待别的东西。最下面的只是让我的文件名 $y.pdf。

对我有什么想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

不要介意引用问题;这完全是错误的做法。只需使用for 循环即可避免各种潜在问题。

for f in *.jpg; do
    convert "$f" "$f%.jpg.pdf"
done

$f%.jpg 扩展为当前文件的名称减去.jpg 扩展名。

将文件合并为一个 PDF 更简单(我认为):

convert *.jpg "$y.pdf"

假设ls -v 以正确的顺序输出文件名,并且没有涉及解析ls 的任何常见问题,请使用

ls -v *.jpg > input.txt
convert @input.txt "$y.pdf"

(可能有一种方法可以避免使用临时文件,可能就像ls -v *.jpg | convert @- "$y.pdf" 一样简单,但是我懒得弄清楚可以调用convert 的所有方法。)

【讨论】:

我很确定我不想要这个,只是因为我想将多个 .jpg 文件合并到一个 PDF 中,而不是将每个 .jpg 合并到一个 pdf 中。 要更新 chepner 的编辑,不幸的是没这么简单。不过,也许有更好的方法。简而言之,我将多个 jpg 合并到一个 PDF 中。这里的问题是我有大约 10,000 个文件。每个命名的日期页面 1、日期页面 2 等。问题是由于某种原因它没有正确合并它们,因为它正在进入第 1 页、第 10 页、第 2 页、第 20 页等。这就是为什么我m 使用 ls -v。我四处寻找,发现this。 在他的第三次编辑中……确实奏效了。我认为我之前所做的是将 input.txt file.pdf 转换为试图将 input.txt 转换为 pdf 的操作。我想我错过了@。谢谢! 关于为什么排序如此奇怪的旁注: ls 以这种方式输出它们,你可以说,它在按字母顺序排序后输出文件(1 在 2 之前,因此首先是所有内容以 1 开头 (1, 10, 11, ...)。

以上是关于尝试在单引号 Bash 中使用变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在单引号字符串中使用变量?

如何在单引号字符串中使用变量?

单引号是不是将反斜杠视为 bash 脚本中的特殊字符?

如何在单引号内使用单引号?

在 Bash 中的命令中扩展单引号内的变量

在 Bash 中的命令中扩展单引号内的变量